16进制装换成为其他进制关键在于得到键盘输入, 并将它保存在BINARY的这个变量里面,宏定义直接调用,例子中有 DISP ‘=’,etc 。子程序的话要注意对主程序的信息的保护和恢复,我在这里使用的是在子程序里面去保护主程序的方式,你也可以在主程序调用子程序之前就对主程序的信息进行保护,另外调用子程序是:CALL 子程序名。16进制装换成为其他进制只需要除以其他进制将余数压栈商不为零的话继续除法。
**例如16进制的A 装换成为2进制:
A/2=5………0 余数0入栈
5/2=2……….1 余数1入栈
2/2=1……….0 余数0入栈
1/2=0………..1 余数1入栈(由于此时的商为0则停止除法了)
出栈后为1010(对应A)**
看懂本例子的关键要对以下的关键代码段理解透彻:
MOV CL,4
SAL BX,CL
LAST1:
SAL BL,1
RCL BINARY,1
DEC CL
JNZ LAST1
全部示例代码:
DISP MACRO NNN
MOV AH,0EH
MOV AL,NNN
INT 10H
ENDM
DATAS SEGMENT USE16
MESG DB 'input 16 Decimal number',0DH,0AH,'$'
BINARY DW 0
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
mov AH,09H
MOV DX,OFFSET MESG
INT 21H
MOV CH,4
WANT_IN:
MOV AH,08H
INT 21H ;等待输入
MOV BL,AL
CMP AL,'0'
JL BEL
CMP AL,'9'
JA NEXT1
JMP NEXT2
NEXT1:
CMP AL,'A'
JL BEL
CMP AL,'F'
JG BEL
SUB BL,07H
NEXT2:
SUB BL,30H
DISP AL
MOV CL,4
SAL BX,CL
LAST1:
SAL BL,1
RCL BINARY,1
DEC CL
JNZ LAST1
DEC CH
JNZ WANT_IN
DISP 'H'
DISP '='
MOV CX,0
MOV AX,BINARY
MOV BX,02H
CALL MDIV
MOV BX,08H
CALL MDIV
MOV BX,0AH
CALL MDIV
MOV AH,4CH
INT 21H
MDIV PROC NEAR
PUSH AX ;在子程序中保护信息
PUSH BX
PUSH CX
PUSH DX
LAST2:
MOV DX,0
DIV BX
PUSH DX
INC CX
CMP AX,0
JNE LAST2
AGA:
POP DX
ADD DL,30H
DISP DL
LOOP AGA
DISP ' '
POP DX
POP CX
POP BX
POP AX
RET
MDIV ENDP
BEL:
DISP 7
JMP WANT_IN
CODES ENDS
END START
TART
运行结果:
参考书籍:编译原理图文教程