首页 文章

大会sarl和idivl - 口译

提问于
浏览
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)

我想我可能误解了萨尔和偶像,因为我的结果毫无意义 .

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

我认为:

ecx = 0

eax = 0

eax = 0 1 = 1

edx = eax = 1

现在转移edx => edx = 0

现在edx:eax除以7?

为什么我不能设置edx = 0并离开sarl?那不一样吗?

1 回答

  • 2

    为什么我不能设置edx = 0并离开sarl?那不一样吗?

    不是签署的部门,这是 idiv . 这两条指令模拟 CDQ 指令的作用:

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

    那是,

    “如果操作数为正,则通过清除空位位置来保留源操作数的符号,如果操作数为负,则设置空位 . ” “CDQ指令将EAX寄存器中双字的符号(第31位)复制到EDX寄存器中的每个位位置.CDQ指令可用于在双字划分之前从双字产生四字分频 . ”

    注意 sarl 更新了一些状态标志,而 cdq 没有,所以 movl sarlcdq 不完全相同 . 它's not clear from the question why the code doesn'吨只需使用 cdq .

相关问题