除法指令:DIV 和 IDVI

▷除法指令:(被除数) ÷ (除数) = (商数),(余数)

  • DIV命令是无符号数的除法命令
  • IDIV命令是带符号数的除法指令

	DIV	除数
	;无符号数的除法

	IDIV	除数
	;有符号数的除法

在有符号的除法中,如果被除数和除数的符号不同,则商为负数,余数与被除数的符号相同

商如果无法存储在寄存器里,程序将终止并发生“Divide Overflow”

即使被除数为16位,如果商不能存储为8位,就选择字除法

被除数的扩展

1)被除数适合AX,但是商太大了,需要做字除法的情况
被除数应该从16位拓展到32位
在DIV指令中,DX为0;IDIV指令中,DX是AX的符号扩展
使用字扩展指令CWD

2)如果被除数为8位,则必须将被除数拓展到16位以执行除法
使用CBW将8位AL扩展为16位AX

CBW:8位AL —> 16位AX AH:AL
CWD: 16位AX —> 32位 DX:AX




例:DX=0000H,AX=0010H,BX=FFFBH时 ,比较DIV,IDIV指令执行

DIV BX : 16÷65531= 商 0, 余数 16 AX=0000H, DX=0010H

IDIV BX : 16÷(-5)= 商 -3, 余数 1 AX=FFFDH, DX=0001H




例:AX=00FBH,BYT=FFH时, 比较DIV、IDIV指令执行

DIV BYT : 251÷255= 商 0, 余数 251 AL=00H, AH=FBH
IDIV BYT : 251÷(-1)= 商 -251 => Divide Overflow




例:WRD里面存了-600,把它除以3(因为是-200,所以应该做字除法)

	MOV	AX,WRD            	; 把-600存储到AX里
	CWD		         	; 把被除数扩展成32位
	MOV	BX,3	         	; 选择BX作为除数,给BX里面存储3
	IDIV	BX	         	; 执行有符号的字除法




例:BYT里已经存储了-50,把它除以8 (使用CBW指令将8位拓展成16位,用于字节除法)

	MOV	AL,BYT	        	;给AL里存储-50
	CBW		        	;被除数扩展成16位
	MOV	BL,-8	        	;BL里存储-8
	IDIV	BL	        	; 有符号的运算,字节除法

最后修改:2022 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