Linux NASM x86_64汇编中如何正确打印两位整数?
如何修改NASM x86_64汇编代码实现两位整数的打印?
原代码只能处理单个数字,当你把num设为12时,会输出ASCII码60对应的'<', 原因是原逻辑直接把12加上48(ASCII'0'的码值)得到60,然后存到al里,自然就打印出了'<', 完全没处理两位数的拆分逻辑。要打印两位数,得先把整数拆成十位和个位,分别转成ASCII字符后再输出。
原问题代码
section .data num: db 9,10 section .text global _start _start: mov rax,[num] add rax,48 mov [num],al mov rax,1 mov rdi,1 mov rsi,num mov rdx,2 syscall mov rax,60 mov rdi,0 syscall
修改后的代码及说明
section .data num dd 12 ; 用双字存储要打印的整数,支持0-99的范围 buffer db 0, 0, 10 ; 存储转换后的十位、个位ASCII字符,最后加换行符 section .text global _start _start: ; 加载整数到eax,拆分十位和个位 mov eax, [num] mov ebx, 10 xor edx, edx ; 清空edx,因为div会用rax:rdx作为被除数 div ebx ; eax = 商(十位数字),edx = 余数(个位数字) ; 将十位和个位转为ASCII字符 add eax, 48 ; 十位数字加48转ASCII mov [buffer], al add edx, 48 ; 个位数字加48转ASCII mov [buffer+1], dl ; 调用sys_write输出buffer mov rax, 1 ; syscall号:write mov rdi, 1 ; 文件描述符:stdout mov rsi, buffer ; 输出缓冲区地址 mov rdx, 3 ; 输出长度:两位数字+换行,共3字节 syscall ; 退出程序 mov rax, 60 mov rdi, 0 syscall
关键修改点
- 把存储数字的
num改成双字(dd),避免字节存储带来的溢出问题,能支持0到99的整数 - 新增
buffer用于存放转换后的ASCII字符和换行,保证输出格式正确 - 用除法拆分十位和个位:通过
div ebx(除数10),商是十位数字,余数是个位数字 - 分别将十位和个位转换为ASCII后写入buffer,最后输出整个buffer
内容的提问来源于stack exchange,提问作者Elmo YT
相关产品推荐
相关产品推荐

