直接内存寻址,它说:
.data
my_var dw 0abcdh ; my_var = 0xabcd
.code
mov ax, [my_var] ; copy my_var content into ax (ax=0xabcd)
我想知道,如果不是它的值是0xabcd,它会在没有[]的情况下复制到ax?
为什么它首先是内容?它不应该将 0xabcd 视为内存地址,而是查看存储在 0xabcd 地址的内容吗?
答案 0 :(得分:4)
my_var
是一个符号,指的是某个内存地址。指令
my_var dw 0abcdh
导致汇编程序分配两个存储字节,将值0abcdh
写入其中,然后让my_var
指向该存储的开头。
评论my_var = 0xabcd
想要解释变量my_var
指向具有此值的变量。要理解这一点,请注意在C语言等高级语言中,当声明全局变量时,变量名总是被隐式解除引用:
int foo = 1;
// compiles to
foo dw 1
我想知道,如果不是它的值是0xabcd,它会在没有[]的情况下复制到ax?
如果您不使用内存引用,则会复制符号my_var
的值,即该变量的地址。
为什么它首先是内容?难道它不会将0xabcd视为内存地址,而是查看存储在地址0xabcd中的内容吗?
没有。要做到这一点,您需要两次内存访问,因为您首先需要获取my_var
的内容以获取0xabcd
,然后从0xabcd
获取以获取其中的内容:
mov bx,[myvar]
mov ax,[bx]
答案 1 :(得分:1)
Kotaa
基本上:
mov ax, my_var ; Moves the location of my_var into ax
mov ax, [my_var] ; Moves the content found at the address of my_var
到第二块问题。实际上,如果my_var
应该保存指向另一个数据块的指针,那么:
mov eax, [my_var] ; Get pointer stored at my_var
mov ebx, [eax] ; Get data from pointer whose address is in eax