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设置为满足条件的任何内容。
答案 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位,这样就保留了数字的符号。