加载中…
个人资料
bluemonster
bluemonster
  • 博客等级:
  • 博客积分:0
  • 博客访问:289,146
  • 关注人气:39
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

汇编语言的6种寻址方式

(2010-09-27 09:54:14)
标签:

汇编

寻址方式

at&t

80x86

it

分类: 实验室
今天重新整理了一下,加了不少内容,尤其是关于AT&T汇编指令寻址的问题。不想再在博客里改了,word文档传到ishare里去了
http://ishare.iask.sina.com.cn/f/10491291.html
/////////////////////////羞答答的分割线//////////////////////////////////////////////////

立即寻址方式: 

使用格式::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

MOVW %AX,%BX

汇编语言的6种寻址方式


说明:

(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  
注意,这里的5前面不用加$

说明:

(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)  
注意,这里的8前面不用加$

说明:

段属性与类型属性问题

段的默认情况:当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

汇编语言的6种寻址方式


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有