assembly - 我的 x86 8086 的 ASM 程序打印不好
问题描述
我在带有 DOSBox 虚拟化的 asm x86 中有此代码:
.model small
.stack 100h
.data
.code
main proc
mov ah,1
int 21h
mov bl,al
mov al,1
int 21h
add bl,al
sub bl,'0'
mov dl,bl
mov ah,2
int 21h
mov ah,4ch
int 21h
main endp
end main
该程序假设从终端添加一个数字并在控制台中打印。我希望我的代码是错误的,而不是我的环境。
谢谢你的回答
解决方案
mov al,1 <-- function number goes in AH
int 21h
add bl,al
当您要求输入第二个字符时,您犯了将函数编号存储在AL
它应该在的位置的错误AH
。虽然 DOS api 没有提到AH
会随着这个函数而改变,但你不能相信这是真的。
mov ah, 1
int 21h
mov bl, al
mov ah, 1
int 21h
add bl, al ; This now contains 2 times '0'
sub bl, '0' ; Here you correctly subtract 1 of those
mov dl, bl
mov ah, 2
int 21h
你使用那首单曲sub bl, '0'
的方式很好,而且有点短,但大多数人会这样解决它:
mov ah, 01h
int 21h ; eg. input '3'
sub al, '0' ; '3' - '0' = 3
mov bl, al ; 3
mov ah, 01h
int 21h ; eg. input '5'
sub al, '0' ; '5' - '0' = 5
add bl, al ; 3 + 5 = 8
mov dl, bl
add dl, '0' ; 8 + '0' = '8'
mov ah, 02h
int 21h ; outputs '8'
但是,当且仅当您输入 2 个总和实际上小于 10 的单个数字时,以上所有方法都有效。如果不是,则需要输出超过 1 个字符才能显示加法的结果。
看看这里,看看你如何处理高达 99 的加法。
推荐阅读
- html - CSS - 始终覆盖在菜单顶部
- html - 使下拉菜单保持不变,直到单击按钮
- django - 限制用户只阅读自己的文章
- google-chrome - DOMException: 无法注册 ServiceWorker: 脚本没有 MIME 类型
- karate - 空手道 API - 如何在 Json 发布请求下参数化
- regex - 将任何请求重定向到 Apache 上的 HTTPS 的最有效方法?
- .htaccess - 在 Vue 中,如何使用 npm run build 将 .htaccess 包含到生产环境中?
- rust - 嵌套闭包借用失败
- git - 如何使用 Unity Smart Merge 合并我的 Unity 场景?
- c# - 在拆分中包含空格