8.6 寻址方式的综合应用
实例
数据存放
确定需要修改的数据
确定修改的方法
根据上面的分析,程序如下:
mov ax,seg
mov ds,ax
mov bx,60h ;确定记录地址
mov word ptr [bx+0ch],38
add word ptr [bx+0eh],70
mov si,0 ;用si来定位产品字符串中的字符
mov byte ptr [bx+10h+si],'V'
inc si
mov byte ptr [bx+10h+si],'A'
inc si
mov byte ptr [bx+10h+si],'X'
用C语言描述程序
struct company{//定义一个公司记录的结构体
char cn[3];//公司名称
char hn[9];//总裁姓名
int pm;//排名
int sr;//收入
char cp[3];//著名产品
};
struct company dec = {'DEC','Ken Olsen',137,40,'PDF'};//定义一个公司记录
main()
{
int i;
dec.pm=38;
dec.sr=dec.sr+70;
i=0;
dec.cp[i] = 'V';
i++;
dec.cp[i] = 'A';
i++;
dec.cp[i] = 'X';
return 0;
}
根据C语言写出类似的汇编代码:
mov ax,seg
mov ds,ax
mov bx,60h ;确定记录地址
mov word ptr [bx].0ch,38
add word ptr [bx].0eh,70
mov si,0 ;用si来定位产品字符串中的字符
mov byte ptr [bx].10h[si],'V'
inc si
mov byte ptr [bx].10h[si],'A'
inc si
mov byte ptr [bx].10h[si],'X'
一般来说,我们可以用[bx+idata+si]的方式来访问结构体中的数据。
用bx定位整个结构体,用idata定位结构体中的某一个数据项,用si定位数组项中的每个元素。
8.7 div指令
div是除法指令(division),使用div作除法的时候
- 除数:8位或16位,在寄存器或内存单元中
- 被除数:(默认)放在AX中,或者放在AX和DX中。如果除数是8位,则被除数是16位,放在AX中。如果除数是16位, 则被除数是32位,放在DX和AX中。DX存放高16位,AX存放低16位。
- 结果:如果除数为8位,商存放在AL中,余数存放在AH中。如果除数为16位,商存放在AX中,余数存放在DX中。
div指令格式:
- div reg
- div 内存单元
编程1:利用除法指令计算100001/100
分析:被除数100001(16进制为186A1H)大于65535(16进制为FFFFH),不能用ax寄存器存放,所以我们要使用dx和ax两个寄存器联合存放。这里除数可以用8位寄存器存放,但是被除数是32位,所以除数存放在16位寄存器中。
mov dx,1 ;高16位
mov ax,86A1h ;低16位
mov bx,100
div bx
程序执行后,(ax)=03E8(即1000),(dx)=1.
编程2:利用除法指令计算1001/100
分析:被除数1001可以用16位寄存器存放,除数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段中定义了三个数据:
第一个数据为01H,在data:0处,占一个字节
第二个数据为0001H,在data:1处,占一个字(两个字节)
第三个数据为00000001H,在data:3处,占两个字(四个字节)
问题8.1
用div计算data段中第一个数据除以第二个数据后的结果,商存放在第三个数据的存储单元中。
data segment
dd 100001
dw 100
dw 0
data ends
思考: 被除数是双字型,32位,高16位存在dx中,低16位存在ax中,除数是字型,16位。
低16位起始地址在内存空间ds:[0]处,高16位起始地址在内存空间ds:[2]处。
mov ax,data
mov ds,ax
mov ax,ds:[0] ;被除数低16位
mov dx,ds:[2] ;被除数高16位
div word ptr ds:[4] ;进行除法
mov ds:[6],ax
8.9 dup
dup是一个操作符,在汇编语言中通db、dw、dd等一样,也是由编译器识别处理的符号。
它是和db、dw、dd等数据配合伪指令一起使用的,用来进行数据的重复。
示例:
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'
相当于 db 'abcABCabcABCabcABC'
dup的使用格式: