.MODEL TINY
.STACK 100
.DATA
BUFFER DB 8 DUP(?)
OUTPUT DB 8 DUP(?)
RES DW 0 ;十六進制
msg1 DB 0DH,0AH,'請輸入十進制數: $'
msg2 DB 0DH,0AH,'對應的十六進制數為: $'
.CODE
START: MOV AX,@DATA
MOV DS,AX ;DS指向DATA段
MOV ES,AX
CLD ;方向標志置0,使得地址指針自動加1 影響SI DI
NOP ;執行NOP指令只使程序計數器PC加1,所以占用一個機器周期
MOV AH,00H
MOV AL,03H
INT 10H ;清屏
START1: MOV AH,09H
LEA DX,msg1
INT 21H ;09號功能調用,輸出以$號結束的字符串
CALL GetNum ;得到雙字節十進制數(被加數)
JNB EXIT ;JNB這是兩個無符號數相比較后判斷大小,如果不小于轉移。CF=0跳轉
LEA DI,OUTPUT ;將十進制數分離化為ASCII存入output
MOV CX,4 ;雙字節所以只能是4次咯
MOV AX,RES
TOASCLL1:
PUSH AX
AND AH,0F0H ;得到AX最高位
SHR AH,4 ;將最高位移到AL的低4位中
ADD AH,30H
MOV AL,AH
CMP AL,3AH
JB TOASCLL2 ;小于則轉移,通過CF判斷
ADD AL,07H ;化為ASCII存入
TOASCLL2:
STOSB ;存到OUTPUT 將累加器AL中的值傳遞到當前ES段的DI地址處,并且根據DF的值來影響DI的值,如果DF為0,則調用該指令后,DI自增1,
POP AX
SHL AX,4 ;每次左移4位得到下一位16進制的數放到AX的高4位
LOOP TOASCLL1
MOV AL,'H'
STOSB
MOV AL,'$'
STOSB
CALL DISPLAYRES
JMP START1
EXIT: MOV AH,4CH
INT 21H
DISPLAYRES PROC NEAR
LEA SI,OUTPUT
MOV CX,3
DIS1:
LODSB
CMP AL,'0'
LOOPZ DIS1 ;高位如果是0則跳過(ZF=1且CX!=0則循環)
DEC SI ;LODSB 會每次讓SI加1
MOV AH,09H
MOV DX,OFFSET msg2 ;輸出提示消息
INT 21H
MOV AH,09H ;輸出16進制
MOV DX,SI
INT 21H
RET
DISPLAYRES ENDP
GetNum PROC NEAR ;proc是子程序定義偽指令 為子程序定義及說明 子程序名 PROC NEAR
LEA DX,BUFFER ;取偏移地址
MOV AH,0AH
MOV AL,02H
INT 21H ;0A號功能調用,02輸入十進制
MOV CL,[BUFFER+1]
XOR AH,AH ;AH清0,清除當時送的OAH
JCXZ ERROR ;JCXZ是條件轉移指令 cx=0跳轉error
LEA SI,BUFFER+2 ;指向數據的有效首地址
GetNum1: ;將RES每次10加上AL
LODSB ;LODSB用于目的地址的內容讀到源地址,即目標地址為:ES:DI,源地址為DS:SILODS
; AND AL,0FH
MOV BX,AX
MOV AX,10
MUL RES ;AXRES->AX
MOV RES,AX ;AX->RES
ADD RES,BX ;RES+AX 十進制轉換十六進制過程
LOOP GetNum1
STC ;CF=1
RET
ERROR: ;如果僅僅輸入的是ENTER,則結束
CLC
RET
GetNum ENDP
END START