我在分析一个反汇编程序时,发现了以下命令:
sar %eax
这是做什么用的?我知道带两个参数的 sar
会执行右移,但我不知道带一个参数代表什么意思。
这个程序是为 Intel x86 处理器编译的。
我在分析一个反汇编程序时,发现了以下命令:
sar %eax
这是做什么用的?我知道带两个参数的 sar
会执行右移,但我不知道带一个参数代表什么意思。
这个程序是为 Intel x86 处理器编译的。
看起来反汇编器使用了缩写形式的SAR EAX,1
,它的操作码是0xD1F8
。当立即数不为1时,也就是SAR EAX,xx
时,操作码是0xC1F8 xx
,请参考英特尔指令参考手册,Vol. 2B,4-353。
当只有一个操作数时,隐含的移位为1。
所以...
SAR %EAX
意味着带符号的 %EAX >> 1
因此,
SAR %eax = SAR $1, %eax
我已成功地通过在GDB中分析代码来证明这一点。
gas
会将 sar $1, %eax
优化为隐式的一次操作码,因此如果您以这种方式编写代码,就不会得到低效的代码。另外,还有 ror
、rol
、rcl
和 rcr
的一次短格式,以及 shl
(又名 sal
)、shr
和 sar
。但是没有 shrd
,它是后来才添加的,只有 imm8/cl 版本。 - Peter Cordes