1- 定义描述性符号:reg(表示一个寄存器)和sreg(表示一个段寄存器)
reg的集合包括: ax, bx, cx, dx, ah, al, bh, bl, ch, cl, dh, dl, sp, bp, si, di;
sreg的集合包括:ds, ss, cs, es
2- bx, si, di, bp
(1) 在8086CPU中, 只有这4个寄存器可以用在[...]中来进行内存单元寻址.
mov ax,[bp]
mov ax,[bp + si]
mov ax,[bp + di]
错误的指令
mov ax,[ax]
mov ax,[cx]
mov ax,[dx]
mov ax,[ds]
(2) 在[...]中, 这4个寄存器可以单个出现, 或只能以四个组合出现: bx和si, bx和di, bp和si, bp和di
mov ax,[bp + si]
mov ax,[bx + si + idata]
下面指令是错误的
mov ax,[bx + bp]
mov ax,[si + di]
(3) 只要在[...]中使用寄存器bp, 而指令中没有显性的给出段地址, 段地址就默认在ss中.
mov ax,[bp] (ax) = ( (ss)*16 + (bp) )
mov ax,[bp + si + idata] (ax) = ( (ss)*16 + (si) + (idata) )
3- 机器指令处理的数据所在位置
在机器指令这一层来讲, 并不关心数据的值是多少, 而关心指令执行前一刻, 它将要处理的数据所在的位置. 所要处理的数据可以在三个地方: CPU内部, 内存, 端口
mov bx,[0] 内存, ds:0单元
mov bx,ax CPU内部, ax寄存器
mov bx,1 CPU 内部, 指令缓冲器
4- 汇编语言中数据位置的表达
(1) 立即数(idata): 直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中), 在汇编语言中称为:立即数(idata) 在汇编指令中直接给出
mov ax,1
add bx,2000h
or bx,00100000b
mov al,'a'
(2) 寄存器: 指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名.
mov ax,bx
mov ds,ax
push bx
mov ds:[0], bx
push ds
mov ss, ax
mov sp,ax
(3) 段地址(SA)和偏移地址(EA): 指令要处理的数据在内存中,在汇编指令中可以用[X]的格式给出EA,SA在某个段寄存器中.
mov ax,[0]
mov ax,[di]
mov ax,[bx + 8]
mov ax,[bx + si]
mov ax,[bx + si + 8]
段地址默认在ds中
mov ax,[bp]
mov ax,[bp + 8]
mov ax,[bp + si]
mov ax,[bp + si + 8]
段地址默认在ss中
存放段地址的寄存器也可以显性给出
mov ax,ds:[bp] (ax) = ( (ds)*16 + (bp))
mov ax,cs:[bx + si +8] (ax) = ( (cs)*16 + (bx) + (si) + 8)
5- 寻址方式:
当数据存放在内存中的时候, 我们可以用多种方式给定这个内存单元的偏移地址,这种定位内存单元的方法一般称为寻址方式.
6- 指令处理的数据有多长?
8086CPU的指令, 可以处理两种尺寸的数据, byte 和 word, 所以在机器指令中要指明, 指令进行的是字操作还是字节操作.
(1) 通过寄存器名指明要处理的数据的尺寸
下面的指令中, 寄存器指明了指令进行的是字操作:
mov ax, 1
mov bx,ds:[0]
mov ds,ax
mov ds:[0],ax
inc ax
add ax,1000
下面的指令中,寄存器指明了指令进行的是字节操作:
mov al,1
mov al,bl
mov al,ds:[0]
mov ds:[0], al
inc al
add al,100
(2) 在没有寄存器名存在的情况下, 用操作符X ptr指明内存单元的长度, X在汇编指令中可以为word 和 byte.
下面的指令中, 用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
没有寄存器参与的内存单元访问指令中,要word ptr ,byte ptr显性的指明所要访问的内存单元长度,否则CPU无法确认.
2000:1000 FF FF FF FF ....
指令:
mov ax,2000H
mov ds,ax
mov byte ptr [1000H],1
内存内容变为: 2000:1000 01 FF FF FF ....
而指令:
mov ax,2000H
mov ds,ax
mov word ptr [1000H],1
内存内容变为: 2000:1000 01 00 FF FF ....
(3) 有些指令是默认的处理单元,如push [1000H]只进行字操作
7- 寻址方式的综合应用
mov byte ptr [bx + 10H + si],'A'
mov byte ptr [bx].10H[si],'A' //dec.cp[i]='X' C语言struct描述
以上指令相同