(大会)是否可以在 %eax 寄存器 (x64) 中 shr 并且仍然以签名数字结束



shr 将最高顺序位设置为零。 仍然有可能以有符号数字结尾吗?我必须使用 null 进行 cmpl 并触发签名标志。

例如

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设置为满足条件的任何内容。

由于您有可用的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 ]

在右移一些寄存器后shr,其中的值总是正数。检查负数是没有意义的。

如果要使用 shift 除以 2 并保留结果的符号,则必须使用 sar 指令,这意味着"算术右移"。该指令用与位相同的位填充位 31,从而保留数字的符号。

最新更新