第二章 寻址方式.docx
- 文档编号:23829880
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:30
- 大小:293.25KB
第二章 寻址方式.docx
《第二章 寻址方式.docx》由会员分享,可在线阅读,更多相关《第二章 寻址方式.docx(30页珍藏版)》请在冰豆网上搜索。
第二章寻址方式
第二章寻址方式
在8086微处理器中,一条指令通常由操作码加上操作数构成。
指令形式为:
操作码[操作数1],[操作数2];注释
其中,操作码指明执行的动作,操作数指明操作的对象。
由于寄存器数量有限,操作数不可能都放在寄存器中,实际上,操作数既可以放在寄存器中,也可以放在主存贮器中,这样就涉及到操作数的寻址问题。
我们将寻址操作数存放地址的方式称为寻址方式。
本章的内容包括:
主存储器和物理地址的形成
寻址方式
常量与变量的定义
2.1主存贮器和物理地址的形成
一、主存贮器
计算机存贮系统分为:
主存贮器(内存)、辅助存贮器(外存)。
●主存容量小、存取速度快、价格高;
●辅存容量大、存取速度慢、价格低。
主存贮器的基本存贮单位是“位”(bit),每8位组合成一个“字节”;每相邻的两个字节称为“字”;相邻的四个字节称为“双字”。
为了区别各个存贮单元,给每个单元编号,称为地址。
地址:
字节单元的编号,也称为物理地址。
低字节放低位,高字节放高位。
例如:
0004单元存放内容为1234H。
二、存储器物理地址的形成
早期的8086微处理器,有20根地址线,寻址范围2^20=1M字节。
但是,8086内部为16位结构,与地址相关的寄存器均为16位,从而导致可寻址范围为64K。
因此,设计成为将主存分段使用,每段最大为64K字节。
用CS、DS、SS、ES保存当前可用段的段首地址。
规定:
段首地址只能从任一“小段”的首地址开始,也就是必须最低4位为0,如果所有的段首地址都是这样,则可以忽略最低4位,而只将高16位放到段寄存器中。
因此,计算物理地址时,应将段寄存器内容左移4位,恢复段首址原值,然后再与本段中待访问单元的偏移地址相加,得到访问单元的物理地址。
因此,被访问单元物理地址PA=段首址*16+偏移地址。
具体在不同的段中,物理地址为:
1.代码段:
待取指令PA=(CS)左移4位+(IP)
2.数据段、附加数据段:
PA=(DS或ES)左移4位+(EA)
如:
(DS)=8765H,某变量Y的EA=153H,则Y的物理地址:
PA=(8765)左移4位+153H=877A3H
3.堆栈段:
栈顶PA=(SS)左移4位+(SP)
入栈、出栈指令SP自动变化,不需用户设置。
如果需要访问堆栈段,将偏移地址放在BP中,计算堆栈单元物理地址。
某堆栈单元PA=(SS)左移4位+(BP)
注意:
●DS、ES需要用户自行设计,CS由系统赋值
●各段可以完全重叠、部分重叠、不重叠
●各段最大为64KB
●上述物理地址的计算,皆由微处理器自动完成,编程时,着重考虑偏移地址的表示形式,也就是操作数所在位置。
三、保护模式下的内存管理
1.80x86的寻址范围
●80x86地址总线32位,寻址范围4G
●80x86通用寄存器32位,寻址范围也是4G
所以80x86的一个通用寄存器能够存放一个完整的32位地址
2.虚拟内存与分页机制
在支持虚拟内存的32位操作系统(WIN32,Linux等)中,目标是要为每个进程提供一个独立的4G大小的虚拟地址空间。
在80x86保护模式下,逻辑地址空间(多个进程的地址空间总和)大于物理地址空间,所以用实模式的地址直接映射不能满足此要求,需要通过虚拟内存管理器,采用分页机制来实现:
●将物理地址映射到进程的逻辑地址空间上;
●只有映射了物理内存的逻辑地址空间才能访问;
●每次映射的物理内存不大,且用完后可释放,再重新映射到新的逻辑地址空间上,因此能够让多个进程同时运行;
●分页由系统基于页目录和页表,自动完成
3.特权级与分段机制
(1)80x86有4个特权级:
0,1,2,3(0级最高,3级最低),能够在虚拟内存的基础上实现进一步的内存保护机制
如果程序有0级权限,它可以执行所有的指令,访问所有的数据。
如果程序只有3级权限,则它只能执行有限的指令,访问有限的数据(它自己的数据)。
(2)80x86通过分段机制来实现特权级的访问控制。
用“段选择符:
EA”的形式表示逻辑地址,段选择符(16位)存放在段寄存器中,指向一个段描述符(64位)。
用逻辑地址访问内存时,段选择符中的特权级需要高于段描述符中的特权级。
(3)由逻辑地址生成物理地址的过程:
EA要小于“段界限*4K”。
一般应用程序中,段基址为0,段界限为0FFFFFH。
所以对线性地址的形成不产生影响。
所以32位保护模式下,在一般的应用程序中,是一个可通过EA访问的,平坦的,独立的4G内存空间。
不用特别考虑分段和分页。
2.2寻址方式
一、立即寻址
操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,这种操作数称为立即数。
汇编格式:
n
功能:
指令的下一单元的内容为操作数n,即:
n也称为立即数。
例如:
MOVAX,3064H
目的操作数采用寄存器寻址,地址为AX。
源操作数采用立即寻址。
即:
立即寻址方式主要用于给寄存器或存储器赋初值。
注意:
●立即数只能作为双操作数指令的源操作数,不能作为目的操作数;如:
MOV100H,AX
●立即数不能作为单操作数指令的操作数;如:
INC50
●立即数只有大小,没有类型,未分配内存单元;
二、寄存器寻址
在这种寻址方式中,指令所指明的寄存器存放操作数
汇编格式:
R(R为8或16位寄存器)
功能:
寄存器R的内容就是操作数。
表示:
指令指明操作数在R中。
例:
INCAX
操作数在AX中。
执行前:
(AX)=12H
执行:
(AX)+1→AX。
执行后:
(AX)=13H
例:
ADDAX,BX
AX为目的操作数地址,BX为源操作数地址。
执行前:
(AX)=1234H,(BX)=5620H
执行:
(AX)+(BX)→AX。
执行后:
(AX)=6854H,(BX)=5620H
此例中,目的操作数、源操作数都是用寄存器寻址。
注意:
●采用寄存器寻址方式,指令执行速度快。
特别是加法指令,如果目的操作数为AX,指令执行快一些。
●采用寄存器寻址方式,目的、源操作数类型必须一致。
如:
MOVAH,BX就是错误的。
三、直接寻址
直接寻址方式中,操作数的偏移地址就在指令操作码后面,而操作数则存放在内存中。
汇编格式:
段寄存器:
[EA],或地址表达式
功能:
指令下一字单元的内容是操作数的偏移地址。
例如:
MOVAX,[2000H]
执行前:
(DS)=3000H,(32000H)=1234H
源操作数寻址过程:
执行:
(32000H)→AX
执行后:
(AX)=1234H
注意:
1)操作对象在段寄存器指定的段中。
漏写段跨越前缀,则错误地认为是立即数
(2)“段寄存器名:
[EA]”格式表示的操作数无类型。
。
“地址表达式”格式中,若还有变量,则表示的操作数有类型。
例:
MOVAX,ES:
[20H];源操作对象在内存ES段中,无类型。
MOVBUF,AX;目的操作数为直接寻址,其中BUF为已定义的字类型的变量。
四、寄存器间接寻址
操作数的有效地址(偏移地址)在基址寄存器BX、BP或变址寄存器SI、DI中,而操作数则在存贮器中。
汇编格式:
[R]
功能:
R的内容为操作数的偏移地址EA,即:
R只能是BP、BX、DI、SI之一。
注意BP所指的段为堆栈段。
例:
MOVAX,[SI]
AX是目的操作数地址,采用寄存器寻址方式;
[SI]指明源操作数采用寄存器间接寻址方式。
假定执行前:
(AX)=5,(DS)=2000H,(SI)=1000H,(21000H)=50A0H。
源操作数寻址过程:
执行:
(21000H)→AX
执行后:
(AX)=50A0H,(SI)、(DS)、(21000H)不变。
例:
MOVAX,[BP]
假定执行前:
(AX)=0,(BP)=30H,(SS)=2000H,(20030H)=1234H。
源操作数寻址过程:
执行:
(20030H)→AX
执行后:
(AX)=1234H,(BP)、(SS)、(20030H)不变。
注意:
(1)当R是BP,则操作对象在堆栈段中。
即操作数地址为“SS:
(R)”;
当R为BX,SI,DI,则操作对象在数据段中,即操作数为”DS:
(R)”。
(2)此种寻址无类型
(3)[R]中的R必须是规定的寄存器。
如:
MOV[AX],CX;ERROR
MOVDX,[BL];ERROR
五、变址寻址
操作数的偏移地址EA是指令中指明的寄存器的内容与指令中给出的位移量之和。
操作数在存贮器中。
汇编格式:
X[R](或:
[R]+X,或X[R])
功能:
R的内容与X相加,和为操作数的偏移地址EA。
也就是:
寄存器的选择同寄存器间接寻址一样,只能是BP、BX、DI、SI之一。
注意BP所指的段为堆栈段。
例:
MOVAX,COUNT[SI]也可表示为:
MOVAX,[COUNT+SI]
目的操作数采用寄存器寻址方式,操作数地址为AX。
源操作数采用变址寻址方式。
操作数EA=[SI]+COUNT。
假定执行前:
(SI)=2000H,(DS)=3000H,COUNT=3000H,(AX)=0,(35000H)=1234H。
源操作数的寻址过程如下:
执行:
(35000H)→AX
执行后:
(AX)=1234H,(SI)、(DS)、(35000H)内容不变。
例:
ADDCOUNT[BP],BX
目的操作数采用变址寻址方式,偏移地址EA=[BP]+COUNT。
源操作数采用寄存器寻址方式。
假定执行前:
(BX)=40H,(BP)=2000H,(SS)=3000H,COUNT=3000H,(35000H)=50H。
目的操作数的寻址过程如下:
执行:
(35000H)+(BX)→35000H单元
执行后:
(35000H)=90H,(BX)、(BP)、(SS)内容不变。
注意:
采用变址寻址可以方便地访问数组中的任一元素,使得编程更加方便。
例如:
一唯数组a,其存放如图所示。
(1)段属性问题
V为常数或数值表达式时,操作对象的段由R决定
V为变量或标号时,操作数对象所在的段就是变量或标号所在的段。
(2)类型
当V为常量时,此种寻址无类型;
当V为含有变量或者标号的表达式时,则有类型。
如:
MOVBUF[BX],CX;
若BUF是已定义的字类型变量,BUF[BX]类型为字类型。
若BUF定义为字节类型,则BUF[BX]与CX类型不一致。
(3)R必须为规定的寄存器
MOVAX,-12[CX];ERROR
六、基址加变址寻址
操作数的偏移地址EA是指令中指定的基址寄存器内容、变址寄存器内容及位移量X三者之和。
操作数存放在主存之中。
汇编格式:
X[BR+IR]
功能:
BR的内容加上IR的内容,再加上X,得到操作数的偏移地址。
也就是:
EA=(BR)+(IR)+X。
其中:
BR表示基址寄存器,只能是BX、BP之一。
IR表示变址寄存器,只能是SI、DI之一。
也就是:
EA=[BX]+[SI]或[DI]+X;数据在当前DS中
EA=[BP]+[SI]或[DI]+X;数据在当前SS中
同前面一样,基址寄存器决定操作数所在的段。
如果选用BX,则操作数在数据段内;如果选用BP,则操作数在堆栈段内。
例1:
MOVAX,MASK[BX][SI],也可以写成:
MOVAX,MASK[BX+SI]或MOVAX,[MASK+BX+SI]
目的操作数采用寄存器寻址,地址在AX。
源操作数采用基址加变址寻址,EA=[BX]+[SI]+MASK。
执行前:
(DS)=3000H,(BX)=2000H,(SI)=1000H,MASK=250H,(33250H)=1234H。
源操作数寻址过程:
执行:
(33250H)→AX
执行后:
(AX)=1234H,(BX)、(SI)、(DS)、(33250H)不变。
例2:
ADDAX,MASK[BP+DI]
目的操作数采用寄存器寻址,地址在AX。
源操作数采用基址加变址寻址,EA=[BP]+[DI]+MASK。
执行前:
(SS)=3000H,(BP)=2000H,(DI)=1000H,MASK=8H,(33008H)=34H,(AX)=12H。
源操作数寻址过程:
执行:
(AX)+(33008H)→AX
执行后:
(AX)=46H,(BP)、(DI)、(SS)、(33008H)不变。
名称
操作数存放位置
偏移量
变址寄存器
立即数
常数
×
×
寄存器
寄存器
×
×
直接
内存
√
×
间接
内存
×
√
变址
内存
√
√
基址加编址
内存
√
两个
七、寻址方式注意事项
1.某些指令的执行要涉及到缺省的操作数,其寻址方式也是隐含的。
例:
CBW
隐含源和目的操作数。
源操作数为AL,寄存器寻址;目的操作数为AX,寄存器寻址
2.双操作数指令中,源和目的操作数不能同为存储器寻址方式
例:
指令中操作数指定错误
MOVBYTEPTR[SI],[DI]
ADD[EBX+EDI*4+10],COUNT
3.指令中至少有一个操作数的类型要明确,若为双操作数,则操作数的类型必须相同。
例:
判断指令中操作数指定是否正确
INCDS:
[100H];错
DEC[DI];错
ADD[BX+SI],12H;错
MOVBX,AL;错
MOVWORDPTR[BX],‘C’;对
DECBYTEPTR[SI];对
4.跨段寻址
如果选用BP或EBP作间址寄存器、变址寄存器或基址寄存器,则操作数在堆栈段内;如果选用BX、SI、DI作间址寄存器、变址寄存器或基址寄存器,则操作数在数据段内。
上述两种寻址方法都是80x86微处理器所默认的状态。
在实际编写程序时,可以利用段寄存器,指明所要寻址的段。
汇编格式:
段寄存器名:
功能:
冒号之前的段寄存器指明了操作数所在段。
例如:
MOVAX,DS:
[BP]
MOVBX,ES:
[BX]
MOVCX,SS:
[SI]
MOVDX,SS:
[DI]
DS、ES、SS指明了数据所在段,而原来的默认状态不起作用。
第1条:
操作数在DS段,PA=(DS)左移4位+[BP]
第2条:
操作数在ES段,PA=(ES)左移4位+[BX]
第3条:
操作数在SS段,PA=(SS)左移4位+[SI]
第4条:
操作数在SS段,PA=(SS)左移4位+[DI]
八、32位寻址方式
1寄存器间接寻址:
[R]
(1)可使用8个32位通用寄存器:
EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP
(2)ESP和EBP默认为SS段,其他默认为DS段
2.变址寻址:
X[R]
(1)可使用8个32位通用寄存器
(2)ESP和EBP默认为SS段,其他默认为DS段
3.基址加变址寻址:
X[BR][IR]
(1)可使用8个32位通用寄存器
(2)32位通用寄存器可任意搭配,不受BR+IR限制(除了IR不能为SP)
(3)当BR为ESP和EBP时,默认为SS段,否则为DS段
4.16位-32位汇编程序,可分为三种情况:
(1)16位寄存器,16位寻址:
普通的三段式程序
(2)32位寄存器,16位寻址:
(1),加.386,加USE16
(3)32位寄存器,32位寻址:
(1),加.386,加.MOELFLAT,且不用DOS功能调用,而换用WIN32函数调用
在情况
(2)中,前面所讲的6中寻址方式仍然有效。
在情况
(2)中,计算得到的EA仍不能超过16位。
在情况(3)中,不能使用16位寄存器寻址,计算得到的EA能超过16位,有32位的空间。
5.带有比例因子的寻址方式
CPU提供的指令和寻址方式,需要能够将高级语言翻译成高效的机器代码。
高级语言中除了简单变量,还有一维或多维数组、结构、结构组成的数组等数据结构,因此提供了更多的32位寻址方式。
带有比例因子的寻址方式:
[R]->[R*F]
V[R]->V[R*F]
V[BR][IR]->V[BR][IR*F]
(1)只在变址寄存器上可以加比例因子F
(2)比例因子F可以为1,2,4,8
例:
MOVAX,BUF[EBX][ESI*2]
则EA=(EBX)+2*(SI)+BUF的偏移地址
九、寻址方式举例
例1:
已知数据段定义和存储示意图如下:
DATASEGMENT
BUFDB10,20,40,80,30
BUF1DB5DUP(0)
DATAENDS
(1)分别利用直接寻址,寄存器间接寻址,变址寻址和基址加变址寻址,将该段中BUF+3单元中的内容送到AL中。
●直接寻址
MOVAL,BUF+3
●寄存器间接寻址
LEABX,BUF+3;将BUF+3相对于段首地址的偏移地址EA=3送入BX中。
MOVAL,[BX]
●寄存器变址寻址
LEABX,BUF;取BUF的EA->BX
MOVAL,[BX+3];((BX)+3)->AL
●基址加变址寻址
LEABX,BUF;
MOVSI,3;
MOVAL,[BX+SI];
(2)利用寄存器间接寻址,变址寻址和基址加变址寻址,将BUF为首址的连续字节单元的内容分别送到以BUF1为首址的连续字节单元中。
●寄存器间接寻址
…
LEASI,BUF
LEADI,BUF1;
MOVCX,5;
A:
MOVAL,[SI];
MOV[DI],AL;
INCSI;
INCDI;
DECCX;
JNZA;
…
●变址寻址
…
MOVSI,0;
MOVCX,5;
A:
MOVAL,BUF[SI];
MOVBUF1[SI],AL;
INCSI;
DECCX;
JNZA;
…
●基址加变址寻址
…
LEABX,BUF
LEABP,BUF1
MOVSI,0;
MOVCX,5;
A:
MOVAL,[BX][SI];
MOVDS:
[BP][SI],AL;
INCSI;
DECCX;
JNZA;
…
●说明:
(a)寄存器间接寻址,变址寻址和基址加变址寻址都能用来传送一片连续存储区的内容。
(b)该例中,变址寻址方式最直观,可读性最好
2.3常量与变量的定义
汇编程序的语句中具体的操作数,可以分为常量和变量两种:
表达式:
由常数、寄存器、标号、变量加上运算符构成的式子。
一、常量与数值表达式
1.常量
常量:
汇编时已有确定的数值的量。
用途:
赋值、作立即数、位移量。
符号常量的定义:
等价伪指令EQU
等号伪指令=
使用:
定义后直接引用符号名。
注意:
●符号常量不分配存贮单元,只建立等价代换关系,可出现在任何段。
●用EQU语句定义的符号常量在该程序中不能再重新赋值,而用“=”定义的符号常量可多次重新赋值,使用时,以最后一次定义的值为准。
2.数值表达式
由常量与运算符组成的式子。
数值表达式在汇编期间进行运算,结果为常量。
汇编期间允许对常量进行3种运算:
●算术运算
包括:
+、–、*、/、模除(MOD,取余数)、右移、左移。
●逻辑运算
包括:
逻辑乘:
AND(与),逻辑加:
OR(或),按位加:
XOR(异或),逻辑非:
NOT(非)
●关系运算
包括:
相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于等于(LE)、大于等于(GE)。
运算结果:
关系不成立,结果为0;关系成立,结果为–1(0FFFFH)。
如:
N=50
M=(NEQ50)
该关系成立,M=–1。
二、变量与地址表达式
1.变量
数据段或附加数据段中一个数据存贮单元的名字,是这个存储单元的地址的符号表示。
可代表一批存储单元的首址。
(1)变量的属性
●段属性
定义变量所在段的段首址,当访问该变量时该段首址应在某一段寄存器中,即为CPU当前可访问段。
●偏移地址
该变量所占存储单元到所在段的段首址的字节距离。
●类型
类型是指存取该变量中的数据所需要的字节数,变量的类型由定义该变量时所使用的伪指令确定。
(2)变量的定义
格式:
[变量名]数据定义伪指令表达式[,…]
●数据定义伪指令
DB、DW、DD、DQ、DT等。
●表达式
(a)数值表达式
(b)ASCII字符串
(c)地址表达式(DW地址表达式为变量时,DW内容为变量的EA;DD地址表达式为变量时,DD的内容为EA+段首址)
(d)?
不确定
(e)nDUP(表达式),重复子句
上述(a)~(e)组成的系列,中间用逗号隔开。
(3)示例:
DATASEGMENTUSE16
ADWM
BUFDB‘AB’,0DH,0AH
CONEQU500H
BDW0FFAAH
MARK=100H
DDDBUF
MDB2DUP
(1),2DUP(2,‘B’)
DB‘123’,1
DATAENDS
●请画出数据段中的数据在主存中的存储形式。
●在上例中分别执行语句后AL的结果。
MOVAL,BUF
MOVAL,BUF+2
●指令MOVEDX,M是否正确?
●注意
伪指令EQU及“=”不分配存贮单元
使用直接寻址方式时,变量的类型必须与指令的要求相符
变量的段必须是当前段
2.地址表达式
由变量、标号、常量、寄存器(名加方括号)及一些运算符(数值表达式的运算符和特殊运算符)所组成的有意义的式子。
地址表达式也具有段、EA、类型等三个属性。
简单的地址表达式:
直接寻址、间接寻址、变址、基址加变址等。
在地址表达式中,除运算符外、还可使用特殊算符。
(1)属性定义符
●类型运算符PTR
功能:
指明变量、标号或地址表达式的类型。
格式:
类型PTR地址表达式;
类型包括:
BYTE、WORD、DWORD、NEAR、FAR等。
例:
MOVBYTEPTR[SI+4],55H
…
TWODW055H;定义一个字
…
MOVAH,BYTEPTRTWO;只读字节
例:
DATASEGMENT
TWODW1234H,5678H
ONEEQUBYTEPTRTWO
DATAENDS
●跨段前缀符“:
”
功能:
指定变量、标号、地址表达式的段属性。
格式:
段名:
地址表达式。
例:
DS:
[BP]。
●定
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二章 寻址方式 第二 寻址 方式