【发布时间】: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