9

我只是想确保我读的是正确的:

movl 12(%ebp), %edx
leal (%edx, %edx, 4), %eax

我将第一行读为:edx = [epb + 12],第二行读为:eax = edx + edx*4

有人可以澄清吗?

另外,如果我有以下两行怎么办:

leal (%edx, %edx, 4), %eax
leal (%edx, %edx, 2), %eax

一旦执行了第二行,eax寄存器会被覆盖吗?

并且eax = edx + edx*4是将地址乘以4?还是地址内容减4?

4

2 回答 2

9

该指令的movl 12(%ebp), %edx意思是:edx = [ebp + 12]ebp + 12这是对其内容(双字)被读取到edx寄存器的地址的内存引用(读取操作) 。

该指令的leal (%edx, %edx, 4), %eax意思是:(eax = edx * 5这是 的简化eax = edx + edx * 4)。该leal指令不执行内存引用。它仅使用寄存器执行算术运算。

作为对第二个问题的回答:是的,eax将被覆盖,因为指令的leal (%edx, %edx, 2), %eax含义eax = edx * 3与第一条指令不同,eax = edx * 5.

于 2012-02-05T21:45:38.520 回答
8

你是对的。该LEA指令用于加载(该)有效地址,并且可以用于地址算术,有时也可以用于普通算术,如果您不需要标志。

于 2012-02-05T21:45:23.267 回答