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

x86汇编执行pop ebp后无法将栈中数值输出到控制台问题

x86汇编栈数值输出问题修复

错误原因

  • 核心错误是对write系统调用的参数含义理解错误:32位Linux系统中eax=4对应的write调用,ecx需要传入待输出内容的内存地址,而你直接传入了要打印的数值6,内核会尝试读取地址0x6的内存,触发非法访问错误。
  • 次要问题:数值不能直接作为字符输出,需要先转换为对应的ASCII编码,单个十进制数字的ASCII值为数字本身 + 0x30。

修复后代码

section .bss
x2 resb 4    ; 预留可写缓冲区,用于存储待输出的ASCII字符

section .text
global _start

_start:
mov ecx, 5
mov eax, 6
push ecx
push eax

pop ebp               ; 取出栈中存储的数值6
add ebp, 0x30         ; 数值转ASCII:数字n的ASCII编码为n + 0x30
mov [x2], ebp         ; 将转换后的ASCII字符存入预留缓冲区

; 调用write系统调用输出
mov eax, 4
mov ebx, 1            ; 标准输出文件描述符
mov ecx, x2           ; 传入缓冲区的内存地址
mov edx, 1            ; 输出的字节长度
int 80h

; 调用exit系统调用退出
mov eax, 1
mov ebx, 0
int 0x80

拓展说明

如果需要输出大于9的多位十进制数,需要先对数值做十进制拆分,逐位转换为ASCII后按顺序存入缓冲区,再调用write统一输出即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:45:03