Да, вы получите , скорее всего, получите странный символ, потому что int 21 / ah = 02 требует, чтобы символ для печати был в регистре dl
, а вы не заполнили dl
что угодно.
Возможно, вы захотите передать значение следующим образом:
mov ax, 10
add ax, 5
push ax ; these are the two new lines.
pop dx
mov ah, 02h
Однако имейте в виду, что даже если вы do передаете значение из al
до dl
, символ номер 15 может быть не тем, что вы ожидаете.15 является одним из управляющих символов ASCII, и я не уверен, что для них будут выводиться прерывания DOS.
Если вы хотите распечатать цифры 15
, вам потребуется two звонки, один с dl = 31h
и второй с dl = 35h
(два кода ASCII для символов 1
и 5
).
Если вы хотите узнать, как получить число взарегистрируйте и выведите цифр для этого числа в удобочитаемой форме, в есть мой псевдокод, более ранний ответ .
.-код:
val = 247
units = val
tens = 0
hundreds = 0
loop1:
if units < 100 goto loop2
units = units - 100
hundreds = hundreds + 1
goto loop1
loop2:
if units < 10 goto done
units = units - 10
tens = tens + 1
goto loop2
done:
if hundreds > 0: # Don't print leading zeroes.
output hundreds
if hundreds > 0 or tens > 0:
output tens
output units
;; hundreds = 2, tens = 4, units = 7.
Теперь вам нужно перевести это в сборку x86.Давайте начнем с желаемого значения в ax
:
mov ax, 247 ; or whatever (must be < 1000)
push ax ; save it
push dx ; save dx since we use it
mov dx, 0 ; count of hundreds
loop1:
cmp ax, 100 ; loop until no more hundreds
jl fin1a
inc dx
sub ax, 100
jmp loop1
fin1a:
add dx, 30h ; convert to character in dl
push ax ; save
mov ah, 2
int 21h ; print character
pop ax ; restore value
; now do tens and units the same way.
pop dx ; restore registers
pop ax
Теперь этот сегмент кода (несмотря на какие-либо ошибки из-за того, что я давно собирался) должен распечатать цифру сотен и оставить топортолько с цифрами десятков и единиц.
Простое дублирование функциональности должно быть в два раза больше, чтобы получить места в десятках и единицах.