arm指令中的立即数

寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。寻址方式分为指令寻址和数据寻址两大类。 指令中的地址码字段并不代表操作数的真实地址,这种地址称为形式地址(A)。形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址,这种地址称为有效地址(EA)。 注:

寻址方式是指寻找指令或操作数有效地址的方式,即确定本条指令的数据地址及下一条待执行指令的地址的方法。寻址方式分为指令寻址和数据寻址两大类。

指令中的地址码字段并不代表操作数的真实地址,这种地址称为形式地址(A)。形式地址结合寻址方式,可以计算出操作数在存储器中的真实地址,这种地址称为有效地址(EA)。

注:(A)表示地址为A的数值,A既可以是寄存器编号,也可以是内存地址。对应的(A)就是寄存器中的数值,或相应内存单元的数值。EA = (A)是指有效地址是地址A中的数值。

指令寻址

指令寻址方式有两种:顺序寻址和跳跃寻址。

顺序寻址

可通过程序计算器(PC)加1(1个指令字长),自动形成下一条指令的地址。

注:如果是按字节编址,或采用变长指令字结构,PC简单加1就不行。只有当满足:定长指令字结构+按指令字编址时才会有PC每次都加1!!

定长指令字结构、按字编址、指令字长=存储字长=16bit=2B

18ccf3b5ea7f526a10ad072ccd7d48f0.png

定长指令字结构、按字节编址、指令字长=存储字长=16bit=2B

(PC)+  2 → PC

4bd0c2dab2b7b9d54612fb5a2e9d51a3.png

变长指令字结构、按字节编址、指令字长=存储字长=16bit=2B

由于CPU无法确定当前指令到底占多少存储字。此时可以先读入第一个字的内容,由于操作码是包含在第一个字中,CPU可以根据操作码判断这条指令是几地址指令,进而可以得到该指令的总字节数n,再根据n修改PC的值。

注:如果是按字编址则,n应该是总存储字数。

57b40be1a263df69addcef64e9011187.png

跳跃寻址

通过转移类指令实现。所谓跳跃,是指下条指令的地址码不由程序计算器给出,而由本条指令给出。

注:是否跳跃可能受到状态寄存器和操作数的控制,而跳跃到的地址分为绝对地址(由标记符直接得到)和相对地址(相对于当前指令地址的偏移量),跳跃的结果是当前指令修改PC值,所以下条指令仍然通过程序计数器(PC)给出。

当遇到跳转指令时,PC的值依然先+1,然后CPU执行跳转指令后再修改PC的值为要跳转的值。因此如果跳转指令条件满足PC的值前后会改变两次

数据寻址——找到操作数

任务:确定本条指令的地址码指明的真实地址EA(即操作数的存放地址)。由于程序在内存中的起始地址并不一定是0,所以会有多种地址码解释方式。

1、在程序在内存中的起始地址为0时,地址码指明的地址就是真实地址。

直接寻址、间接寻址、寄存器寻址、寄存器间接寻址、隐含寻址、立即数寻址都属于非偏移寻址。

2、程序在内存中的起始地址不为0,地址码指明的是以起始地址为基准的数值。    

基址寻址和变址寻址都是以某个起始地址为基准的。

3、程序在内存中的起始地址不为0,地址码指明的是以PC的值为基准的数值。

相对寻址是以PC的值为基准的。

后两种都是以某个地址作为起点,形式地址视为“偏移量”。——这就是偏移寻址

d40c64b0f83b5eb421410fd3bee82c7f.png

由于数据的寻址方式较多,为区别各种方式,通常在指令字中设置一个“寻址特征”字段,用来指明属于哪种寻址方式,指令格式如下:

379e11d4e08bc915ed35566a14768579.png

一、直接寻址——EA=A

指令字中的形式地址A就是操作数的真实地址EA,即EA=A

f2c23904fa4bcf6e1220b03170a51870.png

访存次数:取指令1次,执行指令1次,暂不考虑存结果,共访存2次。

