我在网上搜索十六进制到十进制的代码,我偶然发现了这一点。我对它进行了测试,虽然我不明白为什么,但它的工作原理很完美。
DATA SEGMENT
NUM DW 01FH
BUFFER DB 10 DUP ('$')
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AX,NUM
LEA SI,BUFFER
CALL HEX2DEC
LEA DX,BUFFER
MOV AH,9
INT 21H
MOV AH,4CH
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
JA LOOP1
ADD AL,30H
MOV [SI],AL
LOOP2:
POP AX
INC SI
MOV [SI],AL
LOOP LOOP2
RET
HEX2DEC ENDP
END START
虽然分裂发生了,但是这个人使用DL而不是AL,只是将它推到了堆栈中。这有什么作用?
答案 0 :(得分:5)
Intel's manual非常清楚:
DX:AX
r/m16
的无符号除AX
,结果 存储在DX
←商数,DIV
←余数。
正如您所看到的,如果查看手册中的Map
指令,用于被除数,商和余数的确切寄存器取决于操作数的大小。