DIV BX OVERFLOW
6.5 Thụ túc nhaơp xuât sô thaơp phađn
Maịc dù trong PC tât cạ sô lieơu được bieêu dieên dưới dáng binary . Nhưng vieơc bieêu dieên dưới dáng thaơp phađn sẽ thuaơn tieơn hơn cho người dùng . Trong phaăn này chúng ta sẽ viêt các thụ túc nhaơp xuât sô thaơp phađn .
Khi nhaơp sô lieơu , nêu chúng ta gõ 21543 chẳng hán thì thực chât là chúng ta gõ vào moơt chuoêi ký tự , beđn trong PC , chúng được biên đoơi thành các giá trị nhị phađn tương đương cụa 21543 . Ngược lái khi xuât sô lieơu , noơi dung nhị phađn cụa thanh ghi hoaịc vị trí nhớ phại được biên đoơi thành moơt chuoêi ký tự bieêu dieên moơt sô thaơp phađn trước khi chúng được in ra .
Xuât sô thaơp phađn ( Decimal Output)
Chúng ta sẽ viêt moơt thụ túc OUTDEC đeơ in noơi dung cụa thanh ghi AX như là moơt sô nguyeđn thaơp phađn có dâu . Nêu AX>0 ,OUTDEC sẽ in noơi dung cụa AX dưới dáng thaơp phađn . Nêu AX<0 , OUTDEC sẽ in dâu trừ (-) , thay AX = -AX ( đoơi thànb sô dương ) roăi in sô dương này sau dâu trừ (-). Như vaơy là trong cạ 2 trường hợp , OUTDEC sẽ in giá trị thaơp phađn tương đương cụa moơt sô dương . Sau đađy là thuaơt toán :
Algorithm for Decimal Output
1. IF AX < 0 / AX hold output value / 2. THEN
3. PRINT a minus sign
4. Replace AX by its two’s complement 5. END_IF
6. Get the digits in AX’s decimal representation 7. Convert these digits to characters and print them .
Đeơ hieơu chi tiêt bước 6 caăn phại làm vieơc gì , chúng ta giạ sử raỉng noơi dung cụa AX là moơt sô thaơp phađn , ví dú 24618 thaơp phađn . Có theơ lây các digits thaơp phađn cụa 24618 baỉng cách chia laịp lái cho 10d theo thụ túc như sau :
Divide 24618 by 10 . Qoutient = 2461 , remainder = 8 Divide 2461 by 10 . Qoutient = 246 , remainder = 1 Divide 246 by 10 . Qoutient = 24 , remainder = 6 Divide 24 by 10 . Qoutient = 2 , remainder = 4 Divide 2 by 10 . Qoutient = 0 , remainder = 2
Các digits thu được baỉng cách lây các sô dư theo traơt tự ngược lái . Bước 7 cụa thuaơt toán có theơ thực hieơn baỉng vòng FOR như sau :
Chương 6 : Leơnh nhađn và chia 74 FOR count times DO
pop a digit from the stack convert it to a character output the character END_FOR
Code cho thụ túc OUTDEC như sau : OUTDEC PROC
; Print AX as a signed decimal integer ; input : AX
; output : none
PUSH AX ; save registers PUSH BX
PUSH CX PUSH DX ; IF AX<0
OR AX,AX ; AX < 0 ? JGE @END_IF1 ; NO , AX>0 ; THEN
PUSH AX ; save AX MOV DL,’-’ ; GET ‘-’ MOV AH,2
INT 21H ; print ‘-’ POP AX ; get AX back NEG AX ; AX = -AX @END_IF1:
; get decimal digits
XOR CX,CX ; clear CX for counts digit MOV BX,10d ; BX has divisor
@REPEAT1:
XOR DX,DX ; clear DX
DIV BX ; AX:BX ; AX = qoutient , DX= remainder
PUSH DX ; push remainder onto stack INC CX ; increment count
;until
OR AX,AX ; qoutient = 0? JNE @REPEAT1 ; no keep going ; convert digits to characters and print
Chương 6 : Leơnh nhađn và chia 75 ; for count times do
@PRINT_LOOP:
POP DX ; digits in DL
OR DL,30h ; convert digit to character INT 21H ; print digit
LOOP @PRINT_LOOP ;end_for
POP DX ; restore registers POP CX
POP BX POP AX RET
OUTDEC ENDP