汇编语言数据寻址方式

数据寻址方式

1、 立即数寻址

立即数寻址:指令需要的操作数紧跟在操作码之后称之为指令机器码的一部分,并随着处理器的取址操作需要从主存进入指令寄存器。这些操作数用常量形式直接表达,从指令代码中立即得到立即数,立即数寻址方式只用于指令的原操作数,在传送指令过程中常用来给寄存器和存储单元赋值。

2、 寄存器寻址
指令的操作数存放在处理器的寄存器中,就是寄存器存储方式绝大多数的指令采用通用寄存器寻址(IA-32处理器是:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP其支持的16位形式:AL,AH,BL,BH,CL,CH,DL,DH),部分支持专用寄存器,如段寄存器和标志寄存器。

3、 存储器寻址

  1. 1、 段寄存器的默认和超越

段寄存器(段选择器)有默认的使用规则。一般是DS段寄存器指向的是数据段,如果采用的是EBP(BP)或者是ESP(SP)做基地址指针,则默认SS段寄存器指向堆栈段。

  1. 2、 偏移地址的形成

由于段基地址由默认的或者是指定的段寄存器,所以存储器操作数寻址使用的偏移地址常称为有效地址。
在这里插入图片描述

  1. 3、 直接地址

有效部分只有位移量部分,且直接包含在指令代码中,就是存储器的直接寻址方式,直接寻常用于存取变量。
例如:mov ecx,count;mov ecx,[count];//count分配的有效地址是常量。源操作数采用直接寻址。

  1. 4、 寄存器间接寻址

有效地址存放在寄存器当中,就是采用寄存器间接寻址存储器操作数(寄存器内容=偏移地址=有效地址)。寄存器间接寻址的数据由另外一个操作数的寄存器或者是变量类型决定。
mov edx,[ebx];双字传送ebx简介寻址主存数据段
mov cx,[esi];字传送,esi间接寻址贮存数据段
mov [edi],al;字节传送,edi间接寻址主存数据段
mov [ebp],edx;双字传送,ebp间接寻址贮存数据段
寄存器间接寻址的操作数没有类型,其类型是由另外一个操作数的寄存器或变量决定的,若另外一个操作数也是无类型(立即数),需要显示说明。

  1. 5、 寄存器相对寻址

寄存器相对寻址的有效地址是寄存器内容与位移量之和
mov esi,[ebx+4;源操作数也可以表达为[4][ebx]或者4[ebx]

  1. 6、 变址寻址

使用变址寄存器寻址操作数成为变址寻址,在变址寄存器不带比例的(或者比例为0)情况下需要配合使用一个基址寄存器(成为基址变址寻址方式),还可以再包含一个位移量(成为相对基址变址寻址),存储器操作数的有效地址由一个基址寄存器的内容加上变址寄存器的内容或再加上位移量构成。
mov eax,[ebx+esi]或mov eax,[ebx][esi]
mov eax,[ebx+edx+80h]或
mov eax,80h[ebx+edx]或
mov80h[ebx][edx]

  1. 7、 带比例的变址寻址

对应使用变址寄存器的存储器寻址
mov eax,[ebx4];带比例的变址寻址
mov eax,[esi
2+80h];带比例的相对基址变址寻址
mov eax,[ebx+esi4];带比例基址变址寻址
mov eax,[ebx+esi
8-80h];带比例的相对基址变址寻址

3.8数据寻址方式的组合

1、 立即数寻址
立即数寻址只可以用于源操作数
2、 寄存器寻址
寄存器寻址主要用于通用存储器,可以单独或同时用于源操作数和目的操作数IA-32处理器的通用寄存器reg包括八个32位通用寄存器r32:EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP;8个16位通用寄存器:AX,BX,CX,DX,SI,DI,BP,SP;八个8位通用寄存器r8:AH,AL,BH,BL,CH,CL,DH,DL,部分指令可使用专用寄存器如段寄存器seg:CS,DS,SS,ES,FS,GS
3、 存储器寻址
存储器寻址的数据在内存,利用逻辑地址表示。段基地址由默认的或者是指定的段寄存器指出,指令代码只含偏移地址(称为有效地址),有多种存储器寻址方式。存储器操作数可以是32位、16位或者是8位数据,依次用符号m32,m16,m8表示,统一用mem表示。
在这里插入图片描述
典型的指令操作数有两个,一个是书写在左边的(称之为目的操作数DEST),另外一个用逗号分隔书写在右边(称之为源操作数SRC)。数据寻址方式在指令中并不是任意组合的,而是有规律的且符合逻辑的。源操作数可以由立即数,存储器,寄存器寻址,而目的操作数只能是寄存器或者是存储器寻址,并且两个操作数不能同时为存储器寻址方式。

猜你喜欢

转载自blog.csdn.net/Clown_pan/article/details/85011031
今日推荐