lea和offset之间的差异

use*_*rBI 12 x86 assembly masm tasm

ar db "Defference $"
Run Code Online (Sandbox Code Playgroud)

有什么区别

mov dx,offset ar
Run Code Online (Sandbox Code Playgroud)

lea dx,ar
Run Code Online (Sandbox Code Playgroud)

我认为两者都在做同样的工作,但这两者之间有什么区别

Nil*_*nck 15

在这个用例中,LEA和MOV做同样的事情.如果您想以更复杂的方式计算地址,LEA比MOV更强大.

例如,假设您想要获取数组中第n个字符的地址,并且n存储在bx中.使用MOV,您必须编写以下两条说明:

Mov dx, offset ar
add dx, bx
Run Code Online (Sandbox Code Playgroud)

使用lea,您只需一条指令就可以完成:

lea dx, [ar + bx]
Run Code Online (Sandbox Code Playgroud)

这里要考虑的另一件事是:该add dx,bx指令将改变CPU的状态标志.lea dx, [ar + bx]另一方面,在指令内部完成的添加不会以任何方式更改标志,因为它不被视为算术指令.

如果您想在进行一些简单计算时保留标志(地址计算非常常见),这有时会很有用.存储和恢复标志寄存器是可行的,但操作很慢.

  • "偏移ar" - 也是在翻译期间计算的立即值.而`lea`--是实际的处理器指令"Load Effective Address",第二个操作数引用memmory. (3认同)
  • @ony:“lea”只是一个移位和添加指令。它实际上从未从内存加载,它只是使用寻址模式语法和二进制编码。在OP的情况下,在绝对地址上使用“lea”,“disp16”与“mov”的“imm16”相同,两者在汇编时以相同的方式计算(实际上在链接时,最终地址为已知)。 (2认同)