Как правило, вы хотите разделить на 10, вывести остаток (одну цифру) и затем повторить с частным.
; assume number is in eax
mov ecx, 10
loophere:
mov edx, 0
div ecx
; now eax <-- eax/10
; edx <-- eax % 10
; print edx
; this is one digit, which we have to convert to ASCII
; the print routine uses edx and eax, so let's push eax
; onto the stack. we clear edx at the beginning of the
; loop anyway, so we don't care if we much around with it
push eax
; convert dl to ascii
add dl, '0'
mov ah,2 ; 2 is the function number of output char in the DOS Services.
int 21h ; calls DOS Services
; now restore eax
pop eax
; if eax is zero, we can quit
cmp eax, 0
jnz loophere
Как примечание, у вас есть ошибка в вашем коде прямо здесь:
mov ax, 1 ;put 1 into ax
add ax, 2 ; add 2 to ax current value
mov ah,2 ; 2 is the function number of output char in the DOS Services.
mov dl, ax ; DL takes the value.
Вы положили 2
в ah
, а затем вы положили ax
в dl
. Вы в основном шутите ax
перед печатью.
У вас также есть несоответствие размера, поскольку dl
имеет ширину 8 бит и ax
имеет ширину 16 бит.
Что вам нужно сделать, это перевернуть последние две строки и исправить несоответствие размера:
mov ax, 1 ;put 1 into ax
add ax, 2 ; add 2 to ax current value
mov dl, al ; DL takes the value.
mov ah,2 ; 2 is the function number of output char in the DOS Services.