在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 指令所看到的那样,用于被除数、商和余数的确切寄存器取决于操作数的大小。