Assembly 和 [] 中的直接内存寻址
Direct memory addressing in Assembly and []
在直接内存寻址它说:
.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 中的内容吗?
科塔
基本上:
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
my_var
是一个 符号 指的是一些内存地址。指令
my_var dw 0abcdh
使汇编程序分配两个字节的存储空间,将值 0abcdh
写入其中,然后让 my_var
指向该存储空间的开头。
注释my_var = 0xabcd
想说明my_var
指向的变量有这个值。要理解这一点,请注意在像 C 这样的 high-level 语言中,当您声明一个全局变量时,变量名总是被隐式取消引用:
int foo = 1;
// compiles to
foo dw 1
I wonder, what would it copy to ax without [] if not its value which is 0xabcd?
如果不使用内存引用,则复制符号 my_var
的值,即该变量的地址。例如,
mov ax, my_var
就好像你写了
ax = &my_var;
C.
And why is it the content in the first place? Shouldn't it treat 0xabcd as a memory address and go look what's stored at the address 0xabcd instead?
没有。为此,您需要两次内存访问,因为您首先需要获取 my_var
的内容以获取 0xabcd
,然后从 0xabcd
获取内容以获取那里的内容:
mov bx,[myvar]
mov ax,[bx]
在直接内存寻址它说:
.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 中的内容吗?
科塔
基本上:
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
my_var
是一个 符号 指的是一些内存地址。指令
my_var dw 0abcdh
使汇编程序分配两个字节的存储空间,将值 0abcdh
写入其中,然后让 my_var
指向该存储空间的开头。
注释my_var = 0xabcd
想说明my_var
指向的变量有这个值。要理解这一点,请注意在像 C 这样的 high-level 语言中,当您声明一个全局变量时,变量名总是被隐式取消引用:
int foo = 1;
// compiles to
foo dw 1
I wonder, what would it copy to ax without [] if not its value which is 0xabcd?
如果不使用内存引用,则复制符号 my_var
的值,即该变量的地址。例如,
mov ax, my_var
就好像你写了
ax = &my_var;
C.
And why is it the content in the first place? Shouldn't it treat 0xabcd as a memory address and go look what's stored at the address 0xabcd instead?
没有。为此,您需要两次内存访问,因为您首先需要获取 my_var
的内容以获取 0xabcd
,然后从 0xabcd
获取内容以获取那里的内容:
mov bx,[myvar]
mov ax,[bx]