0

我正在网上搜索一段十六进制到十进制的代码,我偶然发现了这个。我对其进行了测试,尽管我不明白为什么,但它运行良好。

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,就这样把它推入堆栈。这是如何运作的?

4

1 回答 1

5

英特尔的手册对此非常清楚:

DIV r/m16无符号除以DX:AXr/m16结果存储在AX← Quotient ,DX← Remainder中。

正如您在手册中查找DIV指令所看到的那样,用于被除数、商和余数的确切寄存器取决于操作数的大小。

于 2016-01-14T15:51:10.040 回答