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 ) ;
; 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 :
; 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:
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