微机原理吧 关注:3,491贴子:15,894
  • 9回复贴,共1

从键盘输入四位十六进制数,将其变换成十进制数显示出来。

只看楼主收藏回复

从键盘输入四位十六进制数,将其变换成十进制数显示出来。
要求:
1. 设计一个名为ASC_BIN的通用子程序。
功能:将四位ASCII码表示的十六进制数转换为两字节表示的二进制数。
入口参数:DS:BX 指向数据区中存放ASCII码的首地址。
出口参数:AX 存放转换后的二进制数。CF存返回标志,CF=0 表示转换成功,CF=1 表示转换不成功,
数据区中有非十六进制数的ASCII码。
2. 设计一个名为HEX_BCD的通用子程序。
功能:将一个两字节的十六进制数转换为非压缩的BCD码。
入口参数:AX 中存放要转换的十六进制数。
DS:BX 指向数据区中存放非压缩BCD码的末地址(即个位地址)。
出口参数:无 (DS:BX 指向数据区中存放非压缩BCD码的首地址)
3. 编写主程序,调用以上两个子程序,完成十六进制数的输入、转换和十进制数显示功能。


1楼2017-04-25 10:47回复
    ;8086汇编语言,32位无符号整数
    ;从键盘输入四位十六进制数,将其变换成十进制数显示出来。
    DATA SEGMENT ;数据段
    STRING DB 'INPUT 4 HEX NUMBERS:','$'
    ONELINE DB 0DH,0AH,'$'
    ER_MSG DB 'WRONG NUMBERS','$'
    INPUT DB 5 ;键盘最多输入4个字符
    DB 0 ;记录实际输入多少个字符
    DB 0,0,0,0,0 ;缓存,用于存放4个字符
    RESULT DB 0,0,0,0,0,'$'
    DATA ENDS
    CODE SEGMENT ;代码段
    ASSUME CS:CODE,DS:DATA
    START:
    MOV AX,DATA
    MOV DS,AX
    LEA DX,STRING
    MOV AH,9
    INT 21H
    LEA DX,INPUT
    MOV AH,0AH ;键盘输入字符串
    INT 21H
    LEA DX,ONELINE
    MOV AH,9
    INT 21H
    LEA BX,INPUT+2
    CALL ASC_BIN ;ASCII码转换为二进制数
    JC ERROR_NUM
    LEA BX,RESULT+4
    CALL HEX_BCD ;十六进制数转换为非压缩的BCD码
    DISP_NEXT:
    MOV DL,[BX]
    CMP DL,'$'
    JE TO_EXIT
    ADD DL,30H
    MOV AH,2
    INT 21H
    INC BX
    JMP DISP_NEXT
    ERROR_NUM:
    LEA DX,ER_MSG
    MOV AH,9
    INT 21H
    TO_EXIT:
    MOV AH,4CH ;返回DOS
    INT 21H
    ;子过程功能:将四位ASCII码表示的十六进制数转换为两字节表示的二进制数。
    ;入口参数:DS:BX 指向数据区中存放ASCII码的首地址。
    ;出口参数:AX 存放转换后的二进制数。CF存返回标志,CF=0 表示转换成功,
    ;CF=1 表示转换不成功,数据区中有非十六进制数的ASCII码。
    ASC_BIN PROC
    PUSH BX
    PUSH CX
    PUSH DX
    PUSH SI
    MOV SI,BX
    MOV CX,4
    ASC_BIN_NEXT:
    MOV AL,[BX]
    CMP AL,'0'
    JB ASC_BIN_ERROR
    CMP AL,'9'
    JA CHECK_UPPER
    SUB AL,30H
    JMP GO_ON
    CHECK_UPPER:
    CMP AL,'A'
    JB ASC_BIN_ERROR
    CMP AL,'F'
    JA CHECK_LOWER
    SUB AL,37H
    JMP GO_ON
    CHECK_LOWER:
    CMP AL,'a'
    JB ASC_BIN_ERROR
    CMP AL,'f'
    JA ASC_BIN_ERROR
    SUB AL,57H
    GO_ON:
    MOV [BX],AL
    INC BX
    LOOP ASC_BIN_NEXT
    MOV BX,SI
    XOR AX,AX
    MOV CL,4
    MOV DL,[BX]
    SHL DL,CL
    MOV AH,DL
    MOV DL,[BX+1]
    OR AH,DL
    MOV DL,[BX+2]
    SHL DL,CL
    MOV AL,DL
    MOV DL,[BX+3]
    OR AL,DL
    CLC ;进位标志清零,CF=0
    JMP ASC_BIN_EXIT
    ASC_BIN_ERROR:
    STC ;进位标志置1,CF=1
    ASC_BIN_EXIT:
    POP SI
    POP DX
    POP CX
    POP BX
    RET
    ASC_BIN ENDP
    ;子过程功能:将一个两字节的十六进制数转换为非压缩的BCD码。
    ;入口参数:AX 中存放要转换的十六进制数。
    ;DS:BX 指向数据区中存放非压缩BCD码的末地址(即个位地址)。
    ;出口参数:DS:BX 指向数据区中存放非压缩BCD码的首地址
    HEX_BCD PROC
    PUSH AX
    PUSH CX
    PUSH DX
    MOV DX,0
    MOV CX,10
    HEX_BCD_NEXT:
    DIV CX ;除以10,得到余数
    MOV [BX],DL
    CMP AX,0
    JZ HEX_BCD_EXIT
    DEC BX
    MOV DX,0
    JMP HEX_BCD_NEXT
    HEX_BCD_EXIT:
    POP DX
    POP CX
    POP AX
    RET
    HEX_BCD ENDP
    CODE ENDS
    END START


    2楼2017-04-25 10:51
    收起回复
      如何将转换好的非压缩bcd显示出来


      来自Android客户端3楼2017-04-26 18:00
      回复
        ;上述代码
        ;......
        LEA BX,RESULT+4 ;此时,BX指向存放[非压缩BCD码]的末地址(即个位地址)
        CALL HEX_BCD ;十六进制数转换为[非压缩BCD码]
        ;执行子过程HEX_BCD之后,BX指向存放[非压缩BCD码]的首地址.
        ;例如,已经将FFFF(十六进制)转换为65535(非压缩BCD码),
        ;此时,BX指向65535(非压缩BCD码)的首地址,即指向"6"这个位置.
        ;以下代码就是将65535(非压缩BCD码)逐个转换为ASCII码,逐个显示到屏幕上.
        DISP_NEXT:
        MOV DL,[BX];提取一个[非压缩BCD码]
        CMP DL,'$'
        JE TO_EXIT
        ADD DL,30H ;将这个[非压缩BCD码]转换为[ASCII码]
        MOV AH,2 ;调用21H中断的2号功能,屏幕显示1个字符[ASCII码]
        INT 21H
        INC BX
        JMP DISP_NEXT;继续循环显示字符
        ......


        4楼2017-04-26 18:15
        回复


          IP属地:北京5楼2017-11-01 20:10
          回复
            RESULT DB 0,0,0,0,0,'$'请问这句什么意思?谢谢


            IP属地:浙江6楼2018-03-20 12:36
            回复
              请问如何将二进制结果和BCD码打印出来?


              IP属地:重庆8楼2021-05-10 14:47
              回复