在汇编中读取数学函数

3

我正在将一部分x86汇编代码翻译成C代码。其中的一个小节给我带来了麻烦。

mov %eax, %edx
sar $0x1f, %edx
idivl -0x18(%ebp)
mov %edx, %eax

我们的eax值一开始是0。然后我们通过0x1f(31)进行了移位和旋转。我知道右移相当于除以2,如果您将其移位并旋转到一个数字,会发生什么?它也是/2吗?然后,我们通过space -0x18(%ebp)处的元素进行除法,我们将其称为int x。或者idivl起作用方式不同吗?然后我们将其放回%eax寄存器中,接下来程序很容易理解。
如果需要帮助,请告诉我,我不理解的主要问题是sar指令。

我不是x86汇编的专家,但sar不是算术右移吗? - Jason Baker
这是什么?它会对数字产生什么影响?http://en.wikibooks.org/wiki/X86_Assembly/Shift_and_Rotate - OneManRiot
如果您使用的是Intel语法,根据我所找到的资料,sar $0x1f, %edx 等同于将 $0x1f 除以2,重复 %edx 次,并向负无穷方向舍入。如果您使用的是GAs语法,则相同操作中的数字会被翻转:将 %edx 除以2 $0x1f 次。 - Jason Baker
1个回答

4

这段汇编代码执行的是一个有符号32位取模运算:

a %= x;

sar指令是算术右移(即保留操作数符号的右移);看一下前两个指令:

mov %eax, %edx
sar $0x1f, %edx

这个符号将%eax的内容扩展到双寄存器%edx:%eax中;在伪C代码中:

edx_eax = (int64_t)eax;

下面的两个指令:
idivl -0x18(%ebp)
mov %edx, %eax

执行带符号的64位除法,余数存储在%edx中,然后将其转移到%eax中。伪C代码如下:

edx = (int32_t)(edx_eax % x);
eax = edx;

答案是%= x; 非常感谢! - OneManRiot

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