优点:简单,指令执行阶段仅访问一次主存,不需专门计算操作数的地址。

缺点:A的位数决定了该指令操作数的寻址范围。操作数的地址不易修改。

二、间接寻址——EA=(A)

指令的地址字段给出的形式不是操作数的真正地址,而是操作数有效地址所在的存储单元的地址,也就是操作数地址的地址,即EA=(A)

0c585885da8aa23f6071b724e39d9a89.png

一次间址访存次数:取指令1次,执行指令2次,暂不考虑存结果,共访存3次。

优点:

①可扩大寻址范围(有效地址EA的位数大于形式地址A的位数)。

由于EA是存放在主存单元中,理论上,EA可以很大,但过大就无意义了,所以此时EA可以表示所有的主存空间。

②多次间接寻址可以便于编制程序(用间接寻址可以方便地完成子程序返回)。

③有利于多道程序并发执行

缺点:指令在执行阶段要多次访存(一次间址需两次访存,多次寻址需要根据存储字的最高位确定几次访存)。

三、寄存器寻址——EA=Ri

寄存器寻址是指在指令字中直接给出操作数所在的寄存器编号,即EA=Ri,其操作数在由Ri所指的寄存器内。

寄存器寻址的地址码位数由通用寄存器个数决定。

14428726468b8c0912df6c1889b8675d.png

访存次数:取值令1次,执行指令0次,暂不考虑存结果,共访存1次。

优点:指令在执行阶段不用访问主存,只访问寄存器,速度快。支持向量/矩阵运算。

缺点:寄存器价格昂贵,数量较少,对应地址码长度短,寻址范围小。

四、寄存器间接寻址——EA=(Ri)

寄存器Ri中给出的不是一个操作数,而是操作数所在主存单元的地址,即

EA=(Ri)。

cab52f27a4a53a2e1443dd378c1219af.png

访存次数:取指令1次,执行指令1次,暂不考虑存结果,共访存2次。

特点:与一般间接寻址相比速度更快,不过比寄存器寻址速度慢。寻址范围大。

五、隐含寻址

不显式地给出操作数的地址,而是在指令中隐含着操作数的地址。

06685824a68fe8aa3c18dde7c95477e3.png

优点:有利于缩短指令字长。

缺点:需增加存储操作数或隐含地址的硬件。

六、立即(数)寻址

形式地址A就是操作数本身,又称立即数,一般采用补码形式。“#”表示立即寻址特征。

19ede44431f1e0556f6deaf4661c2c32.png

优点:指令在执行阶段不访问主存,指令执行时间最短。

缺点:A的位数限制了立即数的范围。


前面的寻址方式都是非偏移寻址,接下来的三种寻址方式属于偏移寻址。


一、基址寻址——EA = (BR)+A

以程序的起始存放地址作为“起点”

将CPU中基址寄存器(BR,base address register)的内容加上指令格式中的形式地址A而形成操作数的有效地址。此时形式地址A通常称为偏移量OFFSET

594a36c4656f8a3cc9507a0b4a566b9c.png

Tips:OS中的”重定位寄存器”就是“基址寄存器”。

注:指明寄存器的bit数是根据通用寄存器总数来判断的。

基址寄存器可以采用专用寄存器BR,也可以采用通用寄存器。

基址寻址的作用:便于程序的“浮动”,程序可以从内存中任何地址作为起始地址往后存放,当程序在主存中的起始位置改变后,OS只需要改变基址寄存器中的内容,让其指向当前的起始地址(存在PCB中)就可以。每个程序运行前,CPU将BR的值修改为该程序的起始地址。

优点:可以扩大寻址范围(基址寄存器的位数大于形式地址A的位数);用户不必考虑自己的程序存于主存的哪个空间区域,因此有利于多道程序设计,并可用于编制浮动程序,但偏移量(形式地址A)的位数较短。

注:基址寄存器BR是面向操作系统的,其内容由操作系统或管理程序确定。在程序运行过程中,基址寄存器的内容不变(作为基地址),形式地址可变(作为偏移量)。

