[解決済み] アセンブリ言語 - sarqはコードの中で何をするのですか?
2022-02-27 11:23:35
質問
アセンブリコードをCコードに戻そうとしているのですが、sarqという操作に気づきました。qはアドレスの大きさを表すと思うのですが、sarqがアドレスに対して何をするのかがわかりません。私は、このコードが何をすると思うかについてコメントしました。
.LC0 .string "ans %d\n"
main:
.LFB0: val = -8(%rbp), result = -12(%rbp)
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movabsq $53162464113523643, %rax
movq %rax, -8(%rbp) //val(variable) address -8,inputs value in %rax
movl $0, -12(%rbp) //result(variable) address -12, inputs 0
jmp .L2 //starts loop
.L3:
movq -8(%rbp), %rax //moves value in val into rax
andl $1, %eax //dunno what eax is but adds 1 into it
xorl %eax, -12(%rbp) //compares the value of eax and result to see if they are not equal. so compares 1 to 0
sarq -8(%rbp) //does something to val?
.L2:
cmpq $0, -8(%rbp) //compares val to 0
jg .L3 //if greater, goes to L3
movl -12(%rbp), %eax //else, moves value from result into eax
movl %eax, %esi //moves eax into esi
movl $.LC0, %edi //Moves w/e $.LC0 is into edi. Based on the top, edi now holds that string?
movl $0, %eax //moves 0 into eax
call printf //print statement
leave
ret
解決方法は?
sar
は算術右シフトです。シングルオペランド形式では、オペランドを1つ右にシフトし、最上位ビットを数値の符号で埋めます。
q
は、オペランドが64ビットオペランド(クアッドワード)であることを示します。したがって
sarq -8(%rbp)
はクアッドワードを8バイト下にシフトします。
%rbp
を1つ右に配置します。
関連
-
[解決済み】なぜMIPS用のsubiオペコードは存在しないのですか?
-
[解決済み] テスト
-
[解決済み] MIPSの大、小、大
-
[解決済み] ミップスアセンブリの文字列の長さ
-
[解決済み] MIPS srlを変数で指定
-
[解決済み] なぜSet on Less ThanはALU演算なのか?
-
[解決済み] .quadディレクティブはアセンブリでどのように機能するのですか?
-
[解決済み] movsbl 命令は何をするのですか?重複
-
[解決済み] テストのポイント %eax %eax [重複]。
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン