6.5MOƠT SÔ GIẠI THUAƠT CHUYEƠN ĐO Ơ

Một phần của tài liệu Giáo trình TASM (Trang 31 - 37)

CHƯƠNG 6: MOƠT SÔ CÂU TRÚC VAØ GIẠI THUAƠT CAÍN BẠN 6.1CÂU TRÚC IF

6.5MOƠT SÔ GIẠI THUAƠT CHUYEƠN ĐO Ơ

6.5.1Táo chuoêi sô dec từ moơt giá trị nhị phađn 2 byte (Khođng định dáng)

Num-to-Dec proc near ;

; Input :

; AX = giá trị caăn chuyeơn đoơi ( 2 byte )

; DS:SI = Buffer (Kích thước 5 byte,xóa trông baỉng 020h) ; Output :

; Dec-string được đaịt vào buffer và canh theo leă phại ; push ax push bx push cx mov bx,5 mov cl,10 NTD1: div cl ;

add ah,’0’ ; Chuyeơn sô dư thành ký sô ; Chú ý : ‘0’..’9’ là các mã lieđn túc mov byte ptr [si+bx],ah

dec bx ; bx = bx-1

xor ah,ah ; Chia al cho 10,sô dư trong ah cmp al,0

jne NTD1 ; Nêu AL # 0 thì laịp lái pop cx

pop bx pop ax ret

Num-to-Dec endp

6.5.2Táo chuoêi sô dáng dec từ moơt giá trị nhị phađn 4 byte (Có định dáng)

Num-to-Dec proc near ;

; Input :

; DX,AX = giá trị caăn chuyeơn đoơi ( 4 byte )

; DS:SI = Buffer ( Khođng caăn phại xóa trông trước ) ; CX = Kích thước chuoêi sô ( format/picture )

; Cho CX = 0 sẽ táo ra loêi ; Output :

; Dec-string được đaịt vào buffer và canh theo leă phại ;

push ax push bx push cx push dx push si push di mov di,10 add si,cx NTD1:

mov bx,ax ; BX = 2 byte thâp mov ax,dx ; Chia 2 byte cao cho 10 xor dx,dx

div di

xchg ax,bx ; (sô-dư*65536 + 2 byte thâp)/10 div di

add dl,’0’ ; Sô dư chính là ký sô caăn tìm dec cx

jcxz NTD3 NTD2:

mov byte ptr ds:[si],dl dec si mov dx,bx or dx,ax jnz NTD1 mov dl,’ ‘ loop NTD2 NTD3: pop di pop si pop dx pop cx pop bx pop ax ret Num-to-Dec endp

6.5.3Táo chuoêi sô dáng dec từ moơt giá trị nhị phađn 4 byte (Có định dáng)

NUM-TO-DEC proc near ;

; Input : ;

; DX,AX = Giá trị caăn chuyeơn đoơi ; (DX : 2 byte cao, AX : 2 byte thâp) ; ES:DI = Địa chư cụa buffer

; CH = Kích thước chuoêi sô ( format/picture ) ; (adsbygoogle = window.adsbygoogle || []).push({});

; Dec-string được đaịt vào buffer và canh theo leă phại cld

mov bx,ax ; DX,BX chứa giá trị caăn đoơi mov al,’ ‘

mov cl,9 ; Chuoêi sô có chieău dài tôi mov si,offset NTD-table ; đa 9 ký sô NTD1:

cmp dx,word ptr cs:[si+2] ; So sánh DX,BX với dword jb NTD2 ; đang được DS:SI chư đên

ja NTD3 ; ( Baĩt đaău từ hàng tư )

cmp bx,word ptr cs:[si] ; So sánh 2 byte cao trước jae NTD3 ; 2 byte thâp sau

NTD2:

add si,4 ; Dời đên hàng kê tiêp cmp ch,cl

jbe NTD21 ; Xóa trông phaăn đaău buffer stosb ; NTD21: dec cl jnz NTD1 NTD3: inc cl NTD4: mov al,’0’-1 NTD5: inc al

sub bx,word ptr cs:[si] ; Trừ hai giá trị 4 byte sbb dx,word ptr cs:[si+2] ;

jnc NTD5 ; Kêt quạ vaên chưa ađm

add bx,word ptr cs:[si] ; Nêu kêt quạ ađm, trạ lái adc dx,word ptr cs:[si+2] ; kêt quạ dương nhỏ nhât ; --> chuyeơn xuông hàng

; kê tiêp

stosb ; AL = ký sô hàng đang xét dec cl ; CL = hàng đang xét add si,4 ; Dời đên hàng kê tiêp jnz NTD4

ret

NUM-TO-DEC endp

NTD-table dd 1000000000 ; hàng tư dd 100000000 ; hàng traím trieơu

dd 10000000 ; hàng chúc trieơu dd 1000000 ; hàng trieơu dd 100000 ; hàng traím ngàn dd 10000 ; hàng chúc ngàn dd 1000 ; hàng ngàn dd 100 ; hàng traím dd 10 ; hàng chúc dd 1 ; hàng đơn vị Chú ý :

Giại thuaơt cụa 6.5.1 và 6.5.2 : chia sô caăn đoơi cho 10, suy ra ký sô tương ứng từ sô dư cụa phép toán chia . Quá trình táo ra chuoêi sô thaơp phađn theo chieău từ phại sang trái. Đeơ tránh trường hợp kêt quạ chia bị tràn,thí dú 6.5.2 đã dùng đên hai laăn chia trung gian, trong đó kêt quạ cụa moêi laăn chia luođn khođng tràn.