当采用通用寄存器作为基址寄存器时,可由用户决定哪个寄存器作为基址寄存器,但其内容仍然由操作系统决定。

二、变址寻址——EA = (IX)+A

程序员自己决定从哪里作为“起点”

将变址寄存器IX(Index Register)中的内容加上指令格式中的形式地址A而形成操作数的有效地址。

b402cdaae43912c797e700d00d10735f.png

变址寄存器是面向用户的,在程序执行过程中,变址寄存器的内容可由用户来定义。

形式地址A不变,且A作为基址,IX作为偏移量。

优点:

可扩大寻址范围(变址寄存器的位数大于形式地址A的位数)偏移量(变址寄存器IX)的位数足以表示整个存储空间。

在数组处理中,可设定A为数组的首地址,不断改变变址寄存器IX的内容,便可以很容易形成数组中任一数据的地址,特别适合编制循环程序。

b4e1982ca4c8c1638edddfa87a7a421b.png

三、基址&变址复合寻址

0ef354af8199d39cf85b4b13e1e431d9.png

四、相对寻址——EA = (PC)+A

以程序计数器PC所指地址作为“起点”

将程序计数器(PC)的内容加上指令格式中的形式地址A而形成操作数的有效地址。此时的A也称为偏移量OFFSET。

A是相对于PC所指地址的偏移量,可正可负,用补码表示。

5bc3938305f260c0856d0131476312c3.png

注:当取走一条指令后PC的值一定会自动“+1”,因此A是相对于当前地址的下一条地址的偏移量,而不是当前地址!!!

转移类指令通常使用相对寻址方式

相对寻址的作用

由于程序中的代码段大多时候需要挪动位置,如果此时还是使用直接寻址方式来解析指令(如跳转指令)就会出现错误。此时使用相对寻址方式来解析指令,就可以避免错误的产生,保证循环的正常运行。

b3f713bf1964d4f13955091ec3af15c1.png

c20a7275aeb9efbe0184e79159811441.png

dbaa710f71edb0028a8e154079ccfd6f.png

引入相对寻址后,可以方便每段代码在程序内浮动

注意:由于程序段的浮动,可能会导致数组始址发生变化,进而会影响数组的访问。如果每次移动都要重新改变数组始址会很麻烦。此时采用“分段”方式解决,将程序分为程序段和数据段两部分。数组部分存放在数据段中,程序段的移动不会改变数组的始址。

优点:操作数的地址不是固定的,它随着PC值的变化而变化,并且与指令地址之间总是相差一个固定值,因此便于程序内部的程序段的浮动。(基址寻址中的浮动是整个程序在内存中的浮动)

寻址方式有效地址访存次数(指令执行期间)用途
隐含寻址程序指定0有利于虽短指令字长
立即寻址A即是操作数(#操作数补码)0执行阶段不用访存,执行时间最短
直接寻址EA = A1
一次间接寻址EA = (A)2
寄存器寻址EA = Ri0
寄存器一次间接寻址EA = (Ri)1
相对寻址EA = (PC) + A1转移指令
基址寻址EA = (BR) + A1多道程序
变址寻址EA = (IX) + A1循环程序,数组问题。
堆栈寻址入栈/出栈时EA的确定方式不同硬堆栈不访存,软堆栈访存

堆栈寻址

操作数存放在堆栈中,隐含使用堆栈指针SP(Stack Pointer)作为操作数地址。

堆栈是存储器(或专用寄存器组)中一块特定的按“后进先出”原则管理的存储区,该存储区中被读/写单元的地址是用一个特定的寄存器给出的,该寄存器称为堆栈指针(SP)。

硬堆栈——采用寄存器实现

软堆栈——从主存中划出一片区域

软堆栈执行POP和PUSH操作会有访存的开销。

e7e33c1e3c72942bd7b9881c6c895337.png

知秋君
上一篇 2024-08-30 08:02
下一篇 2024-08-30 07:36

相关推荐