首页 > 解决方案 > 开始组装,简单的计算器问题

问题描述

我想说我是一个完全的组装菜鸟,几天前才开始学习它。了解了一些关于用户输入、寄存器和定义的知识。现在我试图将所有这些结合到一个计算器程序中。但乍一看,有一个问题。程序输出欢迎消息,但不打印结果。
有人能帮助我吗?


section .bss
sinput1: resb 255
sinput2: resb 255

section .data msg db 'Welcome to the Calculator',0xa lenMsg equ $ - msg

section .text global _start

_start: ;Print out the Welcome message mov eax,4 mov ebx,1 mov edx, lenMsg mov ecx, msg int 80h ;Input first digit mov edx,255 mov ecx,sinput1 mov ebx,0 mov eax,3 int 80h ;Input second digit mov edx,255 mov ecx,sinput2 mov ebx,0 mov eax,3 int 80h ;Sum them up mov esi,sinput1 mov edx,sinput2 add esi,edx ;Print out the result mov eax,4 mov ebx,1 mov edx, 255 mov ecx, esi int 80h ;Quit the program mov eax,1 int 80h

标签: assemblyx86user-input

解决方案


该指令mov esi, sinput1将您的第一个缓冲区的地址移动到ESI寄存器中,但您确实想要存储在那里的字节。你通过mov al, [sinput1].
同样,该指令mov edx, sinput2将第二个缓冲区的地址移动到EDX寄存器中,但您确实想要存储在那里的字节。你通过mov dl, [sinput2].

接下来这些字节将是字符,希望在“0”到“9”的范围内,但您的添加会喜欢使用这些字符所代表的值。为此,您需要从两个字符的 ASCII 代码中减去 48。

一旦你得到一个正确的总和,你需要把它转换成一个字符,准备好显示。这需要您添加 48 以获得 sys_write 可以使用的 ASCII 码。

下面的代码将输出

欢迎使用计算器
7

如果您使用以下键输入

3Enter4Enter

mov al, [sinput1]   ; Character "3"
sub al, '0'         ; Convert to 3
mov dl, [sinput2]   ; Character "4"
sub dl, '0'         ; Convert to 4
add al, dl          ; Sum is 7
add al, '0'         ; Convert to character "7"
mov ah, 0Ah         ; Newline
mov [sinput1], ax   ; Store both in buffer

;Print out the result
mov edx, 2          ; Character and Newline
mov ecx, sinput1    ; Buffer
mov ebx, 1          ; Stdout
mov eax, 4          ; sys_write
int 80h

要使它成为一个强大的程序,您仍然需要

  • 检查两个输入的有效性
    • 有没有输入任何东西?EAXsys_read检查!
    • 输入是否代表一个数字?
    • 这个数字在允许的范围内吗?
  • 为总和大于 9 时做准备(需要超过 1 个输出字符)。

推荐阅读