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