在大会中,商和余数不是去AL,AH吗?这里发生了什么?

Tas*_*dis 0 assembly emu8086

我正在网上搜索十六进制到十进制的代码,我偶然发现了这一点.我测试了它,它完美地工作,虽然我不明白为什么.

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
Run Code Online (Sandbox Code Playgroud)

尽管分裂发生了,但是这个人使用DL而不是AL,只是将它推到了堆栈中.这是如何运作的?

Mic*_*ael 5

英特尔的手册非常明确:

DIV r/m16无符号除法,DX:AX通过r/m16结果存储在AX←商数,DX←剩余.

如您所见,如果您查看DIV手册中的指令,则用于被除数,商和余数的确切寄存器取决于操作数的大小.

  • `DIV r/m8`将`AX`除以`r/m8`并将商存储在'AL`中,余数存储在`AH`中. (2认同)