0

我在理解以下汇编代码时遇到问题。如果你能给我一个例子,里面有数字,这在幕后是什么样子的,那就太好了。

movl $0, %ecx
movl $0, %eax
addl $1, %eax
movl %eax, %edx
sarl $31, %edx
idivl $7
movl %edx, %eax
movl (%esp, %eax, 4), %eax
movl %eax, (%esp, %ecx, 4)

我想我可能会误解 sarl 和 idivl 因为我的结果没有意义..

非常感谢你的帮助!!我已经在那个代码前面坐了 3 个小时了^^

我认为:

ecx = 0

eax = 0

eax = 0 + 1 = 1

edx = eax = 1

现在移动 edx => edx = 0

现在 edx:eax 除以 7?

为什么我不能只设置 edx = 0 并将 sarl 排除在外?那不一样吗?

4

1 回答 1

2

为什么我不能只设置edx= 0 并忽略sarl?那不一样吗?

不适用于已签名的部门,这就是事实idiv。这两条指令正在模拟CDQ指令的作用:

movl %eax, %edx
sarl $31, %edx

那是,

SAR如果操作数为正,则清除空位位置,如果操作数为负,则设置空位,从而保留源操作数的符号。”

“该CDQ指令将寄存器中双字的符号(第 31 位)复制到EAX寄存器中的每个位位置EDX。该CDQ指令可用于在双字除法之前从双字产生四字除数。”

请注意,会sarl更新一些状态标志,而cdq不会更新,因此movl+sarl不会与cdq. 从问题中不清楚为什么代码不简单地使用cdq.

于 2014-04-22T05:04:38.163 回答