我正在查看一些代码,发现有两行让我感到困惑:
add -0x4(%esi,%ebx,4),%eax
cmp %eax,(%esi,%ebx,4)
我已经习惯了这个标准add src,dst
,cmp x1,x2
而且我不确定这些行实际上在做什么。
我相信它是用 GCC 编译的
那是使用 Base + (Index * Scale) + Displacement 寻址模式。至少,我是这么认为的。我对 AT&T 语法并不熟悉。我认为英特尔的语法是:
add eax,[esi + ebx*4 - 4]
cmp [esi + ebx*4],eax
这看起来像是在索引一个整数数组(4 字节值)。想象一下,在 C 语言中,您想将某个数组元素的值添加到总数中,如下所示:
int a[100];
int i = 10;
int total = 0;
total += a[i-1];
现在,esi
保持数组的地址,ebx
保持 的值i
,并eax
保持值 33。你会得到:
add eax,[esi + ebx*4 - 4]
比较指令正在测试结果 (in eax
) 是否等于数组中的下一个值。在 C 示例中,这相当于total
比较a[i]
.