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

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

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值