指令操作数的寻址方式
一、与数据有关,寻找参加操作的数据(8种---->7种基本方式+字符串寻址)
★涉及的一些概念
DISP/16位:AX(累加器),BX(基侄寄存器),CX(计数器),DX(数据与地址寄存器),SP(堆栈指针),BP(基址指针),SI(源变址器),DI(目的变址器)
DISP/8位:AH(高8位),AL(低8位),BH,BL,CH,CL.DH,DL
IP指令指针,存放代码段中的偏移地址;EA偏移地址,段内相对地址,有效地址
CS代码段,SS堆栈段,DS数据段,ES附加段
堆栈:方便事项程序要求保留和恢复有关信息的特殊存储部件,是一种数据结构。
pws(状态):CF(进位),PF(奇偶),SF(符号),OF(溢出),ZF(零),DF(方向),IF(中断),TF(跟踪)
PA:20位物理地址 ;MOV传送
1、立即寻址
用来表示常数
MOV AX,1946H;1946H(立即数)-->AX
2、寄存器寻址
MOV AX,CX ;cx-->ax
3、直接寻址
MOV BX,[1000H] ;[1000H]→EA,操作数默认DS
MOV AX,ES:VAR ;越段前缀
4、寄存器间接寻址
EA=BX∨SI∨DI∨BP;∨表示或者
a、PA=DS×16+{BX∨SI∨DI}
b、PA=SS×16+BP
c、PA=越段寄存器×16+{BX∨SI∨DI∨BP}
5、寄存器相对寻址
直接变址寻址
┍BX┑
EA=├SI┥+{DISP}
├DI┥
┕BP┚
mov ax,count[si] ;ea=count+si,(ea)→ax,约定为DS
mov al,es:string[bp] ;越段前缀
6、基址变址寻址
使用数组和表格
EA={BX∨BP}+{SI∨DI}
pA=DS×16+BX+{SI∨DI}
pA=SS×16+BP+{SI∨DI}
mov cx,es:[bx][di]
mov ax,[bx][si] ;ea=bx+si,ea→ax
7、相对基址变址寻址
EA={BX∨BP}+{SI∨DI}+{DISP}
mov ax,array[bx][si] ;ea=array+bx+si,ea→ax
8、字符串寻址
movsb ;([si])=>([di]),si+1=>si,di+1=>di
;源=>目,可理解为mov [di],[si]
我对寻址的一些分析看看对大家对他的理解有没有帮助。
物理地址(PA)=段地址+偏移地址(EA)
=段寄存器的内容×16+偏移地址
=约定默认段地址×16+偏移地址
=越段地址×16+偏移地址
1、立即寻址
A→B,A就是PA(物理地址)可以直接给B
2、寄存器寻址
A→B,A(寄存器)的值是PA可以给B
3、直接寻址
A→B,A是EA,EA=确定的寄存器的值,由EA得到PA,然后给B
4、寄存器间接寻址
A→B,A是EA,EA=变动的寄存器的值,由EA得到PA,然后给B
5、寄存器相对寻址
A→B,A是EA,EA=变动的寄存器的值+DISP的值,由EA得到PA,然后给B
6、基址变址寻址
A→B,A是EA,EA=变动的寄存器的值+另一变动的寄存器的值,由EA得到PA
,然后给B
7、相对基址变址寻址
A→B,A是EA,EA=变动的寄存器的值+另一变动的寄存器的值+DISP的值,
由EA得到PA,然后给B
8、字符串寻址
A→B,A源PA,然后给B(目的pA)
理解寻址方式的关键是EA的值是什么和怎样由EA得到PA,方式4,5,6,7容易混淆,我这样解释可能不科学,但能达到明白它的意思就行。4和3的区别是EA=变动的寄存器的值,5在4的基础上加了DISP的值,6相当于2个5相加(EA=变动的寄存器的值+另一变动的寄存器的),7相当于5+6,哈哈,都什么和什么呀。