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

NASM汇编加减法代码无输出:如何实现输出150和48?

NASM汇编加减运算无输出问题的修复方案

原代码存在三个核心问题导致无正确输出:

  • sys_write(int 0x80,eax=4)要求ecx指向内存中字符串的起始地址,但你直接传入了数值本身,且数值不是ASCII编码,系统无法识别输出内容
  • 运算结果(150、48)是多位数,需要先将十进制数值转换为ASCII字符串才能逐字符输出
  • display_result中的exit代码块会直接终止程序,导致减法运算的结果无法执行输出

以下是修复后的完整代码:

section .data
    num1 db 99
    num2 db 51
    result_buf db '000', 0xA  ; 预留3位数字+换行的缓冲区
    newline db 0xA

section .text
    global _start

_start:
    ; 加法运算
    mov al, [num1]
    add al, [num2]
    call num_to_str           ; 将al中的数值转为ASCII字符串存入result_buf
    call display_result

    ; 减法运算
    mov al, [num1]
    sub al, [num2]
    call num_to_str
    call display_result

    ; 退出程序
    mov eax, 1
    xor ebx, ebx
    int 0x80

; 将al中的8位无符号数转为十进制ASCII字符串,存入result_buf
num_to_str:
    mov cl, 10
    mov edi, result_buf + 2   ; 从缓冲区末尾开始填充(倒序)

    ; 提取个位
    xor ah, ah
    div cl
    add ah, '0'
    mov [edi], ah
    dec edi

    ; 提取十位
    xor ah, ah
    div cl
    add ah, '0'
    mov [edi], ah
    dec edi

    ; 提取百位
    add al, '0'
    mov [edi], al
    ret

; 输出result_buf中的字符串(3位数字+换行)
display_result:
    mov edx, 4                ; 输出长度:3位数字+1个换行
    mov ecx, result_buf
    mov ebx, 1
    mov eax, 4
    int 0x80
    ret

关键修改说明:

  1. 新增数值转ASCII函数num_to_str:
    • 利用除法提取每一位数字,加上'0'转为ASCII字符
    • 从缓冲区末尾倒序填充,保证最终字符串是正序的十进制数字
  2. 调整输出逻辑:
    • 使用result_buf存储转换后的ASCII字符串,sys_write直接指向该缓冲区地址
    • 固定输出长度为4(3位数字+换行),确保多位数能完整输出
  3. 移除display_result中的退出代码:
    • 改用ret返回调用处,保证加法完成后能继续执行减法运算
  4. 规范退出调用:
    • 退出时将ebx设为0(正常退出码),符合Linux系统调用规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:15:36