Kot*_*taa 1 x86 assembly nasm addressing-mode
在直接内存寻址它说:
.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 中存储的内容吗?
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)
| 归档时间: |
|
| 查看次数: |
3874 次 |
| 最近记录: |