1. div指令
div 是除法指令,在8086CPU中,使用div做除法时,遵循以下规则:
(1)除数:有8位(1字节)和16位(2字节)两种,放在一个寄存器(8位存放在8位寄存器中,16位存放在16位寄存器中)或内存单元中(8位存放在内存字节单元中,16位存放在内存字单元中)
(2)被除数:默认放在ax寄存器或dx和ax寄存器中
a) 如果除数为8位时,那么被除数为16位,默认存放在ax寄存器中
b) 如果除数为16位时,那么被除数为32位,在dx和ax寄存器中存放,其中,dx存放被除数的高16位,ax存放被除数的低16位
(3)结果:默认存放在ax寄存器或dx和ax寄存器中
a) 如果除数为8位,那么结果存放在ax寄存器中,其中,al存放除法操作的商,ah存放除法操作的余数
b) 如果除数为16位,那么结果存放在dx和ax寄存器中,其中,ax存放除法操作的商,dx存放除法操作的余数
格式:
div bl ;除数为8位,存放在bl寄存器中
div byte ptr ds:[0] ;除数为8位,存放在ds:[0]内存字节单元中
div bx ;除数为16位,存放在bx寄存器中
div word ptr ds:[0] ;除数为16位,存放在ds:[0]内存字单元中
示例1:编写代码求:1001除以100
(1)分析
a) 因为被除数 1001 小于65535,除数 100 小于255,所以用除数为8位,被除数为16位的div操作规则
b) 在除数为8位的div除法操作中,被除数存放在ax寄存器中,所以 ax = 1001。除数可以存放在寄存器或内存中,所以我们可以将除数存放在寄存器中,那么可以有 bl = 100.
c) 在除数为8位的div除法操作中,结果存放在ax寄存器中,al存放div除法操作的商,ah存放div除法操作的余数。
(2)代码
assume cs:code
code segment
; 编写代码求 1001/100
; 因为被除数 1001 小于 65535,被除数为16位,除数为100,小于255,所以,用除数为8位的除法规则
; 除数8位除法中,被除数要放在ax寄存器中
; 除数可以放在寄存器或内存中,被除数 = (ax)
start:
mov ax, 1001 ;被除数
mov bl, 100 ;除数
div bl ;执行该指令后,ax寄存器中的低8位al存放 1001/100 的商,高8位ah存放 1001/100 的余数
;ax = 010Ah, 即 商= (al) = 0Ah,余数 = (ah) = 01h
mov ax, 4c00h
int 21h
code ends
end start
示例2:编写代码求:100001除以100
(1)分析:
a)因为被除数 100001大于65535,所以被除数只能是32位,那么除数为16位。将100001转为十六进制表示为186A1h。
b)在除数为16位的div除法操作中,被除数存放在dx和ax寄存器中,dx存放被除数的高16位,ax存放被除数的低16位,所以,dx = 1h,ax = 86A1h。除数可以存放在寄存器或内存中,所以我们可以将除数存放在寄存器中,那么可以有 bx = 100。
c)在除数为16位的div除法操作中,结果存放在dx和ax寄存器中,dx存放div除法操作的余数,ax存放div除法操作的商。
(2)代码
assume cs:code
code segment
; 编写代码求 100001/100
; 因为被除数 100001 大于 65535,被除数为32位,除数要用16位表示
; 除数16位除法中,被除数的低16位要放在ax寄存器中,高16位要放在dx寄存器中组成一个32为的数
; 除数可以放在寄存器或内存中,被除数 = (dx)*10000h + (ax) ,将 100001 转为16进制数为:0x186a1
start:
mov dx, 1 ;被除数的高16位
mov ax, 86a1h ;被除数的低16位
mov bx, 100 ;除数
div bx ;执行该指令后,ax寄存器存放 100001/100 的商,dx寄存器存放 100001/100 的余数
;ax = 03E8h(即十进制数1000),dx = 0001h
mov ax, 4c00h
int 21h
code ends
end start
2.mul指令
mul 是乘法指令,在8086CPU中,使用mul做乘法时,遵循以下规则:
(1)两个相乘的数,要么都是8位,要么都是16位
a) 两个相乘的数都为8位,一个数默认放在 al 8位寄存器中,另一个数放在 8位的寄存器中或内存字节单元中。
b) 两个相乘的数都为16位,一个数默认放在 ax 寄存器中,另一个数放在16位的寄存器中或内存字单元中
(2)结果:默认存放在ax寄存器或dx和ax寄存器中
a) 如果是8位乘法,结果默认存放在ax寄存器中
b) 如果是16位乘法,结果存放在dx和ax寄存器中,ax存放结果的低16位,dx存放结果的高16位
格式
mul bl ;8位乘法,一个数默认放在al 8位寄存器中,另一个数存放在bl 8位寄存器中
mul byte ptr ds:[0] ;8位乘法,一个数默认放在al 8位寄存器中,另一个数存放在ds:[0]内存字节单元中
mul bx ;16位乘法,一个数默认放在ax寄存器中,另一个数存放在bx寄存器中
mul word ptr ds:[0] ;16位乘法,一个数默认放在ax寄存器中,另一个数存放在ds:[0]内存字单元中
示例1:编写代码求:100乘以200
(1)分析
a) 100和200都小于255,所以可以用mul的8位乘法来计算。
b) mul的8位乘法中,一个数默认放在al 8位寄存器中,另一个数可以放在8位寄存器中或内存字节单元中,所以,al = 100,可以有 bl = 200。
c) mul的8位乘法中,结果默认存放在ax寄存器中,所以执行 mul bl 指令后,ax = 20000 = 4E20h。
(2)代码
assume cs:code
code segment
start:
mov al, 100 ;al = 100
mov bl, 200 ;bl = 200
mul bl ;8位乘法,al乘以bl,结果存放在ax中
mov ax, 4c00h
int 21h
code ends
end start
示例2:编写代码求:100除以1000
(1)分析
a) 100小于255,可1000大于255,所以只能用mul的16位乘法来计算。
b) mul的16位乘法中,一个数默认放在ax寄存器中,另一个数可以存放寄存器中或内存字单元中,所以,ax = 100,可以有 bx = 1000。
c) mul的16位乘法中,结果存放在dx和ax寄存器中,ax存放结果的低16位,dx存放结果的高16位,所以执行 mul bx 指令后,ax = 86A0h,dx = 0001h。0001h * 10000h + 86A0h = 100000
(2)代码
assume cs:code
code segment
start:
mov ax, 100 ;ax = 100
mov bx, 1000 ;bx = 1000
mul bx ;16位乘法,ax * bx,结果的低16位存放在ax,结果的高16位存放在dx
mov ax, 4c00h
int 21h
code ends
end start
参考
《汇编语言(第4版)》王爽