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

x86汇编中向栈存整数无法输出,存字符却正常的原因?

问题原因及解决方案

核心原因很直接:sys_write系统调用输出的是ASCII字节流,不是整数的二进制数值。

  • 当你存字符到栈时,字符本身就是对应的ASCII编码(比如'1'对应0x31),sys_write直接把这些字节输出为可见字符,所以能正常显示。
  • 但你存整数时,栈里是整数的二进制原始值(比如整数5的32位二进制是0x05 0x00 0x00 0x00),这些字节要么是终端不显示的控制字符(0x05是ENQ控制符),要么是空字节(0x00),所以执行后看起来像没调用sys_write。

你尝试的word类型切换、用push替代手动调整栈指针,本质只是改变了整数的存储长度(16位/32位),但没有把整数转换成可打印的ASCII字符串,所以核心问题没解决。

解决思路

要输出整数,必须先把整数转换成对应的ASCII字符串:

  1. 比如把整数123转换成'1'、'2'、'3'这三个ASCII字节(对应0x31、0x32、0x33);
  2. 把这些ASCII字节存入栈(或内存);
  3. 调用sys_write时指定输出的起始地址和字符长度(这里是3字节),就能正常显示整数的十进制形式了。

举个简单的转换逻辑示例(伪汇编思路):

; 假设待转换整数存在eax中
mov ebx, 10          ; 除数设为10,用于取余
mov ecx, 0           ; 记录转换后的ASCII字符个数
convert_loop:
xor edx, edx
div ebx              ; eax = eax/10,edx = eax%10(余数)
add dl, '0'          ; 余数转成对应ASCII字符
push dx              ; 存入栈(栈是逆序存储,最后需调整顺序)
inc ecx
test eax, eax
jnz convert_loop
; 此时栈中是逆序的ASCII字符,ecx为字符总数
; 可将栈中字符弹出到连续内存,或直接从栈顶开始输出(需注意栈地址顺序)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:05:01