第八节:数据处理的两个基本问题
描述性符号:reg和sreg
reg(寄存器):ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di;
sreg(段寄存器):ds,ss,cs,es
1.bx,si,di和bp:
8086cpu中只有这4个寄存器或者组合可以用[…]中来进行内存单元的寻址
mov ax,[bx/si/di/bp]
mov ax,[bx/bp+si/di+idata] (斜杠表示或的意思)
以下指令是错误的:
mov ax,[bx+bp]
mov ax,[si+di]
只要在[…]中使用寄存器bp,而指令中没有显式地给出段地址,段地址默认在ss中
mov ax,[bp] 含义:(ax)=((ss)*16+(bp))
mov ax,[bp+si+idata] 含义:(ax)=((ss)*16+(bp)+(si)+idata)
2.机器指令处理的数据在什么地方:
绝大部分机器指令都是进行数据处理的指令,处理可以分为三类:读取,写入,运算;
机器指令这一层不关心数据值多少,关心指令执行前一刻,它将要处理数据的位置:cpu内部,内存,端口
3.汇编语言中数据位置的表达:
立即数(idata):
mov ax,1 /// mov bx,2000h ///mov a1,'a'
寄存器:
mov ax,bx ///push bx ///mov ds:[0],bx
段地址(SA)和偏移地址(EA):
mov ax,[0] ///mov ax,[di]///mov ax,[bx+si+8] 段地址默认在ds中
mov ax,[bp]///mov ax,[dp+si+8] 段地址默认在ss中
mov ax,es:[bx]//mov ax,[bx+si+8] 段地址显式给出
4.寻址方式:
直接寻址:[idata]
寄存器间接寻址:[bx]/[si]/[di]/[bp]
寄存器相对寻址:用于结构体[bx].data
/用于数组idata[si],idata[di]
/用于二维数组:
[bx][idata]
基址变址寻址:用于二维数组[bx][si]
相对基址变址寻址:用于表格(结构)中的数组项[bx].idata[si]
/用于二维数组idata[bx][si]
5.指令要处理的数据有多长:
8086CPU的指令,可以处理两种尺寸的数据,byte(字节)和word(字)
第一种方法:寄存器名指明要处理的数据的尺寸比如ax为字操作,al等为字节操作
第二种方法:操作符X ptr 指明内存单元的长度
用word ptr指明了指令访问的内存单元是一个字单元
mov word ptr ds:[0],1
inc word ptr [bx]
inc word ptr ds:[0]
add word ptr [bx],2
用byte ptr指明访问的内存单元是一个字节单元
mov byte ptr ds:[0],1
inc byte ptr [bx]
inc byte ptr ds:[0]
add byte ptr [bx],2
第三种方法:
有些指令默认了访问的是字单元还是字节单元,比如push 就只对字操作
6.寻址方式的综合应用:
eg:关于某公司的一条记录如下:
公司名称:DEC
总裁名称:Ken Olsen
排 名:137
收 入:40(40亿美元)
著名产品:PDP(小型机)
存放在seg段中的偏移地址60H起始的位置。
现在更改排名38,收入增加70,产品改为VAX
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'
7.div指令:
div除法指令,注意问题:
**a.除数:有8位和16位两种,在一个reg或内存单元中
b.被除数:默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;如果除数为16位,被除数则为32位,在DX和AX中存放,DX存放高16位,AX存放低16位
c.结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数。如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数。**
div byte ptr ds:[0]
含义:(al)=(ax)/((ds)*16+0)的商
(ah)=(ax)/((ds)*16+0)的余数
div word ptr [bx+si+8]
含义:(ax)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)的商
(dx)=[(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)的余数
8.伪指令dd:
db:定义字节型数据
dw:定义字型数据
dd:定义dword双字型数据(double word)
data segment
db 1
dw 1
dd 1
data ends
第一个数据01H,data:0
处,占一个字节;
第二个数据0001H,data:1
处,占一个字;
第三个数据00000001H,data:3
处,占2个字;
9.dup:
dup操作符,与db,dw,dd等数据定义伪指令配合使用,用来进行数据的重复
db/dw/dd 重复的次数 dup (重复的字节/字/双字型数据)
db 3 dup (0) => db 0,0,0
db 3 dup (0,1,2) =>db 0,1,2,0,1,2,0,1,2