开始组装,简单的计算器问题

时间:2019-02-08 18:47:17

标签: assembly x86 user-input

我想说的是,我在组装时是一个完整的菜鸟,几天前才开始学习它。学习了一些有关用户输入,寄存器和定义的知识。现在,我尝试将所有内容合并到一个计算器程序中。但是首先总结一下,这是一个问题。程序输出欢迎消息,但结果未打印。
有人可以帮我吗?


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

1 个答案:

答案 0 :(得分:2)

指令mov esi, sinput1将第一个缓冲区的地址移到ESI寄存器中,但是您确实希望将字节存储在该寄存器中。您可以通过mov al, [sinput1]进行检索。
同样,指令mov edx, sinput2将第二个缓冲区的地址移到EDX寄存器中,但是您确实希望将字节存储在该寄存器中。您可以通过mov dl, [sinput2]检索它。

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

一旦获得正确的和,您需要将其转换为字符,以供显示。这需要您添加48才能获得sys_write可以使用的ASCII代码。

下面的代码将输出

  

欢迎使用计算器
  7

如果您使用以下键输入

3 输入 4 输入

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

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

  • 检查两个输入的有效性
    • 有没有输入什么?从 sys_read 检查
    • 输入内容代表数字吗?
    • 这个数字在允许范围内吗?
  • 为总和大于9(需要超过1个输出字符)做准备。