十进制转换十六进制(汇编代码)

.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 ;AX
RES->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

你可能感兴趣的:(十进制转换十六进制(汇编代码))