You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何汇编代码中两个全局变量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成为独立变量,需要给它们分配实际内存,两种方式可选:

  1. 用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字节内存空间。

  1. 直接用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:52:34