将十六进制数组转换为十进制数英特尔 8086 汇编语言
Converting an array of hexadecimal to decimal numbers Intel 8086 Assembly Language
以下是我的代码。 hex2dec 中的块成功地将单个十六进制数转换为十进制数。如果有人能指出我在使用数组时出错的地方,那将非常有帮助。谢谢
DATA SEGMENT
NUM DW 1234H,9H,15H
RES DB 3*10 DUP ('$','$','$')
SIZE DB 3
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA, CS:CODE
START:
MOV AX, DATA
MOV DS,AX
MOV DI,0
LOOP3:
MOV AX,NUM[DI]
LEA SI,RES[DI]
CALL HEX2DEC
LEA DX,RES[DI]
MOV AH,9
INT 21H
INC DI
CMP DI,3
JL LOOP3
MOV AH,4CH ; end program
INT 21H
CODE ENDS
HEX2DEC PROC NEAR
MOV CX,0
MOV BX,10
LOOP1:
MOV DX,0
DIV BX
ADD DL,30H
PUSH DX
INC CX
CMP AX,9
JG LOOP1
ADD AL,30H
MOV [SI],AL
LOOP2:
POP AX
INC SI
MOV [SI],AL
LOOP LOOP2
RET
HEX2DEC ENDP
END START
MOV AX,NUM[DI]
LEA SI,RES[DI]
LEA DX,RES[DI]
您正在将 DI
视为我们在任何高级语言中使用的数组索引。在汇编编程中,我们只在数组中使用 displacements aka offsets。
在你的程序中,由于NUM数组是由单词组成的,你需要依次给DI
寄存器赋值0、2和4。
ADD DI, 2
CMP DI, 6
JB LOOP3
此外,最好不要将 RES 视为数组。只需将其视为缓冲区并始终从一开始就使用它。
RES DB 10 DUP (0)
...
LEA SI, RES
CALL HEX2DEC
LEA DX, RES
HEX2DEC 的更好版本避免了在单个数字上使用丑陋的前缀“0”:
HEX2DEC PROC NEAR
XOR CX, CX <--- Same as MOV CX,0
MOV BX,10
LOOP1:
XOR DX, DX <--- Same as MOV DX,0
DIV BX
ADD DL, 30H
PUSH DX
INC CX
TEST AX, AX
JNZ LOOP1
LOOP2:
POP AX
MOV [SI], AL
INC SI
LOOP LOOP2
MOV AL, "$" <--- Add this to use DOS function 09h
MOV [SI], AL
RET
HEX2DEC ENDP
以下是我的代码。 hex2dec 中的块成功地将单个十六进制数转换为十进制数。如果有人能指出我在使用数组时出错的地方,那将非常有帮助。谢谢
DATA SEGMENT
NUM DW 1234H,9H,15H
RES DB 3*10 DUP ('$','$','$')
SIZE DB 3
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA, CS:CODE
START:
MOV AX, DATA
MOV DS,AX
MOV DI,0
LOOP3:
MOV AX,NUM[DI]
LEA SI,RES[DI]
CALL HEX2DEC
LEA DX,RES[DI]
MOV AH,9
INT 21H
INC DI
CMP DI,3
JL LOOP3
MOV AH,4CH ; end program
INT 21H
CODE ENDS
HEX2DEC PROC NEAR
MOV CX,0
MOV BX,10
LOOP1:
MOV DX,0
DIV BX
ADD DL,30H
PUSH DX
INC CX
CMP AX,9
JG LOOP1
ADD AL,30H
MOV [SI],AL
LOOP2:
POP AX
INC SI
MOV [SI],AL
LOOP LOOP2
RET
HEX2DEC ENDP
END START
MOV AX,NUM[DI] LEA SI,RES[DI] LEA DX,RES[DI]
您正在将 DI
视为我们在任何高级语言中使用的数组索引。在汇编编程中,我们只在数组中使用 displacements aka offsets。
在你的程序中,由于NUM数组是由单词组成的,你需要依次给DI
寄存器赋值0、2和4。
ADD DI, 2
CMP DI, 6
JB LOOP3
此外,最好不要将 RES 视为数组。只需将其视为缓冲区并始终从一开始就使用它。
RES DB 10 DUP (0)
...
LEA SI, RES
CALL HEX2DEC
LEA DX, RES
HEX2DEC 的更好版本避免了在单个数字上使用丑陋的前缀“0”:
HEX2DEC PROC NEAR
XOR CX, CX <--- Same as MOV CX,0
MOV BX,10
LOOP1:
XOR DX, DX <--- Same as MOV DX,0
DIV BX
ADD DL, 30H
PUSH DX
INC CX
TEST AX, AX
JNZ LOOP1
LOOP2:
POP AX
MOV [SI], AL
INC SI
LOOP LOOP2
MOV AL, "$" <--- Add this to use DOS function 09h
MOV [SI], AL
RET
HEX2DEC ENDP