汇编中16进制装换成为其他进制(2,8,10)

来源:互联网 发布:李荣浩后羿知乎 编辑:程序博客网 时间:2024/05/01 03:49

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  ENDMDATAS SEGMENT USE16    MESG DB 'input 16 Decimal number',0DH,0AH,'$'    BINARY DW 0DATAS ENDSSTACKS SEGMENT    ;此处输入堆栈段代码STACKS ENDSCODES SEGMENT    ASSUME CS:CODES,DS:DATASSTART:    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 21HMDIV 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    RETMDIV ENDP      BEL:     DISP  7    JMP WANT_INCODES ENDS    END STARTTART

运行结果:
这里写图片描述

参考书籍:编译原理图文教程

1 0
原创粉丝点击