汇编语言的6种寻址方式

标签:
汇编寻址方式at&t80x86it |
分类: 实验室 |
立即寻址方式:
使用格式::n(n为常数或数值表达式,称为立即数)
功能::n本身就是操作对象,它作为指令的一部分,与指令一起存于内存的代码段中。
80x86汇编MOV BX,10
AT&T汇编 MOVW
$10,%BX
说明:
(1)立即数只能作为双操作数指令的源操作数,不能作为目的操作数;
(2)立即数不能作为单操作数指令的操作数;
(3)立即数只有大小,没有类型,未分配内存单元;
如: MOV 100H, AX; ERROR
INC 50; ERROR
(4)立即寻址方式主要用于给寄存器或存储器赋初值。
寄存器寻址方式:
使用格式:R ; R为CPU中寄存器名。
功能:操作对象在CPU的寄存器R中,不在内存。
MOV BX,AX
(AX)->BX,AX内的值赋予BX
ADD EDX, EAX
(EDX)+(EAX)->EDX
http://s1/middle/65db99844913426e62fe0&690
说明:
(1)操作数的类型由寄存器的位数决定:8位寄存器是字节类型;16位寄存器是字类型;32位寄存器是双字类型.
(2)在双操作数的指令中,当两个操作数类型均明确时,必须一致。
如:
MOV BL, AX; ERROR BL是字节类型, AX是字类型,类型不一致
MOV AX, EAX ; ERROR AX是字类型,EAX是双字类型,类型不一致
直接寻址方式:
使用格式:段寄存器名:[EA]
(“段寄存器:”称为段跨越前缀,偏移地址EA的形式为常数或者数值表达式)或:含有变量的地址表达式
功能:操作对象在内存指定的段中。EA值与包含它的指令码一起存放在内存的代码段中。
MOV DS:[2000H],AX
执行前,设(DS)=3000H.
在实方式下执行:
计算PA=(DS)*0x10+2000H=30000H+2000H=32000H.
(AX)->PA, 即(32000H)=(AX);
MOVW %AX,$0X2000(%DS)
说明:
(1) 段属性问题:“段寄存器名:[EA]”格式中,操作对象所在段寄存器名指定的段中。
“含有变量的地址表达式”格式中,操作对象在变量所定义的段中。
(2) 类型属性问题:“段寄存器名:[EA]”格式表示的操作数无类型。如果漏写段跨越前缀, 则寻址方式为立即寻址。
“含有变量的地址表达式”格式表示的操作数有类型,且类型由变量的类型决定。
例:
MOV AX, ES:[20H]; 源操作对象在内存ES段中,无类型。
LEA AX, [20H]; 等价MOV AX, 20H, 即源操作数为立即寻址
MOV BUF, AX; 目的操作数为直接寻址,且类型和段属性由BUF决定(BUF为已定义的字类型变量)
寄存器间接寻址:
使用格式:[R]
R为16位寄存器BX,BP,SI,DI之一;或是32位寄存器:EAX,EBX,ECX,EDX,EDI,ESI,EBP,ESP之一。不能是8位寄存器。
功能:操作对象在内存中;操作对象的EA在CPU的R中,不在内存。
例: MOV AX,[SI] SI为规定的寄存器
假定执行前:(AX)=5, (SI)=20H, DS:(20H)=0FFFFH.
执行: (1)CPU计算EA: EA=(SI)=0020H
(2)CPU依”DS:EA”, 按工作方式计算源操作数PA(实方式PA=(DS)+EA),
再根据PA值取出操作对象0FFFFH->AX执行后: (AX)=0FFFFH; (SI), (DS),
DS:(20H)未变。
MOVW
(%SI),%AX
说明:
(1) 段属性
默认情况:当R是BP,EBP,ESP,
则操作对象在当前堆栈中。即操作数地址为“SS:(R)”;R为其它规定的寄存器,则操作对象在当前数据段中,即操作数为”DS:(R)”。显示情况:在[R]前可加上段跨越前缀,则操作对象在前缀指定的段中。
例: MOV DS:[EBP], CX; 目的操作数表示操作对象在DS段中,而不是在EBP默认的堆栈段中。
(2)类型属性:此种寻址无类型
(3)注意[R]中的R必须是规定的寄存器。
如: MOV [AX], CX; ERROR
MOV DX, [BL] ; ERROR
变址寻址方式:
使用格式:[R*F+V] (或写成:[R*F]+V, 或V[R*F])
功能:操作对象在内存中,其相对段首址的偏移地址EA=(R)*F+V;其中:R的规定同寄存器间接寻址中R的规定F为指定的比例因子,可为1,2,4或8。当R为16位寄存器或ESP
时,F只能取1并省略不写。V为16位(R为16位寄存器)或32位(R为32位寄存器)的二进制补码表示的省略号常数(什么叫做省略号常数?);或者是数值表达式、变量或标号名。
MOV AL,
[EBX*2]+5其中V为2,默认的段寄存器为DS.执行前:(AL)=18H, (EBX)=1100H,
DS:(2205H)=55H.
执行: EA=(EBX)*2+5=1100H*2+5=2205H
(DS:(2205))=55H->AL
MOVB 5(,�X,2),%AL
说明:
(1) 段属性问题
当V为常数或数值表达式时,操作对象所在的段由R决定(与寄存器间接寻址方式相同);
当V为变量或标号时,操作数对象所在的段就是变量或标号所在的段(不由R决定)。
(2) 类型
当V为常量时,此种寻址无类型;当V为含有变量或者标号的表达式时,则有类型,其类型与变量或标号类型相同
如: MOV BUF[BX], CX;
设BUF是已定义的字类型变量,BUF[BX]类型为字类型。假定BUF定义为字节类型,则BUF[BX]与CX类型不一致,此指令错误。
(3) 注意R为规定的寄存器MOV AX, -12[CX]; ERROR
基址加变址寻址方式:
使用格式:[BR+IR*F+V] 或写成:V[BR][IR*F], 或V[BR+IR*F]
功能:操作对象在内存中,其EA=(BR)+(IR)*F+V。此种寻址格式与变址寻址的区别仅仅多了一项BR寄存器,称为基址器。
其中:(1)V,F同变址寻址的规定。F总是与IR相乘。
(2)BR与IR选用与搭配关系:当使用16位寄存器时:BR只能选用BX和BP之一;
IR只能选用SI,DI之一与之搭配;F只能为1。当使用32位寄存器时:BR可选用任一32位通用寄存器;IR可选用除ESP之外的任一32位通用寄存器与之搭配。
例:MOV AX, 8[BX][SI]
其中V=8,BR为BX,IR为SI,F为1
执行前:(AX)=45H,(BX)=30H,(SI)=20H,DS:[0058H]=99H
执行:EA=(BX)+(SI)+V=30H+20H+8H=0058H
(DS:(0058H))=99H->AX
MOVW 8(%BX,%SI,1)
说明:
段属性与类型属性问题
段的默认情况:当V为常数时,默认的段寄存器由基址器BR决定。即BR为BP,ESP,EBP默认段为SS,其它默认段为DS.操作数无类型。当V为变量或标号表达式时,操作对象所在的段就是变量或标号所在的段。操作数有类型,且与变量或标号类型相同。
段的显式表示:操作对象在显式给出的段中。
例:MOV AX, [BP+SI];源操作数无类型;操作对象在SS中
MOV AX, DS:[BP+SI];源操作数无类型;操作对象在DS中
MOV AX, SUM[BP+SI];源操作数有类型;操作对象在SUM所在的段中。
MOV AX, CS:SUM[BP+SI]:源操作数有类型;操作对象在CS段中
MOV EDX, ES:10[EBX+ESI*4];源操作数无类型;操作对象在ES中
注意:
(1)在决定段时,优先级关系:段跨越前缀>变量>BR
(2)注意BR与IR的搭配问题
例:MOV [BX+BP], AX; ERROR
MOV [EBX+ESP*2+5], EAX; ERROR