我在理解以下汇编代码时遇到了问题。如果你能给我一个数字的例子,看起来就像在幕后一样,那将是很棒的。
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)
我想我可能误解了萨尔和偶像,因为我的结果毫无意义......
非常感谢你的帮助!!我现在已经坐在那段代码前3个小时了^^
我想:
ecx = 0
eax = 0
eax = 0 + 1 = 1
edx = eax = 1
现在转移edx => edx = 0
现在edx:eax除以7?
为什么我不能设置edx = 0并离开sarl?那不一样吗?
答案 0 :(得分:2)
为什么我只能设置
edx
= 0并退出sarl
?那不一样吗?
不适用于已签名的部门,即idiv
。这两条指令模拟了CDQ
指令的作用:
movl %eax, %edx
sarl $31, %edx
即
"SAR
通过在操作数为正时清除空位位置并在操作数为负时设置空位来保留源操作数的符号。 "
和
"
CDQ
指令将EAX
寄存器中双字的符号(第31位)复制到EDX
寄存器中的每个位位置。CDQ
指令可用于在双字划分之前从双字产生四字红利。"
请注意,sarl
会更新一些状态标记,而cdq
则不会,因此movl
+ sarl
不会完全相同为cdq
。从代码不能简单地使用cdq
的问题中不清楚。