为何汇编代码中两个全局变量a和b的内存地址相同?
为什么全局变量a和b的内存地址相同?
核心原因是你用了resw 0定义变量——这个伪指令的作用是预留指定数量的16位字(word)内存空间,当参数为0时,汇编器不会为变量分配任何实际内存,只是给a和b这两个符号标记了当前.data段的偏移位置。
因为a没有占用任何内存,定义b时地址指针完全没动,所以两个符号指向的是同一个地址。
你的代码验证
你编写的汇编代码:
section .data a resw 0 b resw 0 section .bss section .text global main main: mov rax, 0 ret
编译调试后&a和&b地址相同完全符合预期——它们本质上是同一个内存地址的不同别名。
解决方法
要让a和b成为独立变量,需要给它们分配实际内存,两种方式可选:
- 用
resw 1代替resw 0,为每个变量预留1个word(2字节)的空间:
section .data a resw 1 b resw 1 section .text global main main: mov rax, 0 ret
此时&b会比&a大2字节,因为a占用了2字节内存空间。
- 直接用
dw初始化变量值(同时完成内存分配):
section .data a dw 0 ; 分配2字节内存并初始化为0 b dw 0 section .text global main main: mov rax, 0 ret
这种方式会为每个变量分配独立的内存空间,地址自然不同。
补充说明
resw、resb这类伪指令是汇编器用来在段中预留空间的,参数为0时等于不做任何空间分配,仅记录符号的当前地址。如果只是需要一个符号地址(比如做位置标记),这种写法没问题,但如果是定义独立变量,必须指定大于0的预留数量,或者用初始化指令分配内存。
内容的提问来源于stack exchange,提问作者8n8
相关产品推荐
相关产品推荐

