汇编-输入8位二进制串并转换为16进制数显示到屏幕(利用8421转换)

今天编写了一个
输入二进制串并转换为16进制数显示到屏幕
的汇编程序

在编写过程中遇到一些问题,并解决后,想把它与大家分享。

题目是这样的:
在这里插入图片描述
分析题目:
可得要求
输入 11111111
得到 00FFH

那么思路就是:
0.输入类似11111111的8位二进制
1.对输入的字符串要转换为对应的数字0,1二进制存在内存中。
2.对输入的字符串可通过8421方法计算10进制存到AX。
3.输出AX

那么代码:

数据段:
汇编-输入8位二进制串并转换为16进制数显示到屏幕(利用8421转换)_第1张图片
用8421计算2进制串的10进制数子过程:

do8421:
    ;计算每4位的8421之和
    MOV AL,8
    MUL TEMP[BX]
    ADD S8421,AL
    MOV AL,4
    MUL TEMP[BX+1]
    ADD S8421,AL
    MOV AL,2
    MUL TEMP[BX+2]
    ADD S8421,AL
    MOV AL,1
    MUL TEMP[BX+3]
    ADD S8421,AL
RET 

第0步:输入类似11111111的8位二进制

  ; 输入8位二进制数的字符串到TEMP
    MOV DX,OFFSET TEMP
    MOV AH,0AH
    INT 21H

第1步:对输入的字符串要转换为对应的数字0,1二进制存在内存中。

 ; 将TEMP中16进制数字符串转为二进制(对应字符转数字ascll)
 MOV CX,9;有8位

 TO:
  ;将字符0,1转为数字0,1
 MOV BX,CX
 ;去除第一二单元
 SUB TEMP[BX+1],48
 LOOP TO

第2步:对输入的字符串可通过8421方法计算10进制存到AX。

 ;每4位做8421转换
 ;高4位之和
 MOV BX,2;
 CALL do8421

 ;暂存
 MOV DH,S8421
 MOV CL,4
 SHL DH,CL
 ;清零
 MOV S8421,0
 ;低4位之和
 MOV BX,6
 CALL do8421

 ;求OR得到16进制数到AL10
 MOV AL,DH
 OR AL,S8421

第3步:输出AX

  ; AH清零
   SUB AH,AH
    ;输出do8421的值->Temp16
   MOV SI,OFFSET Temp16+3;保存存储结果的字符串的最后一个字符偏移地址
   
   XOR CX,CX
   MOV CL,4
   MainPart:
  ;输出最终字符结果
   MOV DH,AL ;将Al的内容传送给DH
   
   SHR AX,1
   SHR AX,1
   SHR AX,1
   SHR AX,1

   AND DH,0FH
   ADD DH,48
   CMP DH,':'  ;':'的ASCII比9大1 而字母的ASCII码与数字的ASCII码中间隔了7个其它字符
   JA isLetter ;如果为字母则跳转
   JB No       ;如果不是

   isLetter:
   ADD DH,07H   ;ASCII码加7变为字母
   No:
   MOV [SI], DH ;将字符存入,待存放内容的字符串的对应位置
   DEC SI      ;待存放内容的内存地址自减1
   LOOP MainPart
  
   MOV AH,02H
   MOV DL,0AH 
   INT 21H
   MOV AH,02H
   MOV DL,0DH 
   INT 21H
   ; LEA DX, Temp16
   MOV DX,OFFSET Temp16
   MOV AH,09H
   INT 21H

给出完整代码:

;@author:joker
;@date: 2020-5-12
;@description: 第十次作业第二题;输入8位二进制数转16进制数输出;利用BCD8421
DATA SEGMENT
TEMP DB 9,0,9 DUP(0);存进制数&回车 

Temp16 DB "****H$";存放字符形式的2位16进制(8位二进制)
S8421 DB 0;存储每4位16进制数;高低4位
INPUT DB "the symbol =(0 | 1),length=8,other=error$"
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
do8421:
    ;计算每4位的8421之和
    MOV AL,8
    MUL TEMP[BX]
    ADD S8421,AL
    MOV AL,4
    MUL TEMP[BX+1]
    ADD S8421,AL
    MOV AL,2
    MUL TEMP[BX+2]
    ADD S8421,AL
    MOV AL,1
    MUL TEMP[BX+3]
    ADD S8421,AL
RET  
STRAT:
    MOV AX,DATA
    MOV DS,AX

    MOV DX,OFFSET INPUT
    MOV AH,09H
    INT 21H

    MOV AH,02H
    MOV DL,0AH
    INT 21H

    MOV AH,02H
    MOV DL,0DH
    INT 21H
    ; 输入8位二进制数的字符串到DX->TEMP
    MOV DX,OFFSET TEMP
    MOV AH,0AH
    INT 21H
   
    ; 将TEMP中16进制数字符串转为二进制(对应字符转数字ascll)
    MOV CX,9;有8位

    TO:
     ;将字符0,1转为数字0,1
    MOV BX,CX
    ;去除第一二单元
    SUB TEMP[BX+1],48
    LOOP TO

    ;每4位做8421转换
    ;高4位之和
    MOV BX,2;
    CALL do8421

    ;暂存
    MOV DH,S8421
    MOV CL,4
    SHL DH,CL
    ;清零
    MOV S8421,0
    ;低4位之和
    MOV BX,6
    CALL do8421

    ;求OR得到16进制数到AL10
    MOV AL,DH
    OR AL,S8421
  
    ; AH清零
    SUB AH,AH
     ;输出do8421的值->Temp16
    MOV SI,OFFSET Temp16+3;保存存储结果的字符串的最后一个字符偏移地址
    
    XOR CX,CX
    MOV CL,4
    MainPart:
   ;输出最终字符结果
    MOV DH,AL ;将Al的内容传送给DH
    
    SHR AX,1
    SHR AX,1
    SHR AX,1
    SHR AX,1

    AND DH,0FH
    ADD DH,48
    CMP DH,':'  ;':'的ASCII比9大1 而字母的ASCII码与数字的ASCII码中间隔了7个其它字符
    JA isLetter ;如果为字母则跳转
    JB No       ;如果不是

    isLetter:
    ADD DH,07H   ;ASCII码加7变为字母
    No:
    MOV [SI], DH ;将字符存入,待存放内容的字符串的对应位置
    DEC SI      ;待存放内容的内存地址自减1
    LOOP MainPart
   
    MOV AH,02H
    MOV DL,0AH 
    INT 21H
    MOV AH,02H
    MOV DL,0DH 
    INT 21H
    ; LEA DX, Temp16
    MOV DX,OFFSET Temp16
    MOV AH,09H
    INT 21H
    
    MOV AH,4CH
    INT 21H
CODE ENDS
END STRAT

完。
加油!相信自己!

提示:代码虽好,但步骤同样重要,动手更重要!

你可能感兴趣的:(汇编,技术性,二进制转16进制,汇编,8421)