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

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。
修复方案

二选一即可:

  1. 保留16位变量定义,读取时显式指定宽度并做零扩展,避免读到相邻内存:
    _sum20:
        movzx rax, word [total] ; 明确读取2字节字,零扩展到64位rax
        ret
    
  2. 如果你的计数逻辑本来就需要64位变量,直接把变量定义改成匹配的8字节宽度:
    section .data
        total dq 0  ; dq表示定义8字节四字变量
        index dq 1
    

内容的提问来源于stack exchange,提问作者Akari Oozora

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:36:25