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

Kot*_*taa 1 x86 assembly nasm addressing-mode

我正在阅读这个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)
Run Code Online (Sandbox Code Playgroud)

我想知道,如果它的值不是 0xabcd,它会在没有 [] 的情况下复制到 ax 吗?

为什么它首先是内容?它不应该将0xabcd视为内存地址,而是查看地址0xabcd 中存储的内容吗?

fuz*_*fuz 6

my_var是一个指向某个内存地址的符号。该指令

my_var dw 0abcdh
Run Code Online (Sandbox Code Playgroud)

使汇编器分配两个字节的存储空间,将值写入0abcdh其中,然后让my_var指向该存储空间的开头。

注释my_var = 0xabcd想说明变量my_var指向的有这个值。要理解这一点,请注意在 C 等高级语言中,当您声明全局变量时,变量名总是被隐式取消引用:

int foo = 1;
// compiles to
foo dw 1
Run Code Online (Sandbox Code Playgroud)

我想知道,如果它的值不是 0xabcd,它会在没有 [] 的情况下复制到 ax 吗?

如果不使用内存引用my_var,则复制符号的值,即该变量的地址。例如,

    mov ax, my_var
Run Code Online (Sandbox Code Playgroud)

就像你写的

    ax = &my_var;
Run Code Online (Sandbox Code Playgroud)

在 C。

为什么它首先是内容?它不应该将 0xabcd 视为内存地址,而是查看地址 0xabcd 中存储的内容吗?

不。要做到这一点,您需要两次内存访问,因为您首先需要获取my_varto get的内容,0xabcd然后从中0xabcd获取内容:

mov bx,[myvar]
mov ax,[bx]
Run Code Online (Sandbox Code Playgroud)