Giại thuaơt cụa 6.5.3 : dùng moơt bạng lieơt keđ giá trị các hàng đơn vị cụa heơ thaơp phađn theo thứ tự từ lớn đên nhỏ . Khi chuyeơn đoơi sẽ tiên hành dò bạng từ tređn xuông cho đên khi gaịp giá trị nhỏ hơn giá trị caăn chuyeơn đoơi .

Thí dú : giá trị caăn chuyeơn đoơi là 170900 thì giá trị tìm thây là 100000 (tieđu bieơu cho hàng traím ngàn)

Lây giá trị caăn chuyeơn đoơi trừ cho giá trị tìm thây và laịp lái cho đên khi hieơu sô nhỏ hơn sô trừ . Sô laăn laịp chính là giá trị cụa ký sô tương ứng.

Trong thí dú tređn, sô laăn laịp là 1, hieơu sô là 70900

Cho sô trừ là phaăn tử kê tiêp trong bạng, laịp lái quá trình tređn cho đên khi dò hêt bạng .

Giại thuaơt cụa 6.5.3 chư dùng các tác vú coơng trừ và có theơ mở roơng cho các sô có kích thước tùy ý .

6.5.4Táo chuoêi sô dáng hex từ moơt giá trị nhị phađn 1 byte

Num-To-Hex proc near ;

; Input :

; AL = giá trị caăn chuyeơn đoơi ( 1 byte ) ; DS:SI = Buffer

; Output : (adsbygoogle = window.adsbygoogle || []).push({});

; Hex-string được đaịt vào buffer ( 2 ký sô hex ) ;

push ax push cx

mov ah,al ; AH = AL mov cl,4

shl ah,4 ; Xóa 4 bit cao (nibble cao) shr ah,4 ; AH = nibble thâp

shr al,4 ; AL = nibble cao

add ax,03030h ; AH = AH+’0’, AL = AL +’0’ cmp ah,’9’

jbe NTH1 add ah,’A’-‘9’-1 NTH1:

cmp al,’9’ ; Nêu AL >’9’ --> ‘A’..’F’ jbe NTH2

add al,’A’-‘9’-1 ; Coơng theđm khoạng cách từ ‘A’ NTH2: ; đên ‘9’ trừ 1 .

mov word ptr [si],ax ; ký sô tương ứng với nibble pop cx ; cao sẽ đaịt trước .

pop ax ret

Num-To-Hex endp

6.5.5Táo chuoêi sô dáng bin từ moơt giá trị nhị phađn 1 byte

Num-to-Bin proc near ;

; Input :

; AL = giá trị caăn chuyeơn đoơi ( 1 byte ) ; DS:SI = Buffer ( 8 byte )

; Output :

; Bin-string được đaịt vào buffer ( 8 ký sô bin ) ; push ax push bx xor bx,bx ; BX = 0 NTB1: mov ah,’0’

shl al,1 ; CF = bit bị đaơy lĩt ra ngoài adc ah,0 ; CF = 0 --> AH = ‘0’+0 = ‘0’ ; CF = 1 --> AH = ‘0’+1 = ‘1’

mov byte ptr [si+bx],ah inc bx ; bx = bx+1

cmp bx,8 ; Đã hêt 8 bit chưa ? jne NTB1

pop bx pop ax ret

Num-to-Bin endp

6.5.6Đoơi chuoêi sô dec thành giá trị nhị phađn 4 byte

DTN proc near ; Input :

; DS:SI = Buffer chứa num-str dáng decimal ; CL = chieău dài cụa num-str

; Output:

; CF=1 --> loêi chuyeơn đoơi

; CF=0 --> DX:AX = giá trị nhị phađn tương ứng push bx

push si xor ch,ch xor ax,ax xor dx,dx DTN0: (adsbygoogle = window.adsbygoogle || []).push({});

cmp byte ptr [si],’ ‘ ; Bỏ qua các khoạng trông jne DTN1 ; beđn trái chuoêi sô

inc si loop DTN0

jmp DTN3 ; Chuoêi sô “roêng” DTN1:

mov bl,byte ptr [si] inc si

sub bl,03Ah ; kieơm tra ‘0’<= BL <=’9’ add bl,0Ah

jae DTN3 ; Có moơt ký tự “lá” trong ; chuoêi sô push bx shl AX,1 ; nhađn 2 rcl DX,1 ; push dx push ax

shl AX,1 ; roăi nhađn 4 rcl DX,1

shl AX,1 rcl DX,1

pop bx ; coơng doăn

add ax,bx ; a*2 + a*8 = a*10 pop bx

adc dx,bx pop bx xor bh,bh

add ax,bx ; coơng ký sô mới vào hàng đơn adc dx,0 ; vị

js DTN3 ; Kêt quạ bị tràn --> loêi loop DTN1

DTN2: clc

jmp DTN4

DTN3: ; Nêu gaịp loêi, CF=1, kêt quạ stc ; chuyeơn đoơi dở dang trong DTN4: ; DX|AX

pop si pop cx pop bx

ret

DTN endp

Một phần của tài liệu Giáo trình TASM (Trang 31 - 37)