在上面的页面上说
说明leal (%edx, %edx, 4), %eax
表示:eax = edx * 5
据我所知,%edx
是下一个基础%edx
是索引,4是比例
即。 DISP(碱,索引标度)。
答案 0 :(得分:3)
DISP(碱,索引标度)。
你知道这个指令是如何工作的(base + index * scale)但是你的麻烦来自于你一直认为第一个组件总是一个地址(“即内存地址中的任何地址)空间“)和第二个组件永远是一个索引(”即任何0,1,2 .....“)。
对于执行此指令的CPU,%edx
的内容可以包含您选择的任何含义!它总是只是一个数字,这正是我们使用leal (%edx, %edx, 4), %eax
等指令来计算%eax = %edx * 5
的原因。
答案 1 :(得分:2)
通常,disp(base,index,scale)
会提供地址:
base + scale * index + disp
因此,地址(%edx, %edx, 4)
被解释为
disp := 0
base := %edx
index := %edx
disp := 4
在一起,它给出了:
%edx + %edx * 4 + 0
给出了%edx * 5
。
现在,leal
用于地址分配。它将上述地址分配给%eax
,因此您获得了%eax := %edx * 5
。
这是常见的,因为缩放因子scale
只能是1,2,4,8,因此无法将%edx直接乘以5。同样,如果想获得%eax = %edx * 3
,我们必须leal (%edx, %edx, 2), %eax
。