assembly - 开始组装,简单的计算器问题
问题描述
我想说我是一个完全的组装菜鸟,几天前才开始学习它。了解了一些关于用户输入、寄存器和定义的知识。现在我试图将所有这些结合到一个计算器程序中。但乍一看,有一个问题。程序输出欢迎消息,但不打印结果。
有人能帮助我吗?
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 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
要使它成为一个强大的程序,您仍然需要
- 检查两个输入的有效性
- 有没有输入任何东西?
EAX
从sys_read检查! - 输入是否代表一个数字?
- 这个数字在允许的范围内吗?
- 有没有输入任何东西?
- 为总和大于 9 时做准备(需要超过 1 个输出字符)。
推荐阅读
- glfw - Mingw-w64 的 GLFW 库
- python - 如何在 Python 中访问 groupcollide() 返回的列表中的每个项目属性?
- firebase-authentication - Firebase 不接受从 Google Identity Platform 的 REST API 获取的 JWT:“自定义令牌格式不正确。”
- r - 如何通过R包中的字符串调用内部数据集
- python - Pandas 在另一列 B 中为 A 列中的选定值设置条目
- reactjs - React Native - 模态 - 动态最大高度
- reactjs - 在个人选项卡中打开 React 组件
- python - 为什么终端给我这个错误并且所有模块都被导入了?
- android - SSO 谷歌登录无法登录
- .htaccess - 重写规则不适用于 apache2,lucee tomcat