x86-64汇编逆序打印数字出错:输入123却无限打印1
问题分析
你的代码无限打印1的核心原因是循环条件判断错误:
- 你当前用
cmp ah,0+ja afisnr判断是否继续循环,ah是除法后的余数。当处理到数字1时,余数是1,此时会触发跳转继续循环;但此时商已经是0,存入n后n变为0。 - 正确逻辑应该是判断商是否不为0——商代表尚未处理的高位部分,当商为0时说明所有位处理完毕,无需继续循环。
修复后的代码
global main section .data n db 123 c db '5' section .text afisc: mov rax,1 mov rdi,1 mov rsi,c mov rdx,1 syscall ret afisnr: mov al,[n] mov ah,0 mov r8b,10 div r8b add ah,'0' mov [c],ah call afisc mov[n],al cmp al,0 ; 改为判断商是否不为0 jne afisnr ; 商不为0则继续循环 ret main: xor rax,rax call afisnr mov rax,60 mov rdi,0 syscall
修复说明
- 将循环判断从
cmp ah,0+ja afisnr改为cmp al,0+jne afisnr:al是除法后的商,代表剩余未处理的高位数字。当商不为0时,说明还有高位需要处理,继续循环;当商为0时,所有位处理完成,退出循环。
- 处理数字123时,会依次打印余数3、2、1,然后商变为0,退出循环,最终输出
321,符合预期。
内容的提问来源于stack exchange,提问作者so_17
相关产品推荐
相关产品推荐

