1. ホーム
  2. assembly

[解決済み] アセンブリ言語 - 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つ右に配置します。