x86汇编.data段新增字变量导致[total]读取值异常问题
故障原因
核心错误是变量定义的位宽和内存读取指令的操作数长度不匹配:
- 你用
dw伪指令定义的total、index都是16位(占2字节)的字变量,在.data段中是连续排布的:total占低地址的2字节,存值0;紧挨着的高地址2字节属于index,存值1。 - 代码中
mov rax, [total]的语义是:从total的起始内存地址开始,连续读取8字节数据写入64位寄存器rax,并不会自动只读取total本身占的2字节。
异常值来源
两种场景下的取值差异完全来自内存排布:
- 当.data段只定义
total一个变量时,total后面紧邻的6字节内存都是段初始化填充的0,连续读8字节全为0,因此rax拿到的值是0,表现为“正常”。 - 当新增
index dw 1定义后,从total起始地址开始的8字节内存排布如下(小端序环境):- 偏移0-1字节:
0x0000,属于total - 偏移2-3字节:
0x0001,属于index - 偏移4-7字节:
0x0000,为段填充零
这8字节拼接成的64位整数是0x0000000000010000,转十进制正好是你观测到的65536。
- 偏移0-1字节:
修复方案
二选一即可:
- 保留16位变量定义,读取时显式指定宽度并做零扩展,避免读到相邻内存:
_sum20: movzx rax, word [total] ; 明确读取2字节字,零扩展到64位rax ret - 如果你的计数逻辑本来就需要64位变量,直接把变量定义改成匹配的8字节宽度:
section .data total dq 0 ; dq表示定义8字节四字变量 index dq 1
内容的提问来源于stack exchange,提问作者Akari Oozora
相关产品推荐
相关产品推荐

