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

x86_32 NASM程序转ASCII仅打印最后两位数字的问题求助

问题分析与修复:x86_32 NASM汇编仅输出数字最后两位

你的x86_32架构NASM汇编代码存在逻辑错误,导致无论输入数字长度如何,仅能输出最后两位(如输入6789时输出89)。以下是问题原因及修复方案:

问题原因

原代码在divide循环中,不必要地将计数寄存器ebx与余数edx一同压入栈中,导致栈结构冗余,且print循环依赖弹出的ebx值判断是否终止,逻辑存在漏洞:

  1. 每次循环压入两个元素(ebx、edx),栈结构变为[计数, 余数, 计数, 余数,...]
  2. 若循环终止条件的判断逻辑与栈中存储的计数不匹配,会导致打印循环提前退出,仅输出部分数字

修复方案

移除对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

修复逻辑说明

  1. divide循环:仅将每次分解得到的余数(单个数字)压入栈,用ebx统计总位数,避免栈结构冗余
  2. print循环:通过递减ebx控制循环次数,每次弹出栈顶的余数(栈的特性保证了数字从高位到低位弹出),转换为ASCII后打印,直到所有数字打印完成

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:01:16