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
相关产品推荐
相关产品推荐

