如何计算有效地址?

时间:2011-10-18 00:33:43

标签: assembly x86

假设你在程序集Nasm中有这个指令

MOV EAX, [label1] ; label1 is at location 0x00D5A360

如何计算有效地址是^上面的位置。

我知道寻址模式是直接的。

2 个答案:

答案 0 :(得分:6)

在nasm label中引用标签的地址,而[label]检索存储在那里的值。所以你可以这样做:

    mov eax, label1      ; eax <- 0x00D5A360

或使用多功能lea(加载有效地址):

    lea eax, [label1]    ; eax <- 0x00D5A360

或者你在问汇编程序如何确定有效地址?因为它由汇编程序组合处理,可选地是链接器和加载器。通常,您的代码将编译为具有relocations的中间对象格式,并且链接器或加载器将处理为您计算label1的有效地址。

答案 1 :(得分:0)

来自“Intel 64和IA-32架构软件开发人员手册:第2卷”:

LEA r16, m ; Store effective address for m in register r16.
LEA r32, m ; Store effective address for m in register r32.
LEA r64, m ; Store effective address for m in register r64.

计算第二个操作数(源操作数)的有效地址,并将其存储在第一个操作数(目标操作数)中。源操作数是用处理器寻址模式之一指定的存储器地址(偏移部分);目标操作数是通用寄存器。

示例:

; indirect addressing mode
MOV EBX, label1   ; copy the address of label1 to EBX
MOV [EBX], 100    ; store 100 at the location pointed to by EBX

; using LEA
LEA EBX, [label1] ; stores the effective address of label1 in EBX
MOV [EBX], 100    ; store 100 at the location pointed to by EBX

两者之间的区别在于LEA在运行时计算有效地址,而MOV版本在汇编时解析有效地址。