X86处理器架构------汇编语言寻址方式

时间:2021-10-24 01:24:21

第一部分 指令系统简介

寻址方式是指寻找指令中操作数或者指令转移地址的方式,分为数据寻址方式和指令转移地址方式两类。

指令系统是指机器所支持的所有指令的集合。

 

数据寻址方式有:立即数寻址,寄存器寻址,存储器寻址等方式;

指令转移地址方式:包括直接,相对以及间接存储器寻址三种方式。

 

指令系统包括:数据传送指令,算术运算指令,逻辑运算指令和存储器控制指令,以及保护模式下的指令等。

 

第二部分 寻址方式

2.1 立即数寻址方式

操作数直接放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段中,这种操作数叫做立即数

例如:

mov al, 5

move eax, 3298647ah

备注:

立即数只能作为源操作数,不能作为目的操作数

 

2.2 寄存器寻址方式

操作数在寄存器中,指令指定寄存器号

例如:

mov ax, bx

 

2.3 直接寻址方式

操作数在存储器中,指令给出存储器的偏移地址

例如:

mov ax,[2000h]

如果DS=3000h,则将物流地址为32000h中的内容送ax

 

mov ESI, LIST

将存储在地址LIST处的四个连续字节送ESI

备注:

除了movs指令外,指令系统不支持从存储单元到存储单元的传递

 

2.4 寄存器间接寻址

操作数的地址在基址寄存器或者变址寄存器,而操作数则在存储器中

例如:

mov ax, [bx]

bx=1000hds=0100h,则在微处理器工作的实模式下,执行指令后,将物理地址2000h2001h的内容送ax

备注:其实在实模式下bx中存放的就是偏移地址

对于80386以上的机器,允许除esp以外的所以扩展寄存器寻址。

例如:

mov al, [edi]

mov ecx, [ebx]

mov cl, [edx]

 

2.5 基址变址寻址

808680286中,基址变址寻址是指用一个基址寄存器(BX或者BP)和一个变址寄存器(SI或者DI)间接寻址内存。

例如:

mov ax, [bx+si]

mov bx, [bp+si]

备注[bx+si][bp+si]中存放的还是偏移地址,本质上的基址是由DS给出的。

例如:

mov dx, [bx+di]

如果bx=1000h, di=0010h, ds=0100h, 那么内存地址为01000h+1000h+0010h =02010h

所以指令执行后:

02010h单元和02011h单元的内容送入dx寄存器。

 

80386以上的微处理器中,这种寻址方式适用于处esp以外的任意两个32位寄存器。

比如:

mov dl, [eax+ebx]

 

2.6 寄存器相对寻址

寄存器相对寻址用基址寄存器或变址寄存器内容加上一个位移量来寻址内存中的数据。位移量可以是一个数字加到带[]的寄存器中,也可以是一个符号地址写在[]之前。

例如:

mov ax, [di+100h];位移量是一个数字

mov array [si], cl ;位移量是一个符号地址

 

2.7 相对基址变址寻址

相对基址变址寻址指的是用一个基址寄存器加上一个变址寄存器的内容再加上一个偏移量来完成内容单元的寻址。

例如:

mov dh, [bx+si+10h]

mov list[bp+di], al

 

2.8 比例寻址变址

比例寻址变址是80386pentium型号的微处理器所特有的,它的含义是:用一个32位的基址寄存器的内容加上一个32位的变址寄存器的内容与一个比例因子的乘积来寻址内存单元。

例如:

mov eax,[ebx+4*ecx]

mov eax, array[4*ecx]

mov ax, [ebx+2*edi]

备注:

对于80386以上的微处理器来说,基址和变址寄存器不仅仅限于bxbpsidi

比例因子可以是1,2,4或者8,默认是1

 

2.9 程序存储器寻址方式

这种寻址方式用于确定转移指令和子程序调用指令的转向地址,有三种寻址方式:直接,间接和相对。

 

2.9.1直接程序存储器寻址

指令的转向地址和指令一块存储。直接转移通常叫做远转移(far jump),它是一种段间转移。在是模式下,远转移通过CSIP两者的变化来访问1M的内存单元。

80386或者更高档的模式操作下,远转移访问描述符表的代码段描述符,允许访问在整个4G地址范围内的任何存储单元。

例如:

jmp far ptr prog1

far ptr说明这是一段间转移,汇编程序会用prog1的段地址覆盖cs内容,用prog1的偏移地址覆盖ip内容

备注:对应子程序调用指令,直接程序存储器寻址指令就是call 指令

 

2.9.2 相对程序寻址

指令中给定转向有效地址和当前IP内容之间的位移量,转向的有效地址是当前IP寄存器内容与指令中指定的位移量之和。

位移量可以是1字节或者2字节。

位移量为1字节时,称为短转移;

位移量为2字节时,称为近转移;

80386和更高档的机器中,允许324字节的位移量。

 

位移量为1字节,转移范围-128B~+127B

位移量为2字节,转移范围-32KB~+32KB-1

位移量为4字节,转移范围:-2GB~+2GB-1

 

例如:

jmp near ptr prog2

jmp short ptr prog3

其中near表示近转移,short表示段转移。汇编语言自动计算当前IP内容与prog2prog3)之前的偏移量,形成目标程序中指令的偏移量。

 

2.9.3 间接程序寄存器寻址

指令转向的有效地址是一个寄存器或者一个存储单元的内容。

这个寄存器或者存储单元的内容可以用除立即数外的任何一种寻址方式取得,所得的所得到的转向有效地址用例取代eip的内容或者eipcs中的内容。

 

例如:

jmp ax ;转移到当前代码段内用ax寻址的位置,ax的内容代替ip的内容

jmp near ptr [bx] ;转移到当前代码段内用bx寻址的位置,bx寻址的内容代替ip的内容

jmp ecx;转移到当前代码段内用ecx寻址的位置,ecx的内容代替ip的内容