.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