Code Segment
Assume CS:Code,DS:Code
CR equ 000DH
LF equ 000AH
KBBack equ 0008H
; -----------------------------------------
; 功能:顯示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在數據段)
; 用法: Output Str_Addr
; 用法舉例:Output PromptStr
Output MACRO Str_Addr
lea dx,Str_Addr
mov ah,9
int 21h
EndM
; -----------------------------------------
; 功能:輸出回車換行
Output_CTLF proc Near
push ax
push dx
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
Output_CTLF endp
; -----------------------------------------
; 功能:取光標位置
; 入口:無
; 出口:DH=行號,DL=列號
GetCursor Proc Near
PUSH AX
PUSH BX
PUSH CX
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP CX
POP BX
POP AX
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -----------------------------------------
; 功能:置光標位置
; 入口:Cursor_Row=行坐標; Cursor_Col: 列坐標)
SetCursor Proc Near
PUSH CX
PUSH BX
PUSH AX
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
RET
SetCursor EndP
; -----------------------------------------
; 功能:鍵盤輸入壹個指定位數的十進制數字,將其轉換成二進制數並保存在指定的內存單元。
; 入口:@@Digits=數字位數;di=保存輸入的數字首地址
; @@Type_Data=保存的數據類型,B=字節類型,W=字類型。
; 出口:轉換後的二進制數保存在di所指的單元
Input_Digit Proc Near
push dx
push cx
push bx
push di
lea di,@@Save_Tmp
push di
cld
mov cl,@@Digits
xor ch,ch
push cx
@@Input: call GetCursor ;取光標位置
mov ah,1 ;從鍵盤接受壹個字符
int 21h
cmp al,CR ;若鍵入的是回車,已經鍵入的數字不足N位
jz @@ASC_Dec ;轉去處理已經鍵入的數字
cmp al,KBBack
jz @@KB_Back ;若是回空鍵,重新輸入
cmp al,'0'
jb @@KBBack ;若低於數字'0',重新輸入
cmp al,'9'
ja @@KBBack ;若低於數字'9',重新輸入
jmp @@Save_Dig
@@KB_Back: dec Cursor_Col
inc cx
dec di
@@KBBack: call SetCursor ;置光標位置
jmp @@Input
@@Save_Dig: and al,0fh ;轉換成二進制數
stosb ;保存
loop @@Input ;接受下壹個數字
@@ASC_Dec: mov ax,cx
pop cx
pop si
sub cx,ax ;實際輸入的數字位數
xor bp,bp
xor dx,dx
xor ax,ax
jcxz @@Save_Ret ;若直接回車,沒有輸入任何數字,按輸入'0'處理
dec cx ;實際輸入的數字位數減1,準備把輸入的這壹串數字轉換成二進制數
jcxz @@One_Digit ;若輸入的數字只有壹位,轉去直接保存這個二進制數
mov bx,10
@@Mul_Ten: lodsb
cbw
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit:lodsb
cbw
add ax,bp
@@Save_Ret: pop di
cmp @@Type_Data,'B' ;字節類型?
jz $+5
stosw
jmp $+3
stosb
pop bx
pop cx
pop dx
ret
@@Digits db ? ;十進制數字位數
@@Type_Data db 'B' ;保存的數據類型。B=字節類型,W=字類型
@@Save_Tmp db 16 dup(?)
Input_Digit EndP
; -----------------------------------------
; 功能:將AL中的低4位二進制數轉換成十六進制顯示的ASCII碼
; 入口:AL
; 出口:AL=轉換後的ASCII碼
AL_ASCII Proc Near
cmp al,10 ;AL<10?
jb @@To_ASCII ;AL<10,按數字處理
add al,7 ;AL>=10,按大寫字母處理
@@To_ASCII: add al,'0' ;轉換成相應的數字或大寫字母
ret
AL_ASCII EndP
; -----------------------------------------
Number dw ?
prompt_One db 'Please input a decimal number(2-4bits): $'
prompt_Two db 'The binary: $'
prompt_Thr db 'The heximal: $'
Start: push cs
pop ds
push cs
pop es ;使數據段、附加段與代碼段同段
mov @@Digits,4 ;十進制數字位數
mov @@Type_Data,'W' ;保存的數據類型。B=字節類型,W=字類型
Input_Deci: Output prompt_One ;提示輸入壹個十進制數
lea di,Number ;變量Number的地址
call Input_Digit ;鍵盤輸入壹個指定位數的十進制數字,將其轉換成二進制數並保存在指定的內存單元
cmp Number,10
jb Input_Deci ;少於2位十進制數,重新輸入
call Output_CTLF ;輸出壹個回車、換行
call Output_CTLF ;輸出壹個回車、換行
; -----------------------------------------
; 轉換為對應的二進制數
Output prompt_Two
lea di,@@Save_Tmp[14]
mov word ptr [di],'$B'
mov ax,Number
@@L0: dec di
test ax,0ffffh
jz @@L1
shr ax,1
jc $+7
mov byte ptr [di],'0'
jmp @@L0
mov byte ptr [di],'1'
jmp @@L0
@@L1: inc di
mov dx,di
mov ah,9
int 21h
; -----------------------------------------
; 轉換為對應的十六進制數
call Output_CTLF ;輸出壹個回車、換行
Output prompt_Thr
mov ax,Number
lea di,@@Save_Tmp[14]
mov word ptr [di],'$H'
mov cl,4
mov ax,Number
@@L2: dec di
test ax,0ffffh
jz @@L3
mov bx,ax
shr bx,cl
and ax,0fh
call AL_ASCII ;將AL中的低4位二進制數轉換成十六進制顯示的ASCII碼
mov [di],al
mov ax,bx
jmp @@L2
@@L3: inc di
mov dx,di
mov ah,9
int 21h
Exit_Proc: mov ah,4ch ;結束程序
int 21h
Code ENDS
END Start ;編譯到此結束