8.7 div指令
div是除法指令,使用div做除法的时候:
除数:8位或16位,在寄存器或内存单元中
被除数:(默认)放在ax或dx和ax中
结果:
运算 8位 16位
商 al ax
余数 ah dx
div指令格式:
div reg
div 内存单元
div byte ptr ds:[0]
含义为:al=ax/(ds*16+0)的商
ah=ax/(ds*16+0)的余数
div word ptr es:[0]
含义为:
ax=(dx*10000H+ax)/(ds*16+0)的商
dx=(dx*10000H+ax)/(ds*16+0)的余数
利用除法指令计算100001/100.
我们首先分析一下,被除数100001大于65535,不能用ax寄存器存放,所以我们要用dx和ax两个寄存器联合存放100001,也就是说要进行16位的除法。
除数100小于255,可以在一个8位寄存器中存放,但是,因为被除数是32位的,除数应为16位,所以要用一个16位寄存器来存放除数100.
因为要分别为dx和ax赋100001的高16位值和低16位值,所以应先将100001表示为十六进制形式:186A1H
程序如下:
mov dx,1
mov ax,86a1h;
mov bx,100
div bx
利用除法指令计算1001/100.
我们首先分析一下被除数1001可用ax寄存器存放,除数100可用8位寄存器存放,也就是说,要进行8位的除法。程序如下:
mov ax,1001
mov bl,100
div bl
程序执行后,al=0ah(商为10),ah=1(余数为1)
8.8伪指令dd
前面我们用db和dw定义字节型数据和字型数据。
dd是用来定义dword(double word 双字)型数据的。
data segment
db 1
dw 1
dd 1
data ends
在data段中定义了三个数据:
第一个数据为01H,在data:0处,占1个字节;
第二个数据为0001h,在data:1处,占1个字
第三个数据为00000001h,在data:3处,占1个双字,两个字,4个字节。
mov ax,data
mov ds,ax
mov ax,ds:[0]
mov dx,ds:[2]
div word ptr ds:[4]
mov ds:[6],ax
8.9 dup
dup是一个操作符,在汇编语言中同db、dw、dd等一样,也是由编译器识别处理的符号。
它是和db、dw、dd等数据定义伪指令配合使用的,用来进行数据的重复。
dup示例:
db 3 dup(0)
定义了3个字节,他们的值都是0,相当于 db 0,0,0
db 3 dup(0,1,2)
定义了9个字节,他们是0、1、2、0、1、2、0、1、2
相当于 db 0,1,2,0,1,2,0,1,2
db 3 dup('abc','ABC')
定义了18个字节,他们是:
‘abcABCabcABCabcABC'
可见,dup的使用格式如下:
db 重复的次数 dup (重复的字节型数据)
dw 重复的次数 dup (重复的字型数据)
dd 重复的次数 dup (重复的双字数据)