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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:25:26