(汇编)是否可以在%eax寄存器(x64)中填入并仍然以带符号的数字结束?

时间:2016-02-25 11:04:27

标签: assembly bit-manipulation x86-64

shr将最高位设置为零。是否仍然可以以签名号码结束?我必须使用null进行cmpl并触发签名标志。

e.g。

shr %eax // I have %rax available if necessary
mov %eax -0x4(%rbp)
cmpl 0x0 -0x4(%rbp)
(then something that checks the signed flag)

编辑:抱歉不清楚;我的问题是关于是否可以将$ rax或$ eax设置为满足条件的任何内容。

2 个答案:

答案 0 :(得分:1)

由于您rax可用但cmp实际使用eax,您需要做的就是将rax的第32位转移到第31位然后成为eax的符号位:

movabsq $0x100000000, %rax
shr %rax
cmpl $0, %eax

(gdb) p/x $eax
$1 = 0x80000000
(gdb) i r eflags
eflags         0x286    [ PF SF IF ]

答案 1 :(得分:1)

在将shr的某个寄存器右移之后,其中的值始终为正。检查负数是没有意义的。

如果要将shift用作除以2且想要保留结果的符号,则必须使用sar指令,即“算术右移”。该指令用与位数相同的位填充第31位,这样就保留了数字的符号。