x86_32 NASM程序转ASCII仅打印最后两位数字的问题求助
问题分析与修复:x86_32 NASM汇编仅输出数字最后两位
你的x86_32架构NASM汇编代码存在逻辑错误,导致无论输入数字长度如何,仅能输出最后两位(如输入6789时输出89)。以下是问题原因及修复方案:
问题原因
原代码在divide循环中,不必要地将计数寄存器ebx与余数edx一同压入栈中,导致栈结构冗余,且print循环依赖弹出的ebx值判断是否终止,逻辑存在漏洞:
- 每次循环压入两个元素(ebx、edx),栈结构变为
[计数, 余数, 计数, 余数,...] - 若循环终止条件的判断逻辑与栈中存储的计数不匹配,会导致打印循环提前退出,仅输出部分数字
修复方案
移除对ebx的压栈操作,仅将余数压入栈中,用ebx记录余数的总个数,然后通过递减ebx来控制打印循环的次数:
修复后的完整代码:
global _start section .text _start: mov eax, 6789 ; 待打印的数字 mov ebx, 0 ; 记录数字的位数 mov ecx, 10 ; 除数(10,用于分解数字) divide: mov edx, 0 div ecx ; edx=余数(当前位数字),eax=商(剩余未分解的数字) push edx ; 仅将余数压入栈中 inc ebx ; 位数计数+1 cmp eax, 0 ; 判断是否已分解完所有数字 jne divide ; 未分解完则继续循环 print: pop edx ; 从栈顶弹出余数(最高位数字先弹出) add edx, 0x30 ; 将数字转换为ASCII字符 mov [digit], edx ; 存储到digit变量中 ; 调用sys_write打印单个字符 mov eax, 4 mov ebx, 1 mov ecx, digit mov edx, 1 int 0x80 dec ebx ; 位数计数-1 jnz print ; 未打印完所有数字则继续循环 concl: ; 调用sys_exit退出程序 mov eax, 1 mov ebx, 0 int 0x80 section .data digit db 0
修复逻辑说明
divide循环:仅将每次分解得到的余数(单个数字)压入栈,用ebx统计总位数,避免栈结构冗余print循环:通过递减ebx控制循环次数,每次弹出栈顶的余数(栈的特性保证了数字从高位到低位弹出),转换为ASCII后打印,直到所有数字打印完成
内容的提问来源于stack exchange,提问作者Aleph_0
相关产品推荐
相关产品推荐

