【发布时间】:2012-09-30 14:33:34
【问题描述】:
在我分析的反汇编程序中,我找到了命令
sar %eax
这是做什么的?我知道带有两个参数的sar 执行右移,但我找不到只有一个参数的含义。
这个程序是为 Intel x86 处理器编译的。
【问题讨论】:
标签: assembly x86 disassembly
在我分析的反汇编程序中,我找到了命令
sar %eax
这是做什么的?我知道带有两个参数的sar 执行右移,但我找不到只有一个参数的含义。
这个程序是为 Intel x86 处理器编译的。
【问题讨论】:
标签: assembly x86 disassembly
看起来反编译器使用了SAR EAX,1 的简写,其操作码为0xD1F8。当立即数不是 1 时,也就是 SAR EAX,xx,操作码是 0xC1F8 xx,请参阅 Intel 指令参考,卷。 2B,4-353。
【讨论】:
当只有一个操作数时,隐含移位为 1。
所以....
SAR %EAX 表示已签名的%EAX >> 1
因此,
SAR %eax = SAR $1, %eax
我已经成功地证明了这一点,分析了 GDB 中的一些代码。
【讨论】:
used short-hand for SAR EAX,1 。另一个答案将输出表示为英特尔语法而不是 AT&T,但答案似乎还可以。 x86 对 4 个移位指令有一个特殊的短编码,可以在没有第二个操作数的情况下使用,或者您可以将值 1 编码为第二个操作数,这是一个执行相同操作的更长指令。
gas 会将sar $1, %eax 优化为隐式的逐一操作码,因此如果您这样编写,您不会得到低效的代码。顺便说一句,还有ror、rol、rcl 和rcr 以及shl(又名sal)、shr 和sar 的一种缩写形式.但不是shrd,这是后来添加的,只有 imm8/cl 版本。