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

时间:2016-01-14 15:48:32

标签: 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

虽然分裂发生了,但是这个人使用DL而不是AL,只是将它推到了堆栈中。这有什么作用?

1 个答案:

答案 0 :(得分:5)

Intel's manual非常清楚:

  

DX:AX r/m16的无符号除AX结果   存储在DX←商数,DIV←余数

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