Assembly language - what does sarq do in the code?
I am trying to translate assembly code back into C code but I noticed this one operation called sarq. I think q is for what size the address is but I do not know what the sarq does to the address. I commented on what I believe the code does.
.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 is an arithmetic right shift. The single operand form shifts its operand right by one place, filling the topmost bit with the sign of the number. the suffix
q indicates that the operand is a 64 bit operand (a quadword). Thus
sarq -8(%rbp) shifts the quadword eight bytes below
%rbp right by one place.