一、指令和数据的寻址方式
操作数或指令在存储器中的地址:某个操作数或某条指令存放在某个存储单元时其存储单元的编号
在存储器中,操作数或指令字写入或读出的方式,有地址指定方式、相联存储方式和堆栈存取方式。
寻找方式:当采用地址指定方式时,形成操作数或指令地址的方式。
寻址方式分为两类:指令寻址和数据寻址。
1)指令寻址:确定下一条预执行指令的指令地址
a、顺序寻址:(PC)+1->PC 程序计数器自动加1
b、跳跃寻址:由转移指令指出
2)数据寻址:确定本条指令的操作数地址
指令中所给出的地址码,并不一定是操作数的有效地址。
寻址过程就是把操作数的形式地址,变换为操作数的有效地址。
例如:一种单地址指令的结构如下所示,其中用X I D各字段组成该指令的操作数地址。
二、寻址方式
1、隐含寻址(操作数在累加寄存器中)
在指令中不明显的给出而是隐含着操作数的地址
例如:单地址的指令格式,没有在地址字段指明第二操作数地址,而是规定累加寄存器AL或AX作为第二操作数地址,AL或AX对单地址指令格式来说是隐含地址
eg: MOV AL ,LSRC_BYTE
MUL RSRC_BYTE
ADD | 寻址特征 | A |
操作数地址隐含在操作码中,(寻址特征指明寻址类型)。
另一个操作数隐含在ACC中
先在内存中地址为A的地方找到一个操作数,另一个操作数隐含在寄存器ACC里,从ACC里取出另外一个操作数,然后和给出的A地址中的数相加暂存在ACC中。
2、立即寻址
形式地址A就是操作数本身
OP | 立即寻址特性 # | A |
- 指令执行阶段不访存
- A的位数限制了立即数的范围
3、直接寻址
EA=A
直接根据读内存找到操作数,形式地址不需要经过任何处理。
- 执行阶段访问一次存储器
- A的位数决定了该指令操作数的寻址范围
MOV AX,[2222H]:将有效地址为2222H的内存单元的内容读到累加器AX中
4、间接寻址
EA=(A)
有效地址由形式地址间接提供,形式地址是操作数的地址的地址
OP | 间接寻址标识 | A |
根据A的内容到内存中寻找到的是操作的数地址,再根据这个地址去找操作数。
- 执行指令阶段2次访存
- 可扩大寻址范围
5、寄存器寻址
EA=R1
形式地址是寄存器的编号,直接去寄存器中寻址操作数。
- 执行阶段不访存,只访问寄存器,执行速度快
6、寄存器间接寻址
操作数里存放的是寄存器的编号,寄存器中存的不是操作数而是操作数的有效地址。所以操作数在存储器里。
- 有效地址在寄存器中,操作数在存储器中,执行阶段访存。
7、偏移寻址
一种强有力的寻址方式 EA=A+(R) 形式地址需要和另一个寄存器中的地址相加
形式地址A是显示的
另一个地址字段隐含在某个专用的寄存器R中。
常用的三个偏移寻址方式是:相对寻址 基址寻址 变址寻址(根据寄存器的不同类型来区分的)
7.1 相对寻址
A是相对于当前指令的位移量(可正 可负 补码)
EX=A+(PC) ----PC程序计数器 PC存储当前正在执行指令的地址
- A的位数决定操作数的寻址范围
7.2、基址寻址
EA=A+(BR) BR为基地址寄存器 (Base Register)
- 可扩大寻址范围
7.3、变址寻址
EA=A+(IX) IX为变址寄存器(专用) 通用寄存器也可以作为变址寄存器
- 可扩大寻址范围
- 在程序执行的过程中IX内容可变,形式地址A不变
- 便于处理数组问题
8、堆栈寻址
例:某16位机器所使用的指令格式和寻址方式如下所示,该机有两个20位基址寄存器,4个16位变址寄存器,十六个16位通用寄存器,指令汇编格式中S(源),D(目标)都是通用寄存器。M是主存中的一个单元。三种指令的操作码分别是MOV(OP)=(A)h ,STA(OP)=(1B) LDA(OP)=3C)h MOV是传送指令,STA为写数指令 LDA为读数指令
要求:1、分析三种指令的指令格式和寻址方式特点
2、CPU完成哪一种操作锁化时间最短?哪一种操作所花时间最长,第二种指令的执行时间有时会等于第三种指令的执行时间吗?
3、下列情况下每个十六进制指令分别代表什么?如果有编码不正确,如何改进才能成为合法指令?
- (F0F1)H(3CD2)H ---32位
- (2856)H --16位
- (6FD6)H --16位
- (IC2)H --16位
答:1、MOV:单字长,二地址指令属于RR指令
STA:双字长,二地址指令,RS指令 S为基址寄存器或变址寄存器
LDA:双字长,二地址指令,RS指令 S为20位地址。
2、MOV单字长取出只需要一次访存,第一个不访问存储器要快。第二种还需要计算有效地址并对存储器进行访问。第二种指令所花费的时间不等于第三种,第三种无需进行有效地址的计算。
3、根据条件。MOV(OP)=(A)h=001010
STA(OP)=(1B)h =011011
LDA(OP)=(3C)h=111100
(F1F1)h(3CD2)h=(1111 0000 1111 0001 0011 1100 1101 0010)b
正确,表明吧主存(13cd2)h地址单元的内存取至15号寄存器
(2856)H=(0010 1000 0101 0110)b 单字长指令表明吧寄存器6的内容传送到寄存器5号
(6FD6)H=0110 1111 1101 0110b操作码不对 应修改为(28D6)h
(1C2)H=00000001 1100 0010b操作码不对 应修改为(28C2)h
三、CISC何如RISC
复杂性指令系统计算机和精简型指令系统计算机
1、精简指令系统:选取使用频率最高的一些简单指令,指令条数少, 长度固定,指令少。
例:在SPARC中,有一些指令没有选入指令系统,但很容易使用指令集中的另外一条指令来替代实现
下表左半部列出了6条指令的功能,请在表的右半部填入替代指令及实现方法
答:因为SPARC约定R0的内容恒为0,而且立即数可以作为一个操作数来处理,所以某些指令可以替代实现。
指令 | 功能 | 替换指令 | 实现方法 |
MOVE | 寄存器间传送数据 | ADD | Rs+R0->Rd |
INC | 寄存器内容加1 | ADD | 立即数imm13=1,作为操作数 |
DEC | 寄存器内容减1 | SUB | 立即数imm13=-1 作为操作数 |
NEG | 取负数 | SUB | R0-Rs->Rd |
NOT | 取反码 | XOR | 立即数imm13=-1 作为操作数 |
CLR | 清除寄存器 | ADD | R0+R0=Rd |
例、一条指令存储在存储器中的地址为300的地方,其操作数地址字段为301,地址字段的值为400,处理器中寄存器R1中包含数据200,在以下指令寻址方式下,求操作数的有效地址。
1)直接寻址
2)立即数寻址
3)相对寻址
4)寄存器(R1)间接寻址
5)以R1为变址寄存器的变址寻址
300中是操作码 301是地址码说明占两个地址
答、1)400
2) 400是数本身 其地址是301
3)PC+400
4)寄存器间接寻址,寄存器里存的就是有效地址200
5)以R1为变址寄存器的变址寻址:操作数的有效地址为=200+400
格式表明有8个通用寄存器(产后度为16位),X指定寻址方式,主存实际容量为156K字。
1)假设不用通用寄存器也能直接访问主存中的每一个单元,并假设操作码域OP=6为,请问地址码域应
分配多少位?指令字长度应有多少位?
2)假设X=11时,指定的某个通用寄存器用做基址寄存器,请提出一个硬件设计规则,使得被指定的通用寄存器能访问1M主存空间中的每一个单元
答:1)主存容量为256K 地址域码为18位,指令的长度为6+2+3+18=32位
2)1M需要20位地址
此时指定的通用寄存器用做基址寄存器,长度为16位,不能覆盖1M字空间,可采用基址寄存器左移4位,低位补0,形参20位的基地址,然后与质量字形式地址相加得到有效地址,可以访问1M字空间的任意一个单元。
例:假设寄存器中R中的数值为1000,地址为1000的寄存器中存储的数据为2000,地址2000的存储器中存储的数据为3000,问在以下寻址方式中访问的指令操作数的值是什么?
1)寄存器寻址R
寄存器寻址,寄存器中的值就是操作数所以值为1000
2)寄存器间接寻址(R)
R中存的是地址,所以数据是2000
3)直接寻址1000
形式地址是1000,操作数是2000
4)存储器的间接寻址(1000)
地址1000中存放的2000是形式地址 2000中存放的才是数据,所以操作数是3000
5)立即数寻址 #2000
立即寻址里面存放的就是操作数本身,所以操作数是2000
例、某计算机字长为16位,主存地址空间大小为128k,按字编址,采用单字长指令格式,指令各字段定义如下
转移指令采用相对寻址,相对偏移是用补码表示,寻址方式定义如下
Ms/Md | 寻址方式 | 助记符 | 含义 |
000B | 寄存器直接 | Rn | 操作数=(Rn) |
001B | 寄存器间接 | (Rn) | 操作数等于((Rn)) |
010B | 寄存器间接。自增 | (Rn)+ | 操作数=((Rn)) (Rn)+1->Rn |
011B | 相对 | D(Rn) | 转移目标地址=(PC)+(Rn) |
(X)表示有存储地址X或寄存器X的内容
1)该指令系统最多可有多少指令?该计算机最多有多少个通用寄存器?存储地址的寄存器(MAR)和存储数据的寄存器(MDR)至少各徐多少位?
答:操作码有4位所以指令最多有1的四次方16条指令,
指令操作数占6位,其中3位指示寻址方式,寄存器编号为3位,所以该计算机最多可有2的三次方也就是8个通用寄存器
计算机字长16位,所以存储器寄存器(MDR)至少为16位。
主存空间为128KB,按字(16位)编址,则寻址范围为0~64K 存储器地址寄存器(MAR)需16位(2的16次方=64K)
2)转移指令的目标地址范围是多少?
答:16位计算机通用寄存器也是16位,则指令中寻址范围至少可达0~2的16次方-1
另一方面,主存地址空间为2的16次方(64K)则寻址范围也应该大于等于64K,故转移指令的目标范围为0~2的16次方-1
3)若操作码0010B表示加法操作(助记符为add),寄存器R4和R5的编号分别为100B和101B,R4的内容为1234H,R5的内容为5678H,地址1234H的内容为5678H,5678H中的内容为1234H,则汇编语言为add(R4),(R5)+
对应的机器码是什么(十六进制)?该指令操作执行后,哪些寄存器和存储单元的内容会改变?改变后的内容是什么?
答:R4是间接寻址 R5是间接寻址+自增
操作码 源寻址方式 源寄存器 目标寻址方式 目标寄存器
0010 001 100 010 101
该指令的功能是将R4内容所指存储器单元的内容(源)与R5内容所指存储器单元(目标)的内容相加后,写到R5内容所指的存储器单元,即
R4的内容:1234H,R4内容所指存储器单元内容:5678H
R5的内容:5678H,R5内容所指存储器单元内容:1234H
目标寄存器R5自加:5678H+1=5679H
所以执行后,目标寄存器R5目标寄存器内容所指的存储器单元将改变,新R5=5679H
R5所指存储单元(地址5678H的内容)=68ACH
例:某机器字长16位,主存按字节编址,转移指令草原相对寻址,由两个字节组成,第一字节为操作码字段,第二字节为相对位移量字段,假定取指令时,每取一个字节PC自动+1,若某转移指令所在主存地址为2000H,相对位移量字段的内容为06H,则该转移指令成功转以后的目标地址是
A:2006H B2007H C:2008H D:2009H
答:1个字节8位,机器字长16位 转移指令占2个字节, 读操作码是PC+1=2001 读偏移地址又+1变为2002H ,用2002和偏移量06相加,得2008H 选D
来源:oschina
链接:https://my.oschina.net/u/4302374/blog/3383500