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
相关产品推荐
相关产品推荐

