Do napisania mojego pierwszego artykułu skłoniła mnie wskazówka dodana przez Dryobatesa o zamianie wartości ośmiobitowej na jej reprezentację dziesiętną w postaci ciągu znaków. Poniższy fragment robi to samo ze słowem z tym, że wynik jest w postaci szesnastkowej. Pierwsza wersja jest zdecydowanie dłuższa od drugiej, ale być może wykonuje się szybciej. Należało by przetestować. Można by jeszcze zoptymalizować je pod kątem Pentium wyższych rzędów, aby w miarę możliwości instrukcje były wykonywane równolegle, ale to już temat na osobną poradę...
Dane wejściowe:
ax - liczba do zamiany
Dane wyjściowe:
wartosc - 4 bajty jako Ascii
wartosc db 4 dup(?)
Hex2Ascii Proc ;wersja dłuższa
push di
push ax
lea di,wartosc+3
and al,0fh
call AL2Ascii
mov [di],al
dec di
pop ax
push ax
shr al,4
call AL2Ascii
mov [di],al
dec di
pop ax
push ax
shr ax,8
and al,0fh
call AL2Ascii
mov [di],al
dec di
pop ax
push ax
shr ax,12
call AL2Ascii
mov [di],al
pop ax
pop di
ret
Hex2Ascii EndP
Hex2Ascii2 Proc ;wersja krótsza
push di
push dx
push bx
push ax
mov dx,ax
lea bx,wartosc
mov di,3
@1:
and al,0fh
call AL2Ascii
mov [bx+di],al
shr dx,4
mov ax,dx
dec di
jns @1
pop ax
pop bx
pop dx
pop di
ret
Hex2Ascii2 EndP
AL2Ascii Proc ;funkcja pomocnicza
add al,90h
daa
adc al,40h
daa
ret
AL2Ascii EndP
Funkcja AL2Ascii jest dość powszechnie znanym sposobem na zamianę wartości z zakresu na wartość odpowiednio z zakresu .
Dryobates : dzięki za trafne uwagi |