前导
两个基本问题:
1.处理的数据在什么地方
2.要处理的数据有多长
两个描述性的符号:reg(寄存器)和sreg(段寄存器)
reg:ax bx cx dx ah al bh bl ch cl dh dl sp bp si di
sreg: cs ds ss es
8.1 bx、si、di和bp
总结:
1.在8086CPU中,只有这4个寄存器可以用在[ ]中来进行内存单元的寻址
mov ax,[bx]
mov ax,[bx+si]
mov ax,[bp]
mov ax,[bp+si]
2.下面两种搭配是错误的
mov ax,[bx+bp]
mov ax,[si+di]
3.使用[bp]时,没有显示的给出段地址,那就在ss里
8.2 机器指令处理的数据在什么地方
指令在执行前,所要处理的数据可以在3个地方:CPU内部,内存,端口
mov bx,[0] 内存
mov bx,ax CPU内部,寄存器
mov bx,1 CPU内部,指令缓冲器
8.3 汇编语言中数据位置的表达
1.立即数
2.寄存器
3.段地址和偏移地址
8.4 寻址方式
8.5 指令要处理的数据有多长
在机器指令中要指明,指令进行的字操作还是字节操作
1.寄存器指明
2.mov word ptr ds:[0],1
inc word ptr [bx]
push只进行字操作
8.6 寻址方式的综合运用
用bx定位整个结构体,用idata定位结构体中的某一个数据项,用si定位数据项中的每一个元素。
8.7 div指令
17/8=2…1 16:被除数 8:除数 2:商:2 余数:1
(1)除数:有8位和16位 存放在寄存器或者内存单元中
(2)被除数:如果除数是8位,被除数就是16位,在AX中
如果除数是16位,被除数就是32位,DX中存放高位,AX中存放低位
(3)结果:如果除数是8位,AL存放商,AH存放余数;如果除数是16位,则AX存商,DX存余数。
格式如下:
div reg
div 内存单元
1.div byte ptr ds:[0]
//意思是:al = (ax)/((ds)*16+0) 的商
ah= (ax)/((ds)*16+0) 的余数
2.div word ptr es:[0]
//意思是:ax = [(dx)*10000H+(ax)]/((es)*16+0)的商
dx = [(dx)*10000H+(ax)]/((es)*16+0)的余数
//划重点:让被除数和除数与65535比较
8.8 伪指令 dd
定义双字节。
问题 8.1
assume cs:codesg,ds:datasg
datasg segment
dd 100000
dw 100
dw 0
datasg ends
codesg segment
start:mov ax,datasg
mov ds,ax
mov ax,ds:[0]
mov dx,ds:[2]
div word ptr ds:[4]
mov ds:[6],ax
mov ax,4c00h
int 21h
codesg ends
end start
8.9 dup
它是和db,dw,dd等数据定义伪指令配合使用的,用来进行数据的重复
db 3 dup (0)
定义3个字节,它们的值都是0 ,相当于 db 0,0,0
db 3 dup (0,1,2)
定义9个字节,db 0,1,2,0,1,2,0,1,2