x86汇编读取两数求和问题:movzx等方法无效,sum无输出
问题分析与解决方案
你的代码核心问题有两个:一是未实现从ASCII字符到数值的转换与求和逻辑,二是sum变量未被赋值,所以输出为空。以下是具体修正步骤和完整代码:
关键修正点
- 读取的输入是ASCII字符(比如输入
5,内存中存的是0x35),必须先转换为十进制数值再相加 - 相加后的数值要转回ASCII字符才能正确显示
- 补充求和逻辑,将结果写入
sum变量
完整修正代码
section .data msg db 'Introduceti primul numar: ' lenMsg equ $ -msg newline db 10 MSG db 'Introduceti al doilea numar: ' LENMSG equ $ -MSG result db 'Suma este: ' lenResult equ $ -result section .bss num1 resb 1 num2 resb 1 sum resb 1 section .text global _start _start: ; Afisare mesaj 1 mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, lenMsg int 0x80 ; Citire numar 1 mov eax, 3 mov ebx, 0 mov ecx, num1 mov edx, 1 int 0x80 ; 跳过输入后的换行符(避免第二个read读取换行) mov eax, 3 mov ebx, 0 mov ecx, num1 ; 临时存储换行,不影响后续使用 mov edx, 1 int 0x80 ; Afisare mesaj 2 mov eax, 4 mov ebx, 1 mov ecx, MSG mov edx, LENMSG int 0x80 ; Citire numar 2 mov eax, 3 mov ebx, 0 mov ecx, num2 mov edx, 1 int 0x80 ; 跳过输入后的换行符 mov eax, 3 mov ebx, 0 mov ecx, num2 mov edx, 1 int 0x80 ; --- 新增求和逻辑 --- ; 将ASCII字符转为十进制数值 sub byte [num1], '0' sub byte [num2], '0' ; 两数相加 mov al, [num1] add al, [num2] ; 将结果转回ASCII字符 add al, '0' mov [sum], al ; --- 求和逻辑结束 --- ; Afisare ultim mesaj mov eax, 4 mov ebx, 1 mov ecx, result mov edx, lenResult int 0x80 ;afisare suma mov eax, 4 mov ebx, 1 mov ecx, sum mov edx, 1 int 0x80 ; Afisare newline mov eax, 4 mov ebx, 1 mov ecx, newline mov edx, 1 int 0x80 ; Iesire din program mov eax, 1 xor ebx, ebx int 0x80
额外说明
- 加入了跳过换行符的代码:因为用户输入数字后按回车,
read系统调用会把回车(ASCII 0x0A)也读入缓冲区,如果不跳过,第二个read可能直接读取回车符,导致后续计算错误。 - 这段代码仅支持0-9的单个数字相加,若需要处理多位数或进位(比如和超过9),需要额外实现进位处理和多字节输出逻辑。
内容的提问来源于stack exchange,提问作者Alex Bivol
相关产品推荐
相关产品推荐

