操作数的寻址方式
来源:互联网 发布:python 字典get函数 编辑:程序博客网 时间:2024/06/05 18:02
在指令中,指定操作数或操作数存放位置的方式称为寻址方式。
1、立即数寻址
将操作数作为指令的一部分写在指令中,这种操作数称为立即数,这种寻址方式称为立即数寻址。
立即数可以是8位、16位或32位,数值紧跟在操作码之后。
例如:
mov ah,80h ;8位
mov ax,1234h ;16位
mov eax,12345678h ;32位
在汇编中,立即数不能作为指令中的第一操作数。
2、寄存器寻址
指令所要的操作数已经存储在某寄存器中,或把目标操作数存入寄存器。在指令中指出所使用的寄存器的寻址方式称为寄存器寻址。
①源操作数是寄存器
例如:
ADD VARD,EAX; VARD是双字类型变量
②目的操作数是寄存器
例如:
ADD BH, 78h;
③源和目的操作数都是寄存器
例如:
MOV EAX, EBX;
3、直接寻址方式
操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。
在通常情况下,操作数存放在数据段中。所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址(偏移)直接形成。若使用段前缀,则操作数从段前缀指定的段读取。
例如:
假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?
①因未指定段前缀,则默认数据在数据段中。所以使用DS的值和偏移1234H相加,得存储单元物理地址为21234H
②取21234H的值5213H,并存入BX中。
数据段的段寄存器默认是DS,如果要指定访问其他段内的数据,则应在指令中使用段前缀显示指定。
例如:
MOV ES:[1000H], AX; 指定将AX的值移动到附加段的1000H偏移处
4、寄存器间接寻址
操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。
在不使用段超越前缀的情况下,有下列规定:
①若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
②若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。
例如:
假设有指令:MOV BX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是什么?
根据规则,DI存有有效地址(偏移),则指定的段寄存器为DS。所以该操作数的物理地址应是:
PA=(DS)*16+DI=1000H*16+2345H=12345H
5、寄存器相对寻址
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和。
在不使用段超越前缀的情况下,有下列规定:
若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS
若有效地址用BP来指定,则其缺省的段寄存器为SS。
例如:
假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?
计算有效地址(偏移):
EA=(SI)+100H=2345H+100H=2445H
那么该操作数的物理地址为:
PA=(DS)*16+EA=1000H*16+2445H=12445H
6、基址加变址寻址方式
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。
在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。
例如:
假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问该指令执行后,BX的值是什么?
计算有效地址:
EA=(BX)+(SI)=2100H+0011H=2111H
则物理地址为:
PA=(DS)*16+EA=1000H*16+2111H=12111H
7、相对基址加变址寻址
操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。
在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。
例如:
假设指令:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,AX的值是什么?
计算有效地址:
EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H
则物理地址为:
PA=(DS)*16+EA=1000H*16+2310H=12310H
8、32位地址的寻址方式
在用32位寄存器寻址时,所有32位寄存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一个组成部分。
当用32位地址偏移量进行寻址时,内存地址的偏移量可分为三部分:
一个32位基址寄存器
一个可乘1、2、4或8的32位变址寄存器
一个8位/32位的偏移常量
这三部分还可进行任意组合,省去其中之一或之二。
由于32位寻址方式能使用所有的通用寄存器,所以,和该有效地址相组合的段寄存器也就有新的规定。具体规定如下:
①地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器。
如:[EBX+EBP]中的EBX是基址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器;
②默认段寄存器的选用取决于基址寄存器
③基址寄存器是EBP或ESP时,默认的段寄存器是SS,否则,默认的段寄存器是DS;
④在指令中,如果使用段前缀的方式,那么,显式段寄存器优先。
指令的举例访问内存单元所用的段寄存器MOV AX, [123456H];默认段寄存器DSMOV EAX, [EBX+EBP];默认段寄存器DSMOV EBX, [EBP+EBX];默认段寄存器SSMOV EBX, [EAX+100H];默认段寄存器DSMOV EDX, ES:[EAX*4+200H];显式段寄存器ESMOV [ESP+EDX*2], AX ;默认段寄存器SSMOV EBX, GS:[EAX+EDX*2+300H];显式段寄存器GSMOV AX, [ESP] ;默认段寄存器SS
- 操作数的寻址方式
- 操作数的寻址方式
- 操作数的寻址方式
- 操作数寻址方式
- 操作数的寻址方式(非常重要)
- 指令及操作数的寻址方式
- 寄存器操作数的寻址方式
- 【汇编】操作数的寻址方式
- 操作数的寻址方式(非常重要)
- 操作数的寻址方式(非常重要)
- 操作数的寻址方式(寄存器间接,基址寻址,间址寻址,比例间接寻址)
- 关于操作数寻址方式、指令寻址方式、堆栈寻址方式的详解
- 汇编--操作数寻址方式
- 汇编语言基础四 —— 操作数的寻址方式
- 操作数的寻址方式(立即,寄存器,直接)
- 寻址方式 寄存器寻址方式 立即数寻址方式 存储器寻址方式: 直接寻址方式,寄存器间接寻址方式,变址和基址寻址方式,基址变址寻址方式 串操作寻址方式 I/O端口寻址方式
- 操作数的寻址方式(基址加间址寻址,基址加比例间址寻址,带位移的基址加间址寻址,带位移的基址加比例间址寻址)
- 数寻址方式
- C++虚继承内存对象模型探讨
- JQ优化
- SQL SERVER 触发器-实例
- 达芬奇密码 ——只有您自己才能打开的密码
- 简易桌面
- 操作数的寻址方式
- 三个层切换显示,在其中一个层操作时,页面刷新,还显示这个层
- Servlet中的filter
- aspx页面的控件事件无效的原因
- 维护类开发的利器
- 【souapp搜应用】:可牛杀毒软件连android手机应用.apk都误杀,真是头傻妞!
- 几个排序算法源码
- java String 类源代码
- UrlRewriter.dll伪静态的IIS配置