在Assembly中,商和余数不去AL,AH吗?这里发生了什么?
In Assembly, doesn't the quotient and remainder go to AL,AH? What happens here?
我在网上搜索一段十六进制到十进制的代码,我偶然发现了这个。我测试了它,它运行良好,虽然我不明白为什么。
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,就这样把它推到堆栈上了。它是如何工作的?
Intel's manual 对此很清楚:
DIV r/m16
Unsigned divide DX:AX
by r/m16
, with result
stored in AX
← Quotient, DX
← Remainder.
正如您在手册中查找 DIV
指令所看到的那样,用于被除数、商和余数的确切寄存器取决于操作数的大小。
我在网上搜索一段十六进制到十进制的代码,我偶然发现了这个。我测试了它,它运行良好,虽然我不明白为什么。
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,就这样把它推到堆栈上了。它是如何工作的?
Intel's manual 对此很清楚:
DIV r/m16
Unsigned divideDX:AX
byr/m16
, with result stored inAX
← Quotient,DX
← Remainder.
正如您在手册中查找 DIV
指令所看到的那样,用于被除数、商和余数的确切寄存器取决于操作数的大小。