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
push ax
lea dx,Str_Addr
mov ah,9
int 21h
pop ax
EndM
; -------------------------------------
; 功能:在當前光標位置顯示壹個字符
; 入口:dl=要顯示的字符
Output_Chr proc Near
push ax
mov ah,2
int 21h
pop ax
ret
Output_Chr Endp
; -------------------------------------
; 功能:取光標位置
; 入口:無
; 出口:DH=行號,DL=列號
GetCursor Proc Near
PUSH DS
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH CS
POP DS
XOR BX,BX
MOV AH,3
INT 10H
MOV Cursor_Row,DH
MOV Cursor_Col,DL
POP DX
POP CX
POP BX
POP AX
POP DS
RET
Cursor_Row DB ?
Cursor_Col DB ?
GetCursor EndP
; -------------------------------------
; 功能:置光標位置
; 入口:Cursor_Row=行坐標; Cursor_Col: 列坐標)
SetCursor Proc Near
PUSH DS
PUSH DX
PUSH CX
PUSH BX
PUSH AX
PUSH CS
POP DS
MOV DH,Cursor_Row
MOV DL,Cursor_Col
XOR BX,BX
MOV AH,2
INT 10H
POP AX
POP BX
POP CX
POP DX
POP DS
RET
SetCursor EndP
; -------------------------------------
; 功能:鍵盤輸入壹個指定位數(N)的十進制數字,將其轉換成二進制數並保存在指定的內存單元。
; 輸足N位的,自動結束輸入;不足N位的,空格結束輸入。
; 由於限定最大數據類型為字,所以,數字位數最多:5,最大無符號數:65536
; 約定:直接回車,視為數字0
; 入口:cs:@@Digits=數字位數;es:di=保存輸入的數字首地址
; cs:@@Type_Data=保存的數據類型,B=字節類型,W=字類型。
; 出口:轉換後的二進制數保存在di所指的單元
Input_Dec Proc Near
push ds
push dx
push cx
push bx
push di
push cs
pop ds
call GetCursor ;取光標位置
mov dx,WORD PTR Cursor_Row
mov @@Tmp_Cursor,dx ;保存起始光標位置
lea di,@@Save_Tmp
push di
cld
mov cl,@@Digits
xor ch,ch
push cx
@@Input_Dec: 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: cmp cl,cs:@@Digits ;十進制數字位數
jz @@Input_Dec
inc cx
dec di
dec Cursor_Col
@@KBBack: call SetCursor ;置光標位置
jmp @@Input_Dec
@@Save_Dig: and al,0fh ;轉換成二進制數
stosb ;保存
loop @@Input_Dec ;接受下壹個數字
@@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
xor ah,ah
add ax,bp
mul bx
mov bp,ax
loop @@Mul_Ten
@@One_Digit: lodsb
xor ah,ah
add ax,bp
@@Save_Ret: pop di
cmp @@Type_Data,'B' ;字節類型?
jz $+5
stosw
jmp $+3
stosb
pop bx
pop cx
pop dx
pop ds
ret
@@Tmp_Cursor dw ? ;起始光標位置
@@Digits db ? ;十進制數字位數
@@Type_Data db 'B' ;保存的數據類型。B=字節類型,W=字類型
@@Save_Tmp db 7 dup(?)
Input_Dec 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
; -------------------------------------
; 功能:將AL中的字節數據轉換成十六進制顯示的ASCII碼
; 入口:AL
; 出口:AX=轉換後的ASCII碼
Byte_ASCII Proc Near
push cx
mov cx,4
xor ah,ah ;將AH置0
shl ax,cl ;將AX左移4位
shr al,cl ;將AL右移4位
xchg ah,al
call AL_ASCII ;調用子程序,將AL中的值轉換成相應的ASCII碼
xchg ah,al
call AL_ASCII
xchg ah,al
pop cx
ret
Byte_ASCII EndP
; -------------------------------------
; 功能:將AL中的字節數據轉換成十六進制顯示的ASCII碼,並在當前光標位置顯示
; 入口:AL
; 出口:AX=轉換後的ASCII碼
ByteD_ASCII Proc Near
push dx
push ax
call Byte_ASCII ;將AL中的字節數轉換成十六進制顯示的ASCII碼
cmp al,'9'
jbe $+7
mov dl,'0'
call Output_Chr ;顯示壹個字符
mov dl,al
call Output_Chr ;顯示壹個字符
mov dl,ah
call Output_Chr ;顯示壹個字符
mov dl,'H'
call Output_Chr ;顯示壹個字符
pop ax
pop dx
ret
ByteD_ASCII EndP
; -------------------------------------
; 功能:將AX中的字數據轉換成十六進制顯示的ASCII碼,並在當前光標位置顯示
; 入口:AX
WordD_ASCII Proc Near
push dx
push ax
push ax
xchg ah,al
call Byte_ASCII ;將AL中的字節數轉換成十六進制顯示的ASCII碼
cmp al,'9'
jbe $+7
mov dl,'0'
call Output_Chr ;顯示壹個字符
mov dl,al
call Output_Chr ;顯示壹個字符
mov dl,ah
call Output_Chr ;顯示壹個字符
pop ax
call Byte_ASCII ;將AL中的字節數轉換成十六進制顯示的ASCII碼
mov dl,al
call Output_Chr ;顯示壹個字符
mov dl,ah
call Output_Chr ;顯示壹個字符
mov dl,'H'
call Output_Chr ;顯示壹個字符
pop ax
pop dx
ret
WordD_ASCII EndP
; -------------------------------------
Number dw ?
Prompt_Str db 13,10,'Please input a decimal number(4 decimal digits):$'
Press_Key db 7,13,10,10,'The complated. Press any key to exit...$'
Start: push cs
pop ds
push cs
pop es
mov @@Digits,4 ;十進制數字位數
mov @@Type_Data,'W' ;保存的數據類型。B=字節類型,W=字類型
@@Input_Digit: Output Prompt_Str ;提示輸入4位十進制數
lea di,Number ;es:di=保存輸入的數字首地址
call Input_Dec ;輸入壹個指定位數(N)的十進制數字,將其轉換成二進制數並保存在指定的內存單元
mov ax,0e20h
int 10h
int 10h
mov ax,Number
test ax,ax
jz Exit_Proc
call WordD_ASCII ;將AX中的字數據轉換成十六進制顯示的ASCII碼,並在當前光標位置顯示
jmp @@Input_Digit
; -------------------------------------
Exit_Proc: Output Press_Key ;提示操作完成,按任意鍵結束程序
mov ah,1
int 21h
mov ah,4ch ;結束程序
int 21h
Code ENDS
END Start ;編譯到此結束