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

Assembly 开始组装,简单的计算器问题,assembly,x86,user-input,Assembly,X86,User Input,我想说的是,我在大会上是个彻头彻尾的呆子,几天前才开始学习。学习了一些关于用户输入、寄存器和定义的知识。现在我试着将所有这些结合到一个计算器程序中。但首先总结一下,有一个问题。程序会输出欢迎信息,但不会打印结果。 有人能帮我吗 第2节bss sinput1:resb 255 sinput2:resb 255 第二节数据 msg db“欢迎使用计算器”,0xa lenMsg eq$-msg 第节.案文 全球启动 _开始: ;打印欢迎信息 mov-eax,4 mov-ebx,1 mov-edx,l

我想说的是,我在大会上是个彻头彻尾的呆子,几天前才开始学习。学习了一些关于用户输入、寄存器和定义的知识。现在我试着将所有这些结合到一个计算器程序中。但首先总结一下,有一个问题。程序会输出欢迎信息,但不会打印结果。
有人能帮我吗


第2节bss
sinput1:resb 255
sinput2:resb 255

第二节数据 msg db“欢迎使用计算器”,0xa lenMsg eq$-msg

第节.案文 全球启动

_开始: ;打印欢迎信息 mov-eax,4 mov-ebx,1 mov-edx,lenMsg mov-ecx,msg int 80h ;输入第一位数字 mov edx,255 mov ecx,sinput1 mov-ebx,0 mov-eax,3 int 80h ;输入第二位数字 mov edx,255 mov ecx,sinput2 mov-ebx,0 mov-eax,3 int 80h ;总结一下 新片 mov edx,sinput2 添加esi、edx ;把结果打印出来 mov-eax,4 mov-ebx,1 mov edx,255 mov ecx,esi int 80h ;退出程序 mov-eax,1 int 80h

指令
mov esi,sinput1
移动
esi
寄存器中第一个缓冲区的地址,但您确实需要存储在那里的字节。您可以通过
mov al[sinput1]
检索它
类似地,指令
mov-edx,sinput2
移动
edx
寄存器中第二个缓冲区的地址,但您确实需要存储在那里的字节。您可以通过
movdl[sinput2]
检索它

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

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

下面的代码将被输出

欢迎使用计算器
七,

如果您使用以下键输入

3输入4输入


要使它成为一个健壮的程序,您仍然需要

  • 检查两个输入的有效性
    • 有什么输入吗?检查系统读取的EAX
      EAX
    • 输入是否表示一个数字
    • 这个数字在允许的范围内吗
  • 为总和大于9(需要超过1个输出字符)做准备

许多问题:1)您试图添加地址而不是值2)您无法从文本转换回3)您试图将结果作为地址传递。@Jester 1)如何做到这一点?我以为我把输入放在寄存器里了。。。求和并尝试以数字形式从文本输出2)。。。还是怎样3) 那么如何获取值呢?靠近注释-;总结一下,我尝试将add esi,edx更改为add esi[edx],现在它显示输入的数字。不是结果,但至少xD并不真正了解它的功能

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
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