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

Nasm X86-64中Push变量入栈求和时rbx值异常问题排查

问题原因及解决方法:汇编变量宽度不匹配导致的错误读取

问题原因

  • 你定义变量时使用dw(双字,仅2字节存储空间),但执行压栈操作时用了qword(四字,读取8字节数据)。CPU会从变量地址开始读取8字节,而变量本身只有2字节有效数据,剩下6字节是内存中的随机垃圾值,这就导致弹出到rbx的是包含变量值+垃圾数据的错误数值。
  • 额外问题:你将变量放在自定义的.var_1、.var_2段,这类非标准段可能存在属性配置问题,且重复定义.text段的写法不够规范。

解决方法

推荐两种修正方案,优先选择第一种适配64位环境的写法:

方案1:统一使用64位变量(推荐)

将变量定义改为dq(四字,8字节),并放到标准的.data段(汇编中存放已初始化数据的标准段),确保压栈读取的宽度和变量本身一致。

修正后的完整代码:

;; Start of program
section .data
    number_1 dq 1
    number_2 dq 2

section .text
    global _start

_start:
    push qword [number_1]
    push qword [number_2]
    ;; Add
    pop rax
    pop rbx
    add rax, rbx
    push rax
    ;; Exit
    mov rax, 60
    mov rdi, 0
    syscall

方案2:保留2字节变量并使用对应宽度操作

如果要维持2字节变量,需将压栈指令改为push word,并使用16位寄存器处理数值,避免读取垃圾数据:

;; Start of program
section .data
    number_1 dw 1
    number_2 dw 2

section .text
    global _start

_start:
    push word [number_1]
    push word [number_2]
    ;; Add
    pop ax
    pop bx
    add ax, bx
    movzx rax, ax  ; 将16位结果零扩展为64位,适配后续操作
    push rax
    ;; Exit
    mov rax, 60
    mov rdi, 0
    syscall

注意:64位系统默认要求栈8字节对齐,push word可能破坏对齐,仅在特殊场景使用此方案。

内容的提问来源于stack exchange,提问作者Michael Platt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 04:16:09