Assembly 如何计算有效地址?

Assembly 如何计算有效地址?,assembly,x86,Assembly,X86,假设您在汇编Nasm中有此指令 MOV EAX, [label1] ; label1 is at location 0x00D5A360 你是如何计算有效地址的?在上面的位置 事实上,我知道寻址模式是直接的。在nasm中,label指的是label的地址,而[label]检索存储在那里的值。因此,您可以: mov eax, label1 ; eax <- 0x00D5A360 或者你在问汇编程序如何确定有效地址?因为这是由汇编程序(可选的是链接器和加载程序)组合处理的

假设您在汇编Nasm中有此指令

MOV EAX, [label1] ; label1 is at location 0x00D5A360
你是如何计算有效地址的?在上面的位置


事实上,我知道寻址模式是直接的。

在nasm
中,label
指的是label的地址,而
[label]
检索存储在那里的值。因此,您可以:

    mov eax, label1      ; eax <- 0x00D5A360
或者你在问汇编程序如何确定有效地址?因为这是由汇编程序(可选的是链接器和加载程序)组合处理的。通常,您的代码将编译成中间对象格式,链接器或加载程序将为您计算
label1
的有效地址。

摘自“英特尔64和IA-32体系结构软件开发人员手册:第2卷”:


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

我不熟悉Nasm。在MIPS汇编程序中,跳转到标签的命令使用相对值,即当前行和标签所在行之间的行数。NASM看起来和简单的MIPS有很大的不同,我甚至不知道这个MOV命令对标签做了什么。没有计算!32位数字(0x00D5A360)作为指令MOV EAX的第二部分,直接指向内存位置。因此,基本上你的意思是键入LEA,然后将有效地址打印到屏幕上?有没有什么手工的方法可以做到这一点,使用计算机吗?我想问的是,从汇编程序计算有效地址的方法是什么,例如,我发布的示例行MOV EAX,[label1];标签1位于位置0x00D5A360,现在有效地址为:0x00d5a360@Shawnricshawnawic当前位置那么我的第二个答案是相关的。根据nasm的环境/输出格式,它要么是静态确定的(您可以通过
ORG
指令来影响它),要么是在链接时(使用外部符号)或在运行时(再次使用外部符号)。非常感谢我了解我还学习了一种新技术“lea”加载有效地址谁会想到LOL非常感谢,我想我可以从这里处理:)
    lea eax, [label1]    ; eax <- 0x00D5A360
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