Моя программа ASM для x86 8086 плохо печатается - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть этот код в asm x86 с виртуализацией DOSBox:

.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

Программа предполагает добавить номер с терминала и распечатать в консоли. Я ожидаю, что мой код был неправильным, а не моя среда.

Спасибо за ответы

1 Ответ

0 голосов
/ 08 ноября 2018
mov al,1     <-- function number goes in AH
int 21h
add bl,al

Когда вы запрашивали второй символ, вы допустили ошибку при сохранении номера функции в AL, где он должен был быть AH.Хотя API DOS не упоминает, что 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.

...