DIV BX OVERFLOW
6.5 Thủ tục nhập xuất số thập phân
Mặc dù trong PC tất cả số liệu được biễu diễn dưới dạng binary . Nhưng việc biễu diễn dưới dạng thập phân sẽ thuận tiện hơn cho người dùng . Trong phần này chúng ta sẽ viết các thủ tục nhập xuất số thập phân .
Khi nhập số liệu , nếu chúng ta gõ 21543 chẳng hạn thì thực chất là chúng ta gõ vào một chuỗi ký tự , bên trong PC , chúng được biến đổi thành các giá trị nhị phân tương đương của 21543 . Ngược lại khi xuất số liệu , nội dung nhị phân của thanh ghi hoặc vị trí nhớ phải được biến đổi thành một chuỗi ký tự biễu diễn một số thập phân trước khi chúng được in ra .
Xuất số thập phaân ( Decimal Output)
Chúng ta sẽ viết một thủ tục OUTDEC để in nội dung của thanh ghi AX như là một số nguyên thập phân có dấu . Nếu AX>0 ,OUTDEC sẽ in nội dung của AX dưới dạng thập phân . Nếu AX<0 , OUTDEC sẽ in dấu trừ (-) , thay AX = -AX ( đổi thànb số dương ) rồi in số dương này sau dấu trừ (-). Như vậy là trong cả 2 trường hợp , OUTDEC sẽ in giá trị thập phân tương đương của một số dương . Sau đây là thuậ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 .
Để hiểu chi tiết bước 6 cần phải làm việc gì , chúng ta giả sử rằng nội dung của AX là một số thập phân , ví dụ 24618 thập phân . Có thể lấy các digits thập phân của 24618 bằng cách chia lặ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
Caùc digits thu được bằng cách lấy các số dư theo trật tự ngược lại . Bước 7 của thuật tốn có thể thực hiện bằng vịng FOR như sau :
Chương 6 : Lệnh nhâ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 thuû 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 : Lệnh nhâ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