我想说的是,我在组装时是一个完整的菜鸟,几天前才开始学习它。学习了一些有关用户输入,寄存器和定义的知识。现在,我尝试将所有内容合并到一个计算器程序中。但是首先总结一下,这是一个问题。程序输出欢迎消息,但结果未打印。
有人可以帮我吗?
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
答案 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
要使其成为一个强大的程序,您仍然需要