首页 > 解决方案 > 我的 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

我的预期输出是一个数字,我得到了这个 ascii 字符

该程序假设从终端添加一个数字并在控制台中打印。我希望我的代码是错误的,而不是我的环境。

谢谢你的回答

标签: assemblyx86-16

解决方案


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 的加法。


推荐阅读