在X86汇编中使用SAR命令及其一个参数

32

我在分析一个反汇编程序时,发现了以下命令:

sar %eax

这是做什么用的?我知道带两个参数的 sar 会执行右移,但我不知道带一个参数代表什么意思。

这个程序是为 Intel x86 处理器编译的。

2个回答

34

看起来反汇编器使用了缩写形式的SAR EAX,1,它的操作码是0xD1F8。当立即数不为1时,也就是SAR EAX,xx时,操作码是0xC1F8 xx,请参考英特尔指令参考手册,Vol. 2B,4-353。


2
你可以在 http://download.intel.com/products/processor/manual/325383.pdf 找到参考手册。 - Jonathan Geisler

7

当只有一个操作数时,隐含的移位为1。

所以...

SAR %EAX 意味着带符号的 %EAX >> 1

因此,

SAR %eax = SAR $1, %eax

我已成功地通过在GDB中分析代码来证明这一点。


4
另一个答案哪一部分是错误的?它说“使用了SAR EAX,1的缩写”。另一个答案将输出表示为Intel语法而不是AT&T,但该答案似乎没问题。 x86有一种特殊的短编码用于4个移位指令,可以没有第二个操作数使用,或者您可以将值1编码为第二个操作数,这是一种更长的指令,执行相同的操作。 - Michael Petch
幸运的是,gas 会将 sar $1, %eax 优化为隐式的一次操作码,因此如果您以这种方式编写代码,就不会得到低效的代码。另外,还有 rorrolrclrcr 的一次短格式,以及 shl(又名 sal)、shrsar。但是没有 shrd,它是后来才添加的,只有 imm8/cl 版本。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接