汇编和[]中的直接内存寻址

时间:2017-02-12 10:57:33

标签: assembly nasm

我正在读这个https://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture#General-purpose_registers_.2864-bit_naming_conventions.29

直接内存寻址,它说:

.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 地址的内容吗?

2 个答案:

答案 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