0

私はネット上で 16 進数から 10 進数へのコードを探していましたが、これに出くわしました。私はそれをテストしましたが、理由はわかりませんが、完全に機能します。

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

分裂は起こったが、この男は AL の代わりに DL を使用し、そのままスタックにプッシュした。それはどのように機能しますか?

4

1 に答える 1

5

Intel's manual is pretty clear on this:

DIV r/m16 Unsigned divide DX:AX by r/m16, with result stored in AX ← Quotient, DX ← Remainder.

As you can see if you look up the DIV instruction in the manual, the exact registers used for the dividend, quotient, and remainder depends on the size of the operand.

于 2016-01-14T15:51:10.040 に答える