除法指令: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 ; 有符号的运算,字节除法