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

