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字符串:
- 比如把整数123转换成
'1'、'2'、'3'这三个ASCII字节(对应0x31、0x32、0x33); - 把这些ASCII字节存入栈(或内存);
- 调用
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
相关产品推荐
相关产品推荐

