.MODEl Tiny
.CODE
ORG 100h
BEGIN:
mov ax, cs
mov ds, ax
mov es, ax
cld
lea di, buf
mov ax, number
xor dx, dx
div _10000
stosb
mov ax, dx
xor dx, dx
div _1000
stosb
mov ax, dx
xor dx, dx
div _100
stosb
mov ax, dx
xor dx, dx
div _10
stosb
mov [di], dl ;ñ«íáó½∩Ѽ «ßΓáΓ«¬
;¡á⌐ñѼ ñ½¿¡π τ¿ß½á
mov cx, 5
xor al, al
lea di, buf
rep scasb
inc cx
;ñ½¿¡á ó cx
mov ax, 4c00h
int 21h
number dw 23456 ;«íαáíáΓδóáѼ«Ñ τ¿ß½«
_10000 dw 10000
_1000 dw 1000
_100 dw 100
_10 dw 10
buf db 5 dup (?) ;óδσ«ñ¡«⌐ íπΣÑα
END BEGIN
hex2dec на ассемблере
в регистре ax - FFFF
а в некоем массиве buf в итоге должно получиться
buf[1] - 6
buf[2] - 5
buf[3] - 5
buf[4] - 3
buf[5] - 5
Порядок цифр в массиве роли не играет, я могу и в обратном порядке цифры вывести)), т.е. buf[1..5]={5,3,5,5,6} тоже сойдет.
Компилятор у меня TASM
вот если надо еще.
Ramzey А если бы число могло быть 10-значным (в 10 СС) ;-)
Вот процедура с примером использования. Без проблем переделывается под 32-разряда если надо.
Код:
ideal
model tiny
codeseg
org 100h
start:
mov di,offset buffer+6
mov ax,10203
call num2ascii
mov ah,9
mov dx,offset buffer
int 21h
ret
buffer db 5 dup (' '),13,10,'$'
proc num2ascii near
; AX - число ES:DI-куда писать ответ
std ; Запись справа налево для STOSB
mov bx,10 ; Делитель
diving:
xor dx,dx ; Чтобы избежать переполнения при делении
div bx ; AX=частное DX=остаток
xchg ax,dx
or al,'0'
stosb ; AX -> [ES:DI] ; DEC DI
mov ax,dx
or ax,ax ; Частное было равно нулю?
jnz diving ; Нет-продолжить цикл
ret
endp num2ascii
end start
model tiny
codeseg
org 100h
start:
mov di,offset buffer+6
mov ax,10203
call num2ascii
mov ah,9
mov dx,offset buffer
int 21h
ret
buffer db 5 dup (' '),13,10,'$'
proc num2ascii near
; AX - число ES:DI-куда писать ответ
std ; Запись справа налево для STOSB
mov bx,10 ; Делитель
diving:
xor dx,dx ; Чтобы избежать переполнения при делении
div bx ; AX=частное DX=остаток
xchg ax,dx
or al,'0'
stosb ; AX -> [ES:DI] ; DEC DI
mov ax,dx
or ax,ax ; Частное было равно нулю?
jnz diving ; Нет-продолжить цикл
ret
endp num2ascii
end start