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

NASM x86实现两行算式计算器时循环读取第二行输入失败求助

问题修复方案

核心错误点

  • 循环计数器初始化位置错误:你将mov cx, 2放在了_start入口最顶部,每次跳转回_start都会重置计数器为2,无法实现计数递减。
  • 循环判断逻辑错误:代码中cmp ecx, 2的判断对象是res变量的内存地址,不是循环计数器cx,永远无法触发循环跳转,计算完第一行后直接执行jmp exit退出程序,因此第二行没有输出。
  • 输入读取逻辑冗余:你硬编码预留了第二行的变量num3、num4、char2,完全不需要,每次循环复用num1、num2、char变量即可。
  • 除法逻辑已经正确实现了高位寄存器清0,不需要额外修改,仅需调整结果转ASCII的逻辑即可。

修改后的完整代码
segment .data 
    NO: db 'Invalid input', 10
    nolen: equ $-NO
    newline: db 10
    
segment .bss
    space resb 1
    num1 resb 1
    num2 resb 1
    op resb 1
    res resb 1   

section .text
global _start

_start:
    mov cx, 2       ; 初始化循环计数器,处理2行输入

read_loop:
    ; 读取第一个数字
    mov eax, 3
    mov ebx, 0  
    mov ecx, num1 
    mov edx, 1
    int 0x80  

    ; 读取运算符前的空格
    mov eax, 3
    mov ebx, 0  
    mov ecx, space 
    mov edx, 1
    int 0x80  

    ; 读取运算符
    mov eax, 3
    mov ebx, 0
    mov ecx, op
    mov edx, 1
    int 0x80
        
    ; 读取运算符后的空格
    mov eax, 3
    mov ebx, 0  
    mov ecx, space
    mov edx, 1
    int 0x80  

    ; 读取第二个数字
    mov eax, 3
    mov ebx, 0
    mov ecx, num2 
    mov edx, 1
    int 0x80   

    ; 读取行末换行符
    mov eax, 3
    mov ebx, 0  
    mov ecx, space
    mov edx, 1
    int 0x80  

    ; 转换数字为整数
    mov al, [num1]
    sub al, '0'
    mov bl, [num2]
    sub bl, '0'

    ; 判断运算符
    mov ah, [op]
    cmp ah, '+'
    je op_add
    cmp ah, '-'
    je op_sub
    cmp ah, '*'
    je op_mul
    cmp ah, '/'
    je op_div
    jmp op_invalid

op_add:
    add al, bl
    jmp output_res
op_sub:
    sub al, bl
    jmp output_res
op_mul:
    mul bl
    jmp output_res
op_div:
    mov ah, 0
    div bl
    jmp output_res
op_invalid:
    mov eax, 4
    mov ebx, 1
    mov ecx, NO
    mov edx, nolen
    int 0x80
    jmp loop_check

output_res:
    add al, '0'
    mov [res], al
    ; 输出结果
    mov eax, 4       
    mov ebx, 1
    mov ecx, res        
    mov edx, 1
    int 0x80
    ; 输出换行
    mov eax, 4
    mov ebx, 1
    mov ecx, newline
    mov edx, 1
    int 0x80

loop_check:
    dec cx
    jnz read_loop

exit:    
    mov eax, 1
    mov ebx, 0
    int 0x80

关键修改说明
  • 将循环计数器初始化放在_start入口仅执行一次,避免每次循环被重置,单独给读取输入逻辑添加read_loop标签作为循环入口。
  • 每次计算完成后执行dec cx递减计数器,判断计数器非零则跳转回read_loop处理下一行输入,计数器为0再执行退出逻辑。
  • 删除所有无效的cmp ecx, 2判断,统一了加减乘除的ASCII转数字、数字转ASCII逻辑,避免计算错位。
  • 调整了换行符读取位置,避免输入解析出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:30:03