【问题标题】:Convert Octal to Hex in assembly language using emu8086使用emu8086在汇编语言中将八进制转换为十六进制
【发布时间】:2021-11-08 01:16:32
【问题描述】:

我是组装新手。我的任务是将八进制转换为十六进制,反之亦然。我只能在两个不同的 asm 文件中将八进制编码为二进制,然后将二进制编码为十六进制。现在我真的很想将它们合并在一起,这样我就可以进行八进制到十六进制的转换。
以下是两个代码:

八进制转二进制

.MODEL SMALL

.DATA

    INP DB 0
    MSG_1 DB "ENTER AN OCTAL NUMBER: $"
    MSG_2 DB "BINARY VALUE OF THIS NUMBER: $"
.CODE

MAIN PROC

    MOV AX,@DATA
    MOV DS,AX
    
    LEA DX,MSG_1
    MOV AH,9
    INT 21H
    
    MOV SI,0
    MOV AH,1
    MOV CX,0
    INPUT: INT 21H
           MOV INP[SI],AL
           INC CX
           INC SI
           CMP AL,13
           JNE INPUT
           
    CALL NEWLINE
    CALL NEWLINE
            
    LEA DX,MSG_2
    MOV AH,9
    INT 21H 

    MOV DI,0 
    MOV AH,2
    DEC CX   
    
    OUTPUT: MOV BL,INP[DI]
            CALL CONVERTOCT
            INC DI
            LOOP OUTPUT
    
    MOV AH,4CH
    INT 21H

ENDP

NEWLINE PROC

    MOV AH,2
    MOV DL,10
    INT 21H
    MOV DL,13
    INT 21H
    RET

NEWLINE ENDP 

CONVERTOCT PROC 
    
    SUB BL,48
    SHL BL,5 
    
    MOV DH,0
    CONV:
    SHL BL,1
    JC PRINT1
    JMP PRINT0
    
    PRINT0:
    MOV DL,'0'
    INT 21H
    INC DH
    CMP DH,3
    JE EXIT 
    JMP CONV
    
    PRINT1: 
    MOV DL,'1'
    INT 21H
    INC DH
    CMP DH,3
    JE EXIT 
    JMP CONV
    
    EXIT:
    RET
    
     
    
    
CONVERTOCT ENDP

END

二进制转十六进制

.MODEL SMALL

.STACK 100H

.DATA 

    MSG_1 DB "ENTER BINARY NUMBER: $"
    MSG_2 DB "HEXADECIMAL OF THE NUMBER: $"
    MSG_3 DB "INVALID!  $"

.CODE

MAIN PROC 

    MOV AX,@DATA
    MOV DS,AX
    
    MOV AH,2
    MOV DL,0DH
    INT 21H
    MOV DL,0AH
    INT 21H
    
    MOV AH,9
    LEA DX,MSG_1
    INT 21H
    
    XOR BH,BH

    
INPUT: 

       MOV AH,1
       INT 21H
    
       MOV CH,AL
       CMP CH,0DH
       JE PRINT
    
       CMP CH,'0'
       JL EXIT 
    
       CMP CH,'1'
       JG EXIT
    
       AND CH,15
       SHL BH,1
       OR BH,CH
    
       JMP INPUT    

PRINT:
    
    MOV AH,2
    MOV DL,0DH
    INT 21H
    MOV DL,0AH
    INT 21H
    
    MOV AH,9
    LEA DX,MSG_2
    INT 21H
    
    MOV AH,2
    CMP BH,9
    JLE NUMBER 
    
    CMP BH,15
    JLE CHARACTER
    
NUMBER:
   
    ADD BH,48
    MOV AH,2
    MOV DL,BH
    INT 21H
    
    MOV AH,4CH
    INT 21H
    

CHARACTER:

    ADD BH,55
    MOV AH,2
    MOV DL,BH
    INT 21H
    
    MOV AH,4CH
    INT 21H
     

EXIT:

    MOV AH,2
    MOV DL,0DH
    INT 21H
    MOV DL,0AH
    INT 21H
    
    MOV AH,9
    LEA DX,MSG_3
    INT 21H
    
    MOV AH,4CH
    INT 21H
    MAIN ENDP

END MAIN

【问题讨论】:

  • 为数字声明一个变量Value: DW 0。从用户那里读取一个八进制数字,隔离它的低 3 位,制作SHL [Value],3,将这 3 位复制到它,然后继续直到读取0DH。现在你有了存储在 [Value] 中的八进制数,你可以用十六进制表示法打印。

标签: assembly hex number-formatting emu8086 octal


【解决方案1】:
.DATA
    INP DB 0

您可能需要先更正此错误。您的 INP 输入缓冲区只有一个字节的空间!正确的写法是INP db 6 dup (0),表示 5 个八进制数字和回车。

从八进制转换为十六进制

首先选择一个可用寄存器作为您将输入的八进制数字的累加器。选择BP 寄存器允许处理最多 5 个八进制数字。
然后修改第一个程序中的 CONVERTOCT 过程,不再打印二进制数字,而是在这个累加器中收集它们

CONVERTOCT PROC
    push cx
    mov  cl, 5      ; 8086 didn't have shift by immediate, and so should emu8086!
    shl  bl, cl     ; The conversion happens for free via this shift left
  CONV:
    shl  bl, 1      ; Out at the top
    rcl  BP, 1      ; In at the bottom
    sub  cl, 2      ; 3 iterations
    jnb  CONV
    pop  cx
    ret
CONVERTOCT ENDP

您的第二个程序(可以打印十六进制)期望其输入为BH。修改该代码以便它可以使用来自BP 寄存器的值,或者将您的野心降低到 2 个八进制数字并将BP 转换为BH

mov  bx, BP
mov  bh, bl

【讨论】:

    猜你喜欢
    • 2019-05-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 2014-03-24
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多