假设你在程序集Nasm中有这个指令
MOV EAX, [label1] ; label1 is at location 0x00D5A360
如何计算有效地址是^上面的位置。
我知道寻址模式是直接的。
答案 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
版本在汇编时解析有效地址。