第3章 ARM指令集第4课Word文档下载推荐.docx

上传人:b****1 文档编号:15347943 上传时间:2022-10-29 格式:DOCX 页数:16 大小:681.29KB
下载 相关 举报
第3章 ARM指令集第4课Word文档下载推荐.docx_第1页
第1页 / 共16页
第3章 ARM指令集第4课Word文档下载推荐.docx_第2页
第2页 / 共16页
第3章 ARM指令集第4课Word文档下载推荐.docx_第3页
第3页 / 共16页
第3章 ARM指令集第4课Word文档下载推荐.docx_第4页
第4页 / 共16页
第3章 ARM指令集第4课Word文档下载推荐.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

第3章 ARM指令集第4课Word文档下载推荐.docx

《第3章 ARM指令集第4课Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第3章 ARM指令集第4课Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。

第3章 ARM指令集第4课Word文档下载推荐.docx

1.ARM指令的格式

ARM指令字长为固定的32bit的二进制编码,大部分指令编码由第一操作数、第二操作数和目的操作数组成。

典型的ARM指令的基本格式如下:

说明:

·

“#”—表示立即数,可以是任意进制(默认是十进制);

“!

”—表示指令在完成操作后将最后的地址写回基址寄存器(以后);

“^”—通常用在批量数据存储指令中,当前面的寄存器不包含PC时该符号表示所用的寄存器是用户模式的寄存器,当前面的寄存器包含PC时该符号指示将SPSR的值复制到CPSR中(以后再阐述);

“-”—表示指令中多个连续的寄存器;

“0x”—表示十六进制数;

·

有些ARM指令可选择是否更新条件码标志(如ADDSR1,R2,R3),而有些指令只能这么做(如CMPR3,R5),后续指令可根据前面设置的条件标志条件执行。

2.ARM指令的分类

ARM指令集可以分为6个大类:

数据处理指令、跳转指令、状态寄存器指令、异常中断产生指令、Load/Store指令、协处理器指令,具体指令见下表所示(表中为基本指令,不包括派生指令):

派生指令多是由于“寻址方式”的多变而产生的,故很有必要对各类指令的寻址方式做详细的分析。

3.ARM指令的条件域

当处理器工作在ARM状态时,几乎所有的指令均可根据CPSR中条件码的状态和指令的条件域有条件地执行。

条件码共有16种,每个条件码用2个字符表示并添加在指令助记符的后面和指令同时使用(使用的时候只要记住助记符和其对应的含义便可,但理解条件标志位值的设置可以更加深入的帮助理解)。

对于表格前8行的理解见下表,后面8行中最难理解的是GE和LT,现在说明如下(上面表格所有关于大于、小于或等于的条目均针对于“减法”操作而言):

N=V对应于2种情况,即1.N=0且V=0;

2.N=1且V=1。

对于减法而言,考虑到操作数为带符号数,故每种情况又对应4种可能。

分析这4种可能会发现,凡是可能产生上述1或2的可能均对应A≥B;

同样方法可以说明N≠V的含义。

补充:

对C和V的解释

进位标志位(C:

carryflag)和溢出标志位(V:

overflowflag)对于汇编语言中的算术指令和逻辑指令是非常重要的两个标志位。

C和V都是溢出指示符,但这两个标志位的区别与程序所处理的数据类型有关。

与大多数高级语言不同,汇编语言程序不会显式地指明当前所处理数据的类型细节。

一些算术指令如ADD指令和SUB指令也不去管它们处理的操作数到底是有符号数还是无符号数,因为对它们来说不重要(运算的二进制结果是一样的)。

而其他一些指令,如MUL指令和DIV指令就有无符号数版本和有符号数版本两种——因为不同的数据类型对于乘法和除法来说会产生不同的二进制输出。

有符号数表示和无符号数表示总是与一个问题有关,这个问题就是溢出。

因为有符号整数要比同样长度的无符号整数少一位(因为这个特殊的位被用来存放符号),所以有符号数和无符号数的溢出触发条件是不一样的。

处理器并没有为算术指令提供独立的有符号和无符号两个版本,而是简单地通过用两个溢出标志位报告溢出就把问题合理地解决了:

这两个标志位一个用于有符号操作数(V),一个用于无符号操作数(C)。

加法或者减法运算可以用同一个版本的指令对有符号操作数和无符号操作数进行运算,并对两个标志位进行置位(如果C和V中某个或全部有效,则说明当把操作数看作某种类型的数据时有溢出发生),置位后的标志位留待接下来的指令处理。

举个例子,考虑下面的算术运算代码,看看它会对这两个溢出标志位产生什么样的影响:

上面的加法指令可能会产生不同的结果,具体的结果取决于是把目的操作数当作有符号数还是无符号数对待:

1.如果把ADD指令中最终的AX被当作一个无符号操作数,则用十六进制数表示的话,结果是0x8326,即十进制数的33574;

2.如果把ADD指令中最终的AX当作一个有符号操作数,则发生了溢出,因为任何最高位为1的有符号数是负数,所以0x8326就成了-31962了。

显然,因为一个16位的有符号数能表示的最大的数是32767,把4390与29184相加显然会产生溢出,于是AX中的数就变成了一个负数。

因此,上面的代码对无符号数来说没有溢出,但如果你把目的操作数看作是有符号数就溢出了。

二.ARM指令的寻址方式

1.寻址方式的定义

寻址方式指处理器(完成译码,获悉指令的功能后)根据指令中给出的地址信息来寻找某个/某些物理地址,从而取得操作数的方式。

2.ARM体系结构的寻址方式(红色标记为基本方式):

•立即数寻址—操作数本身就在指令中给出,只要取出指令也就得到了操作数,如ADDR0,R0,#0x10;

•寄存器寻址—将寄存器中保存的数值作为操作数,是一种执行效率较高的寻址方式,如MOVR0,R1;

•寄存器偏移寻址—将寄存器中保存的数值作为操作数,但第2寄存器中保存的操作数在和第1操作数结合之前可以进行移位操作,如MOVR0,R1,LSL#2(插入数据进入CPU的移动过程图解);

•寄存器间接寻址—将寄存器中的数值作为操作数在存储器中的地址,而操作数本身存放在存储器中,如LDRR0,[R1];

•基址变址寻址—是寄存器间接寻址的扩展,将寄存器中给出的操作数地址和指令中给出的地址偏移量相加作为操作数在存储器中的地址,常用于访问基地址附近的地址单元,如LDRR0,[R1,#8];

•相对寻址—以程序计数器PC作为基址寄存器的基址变址寻址,如

•多寄存器寻址--是寄存器间接寻址的另一种扩展,使用一条指令完成多个寄存器值的传送,如LDMIAR0,{R1,R2,R3,R4};

•堆栈寻址—是多寄存器寻址的变种,使用对象为堆栈,如LDMFDSP!

,{R1-R7,R9,LR}。

3.补充----3种基址变址寻址的区别

 

4.不同指令对应的寻址方式

三.各类指令详述

1.数据处理指令

1-1.语法功能

a.数据传送指令

功能:

将第2操作数表示的数据传送到目标寄存器中,并可能根据操作的结果更新CPSR中相应的条件标志位。

语法格式:

说明:

用途:

MVN

该指令可以完成如下功能:

1.向一个寄存器中传送一个负数;

2.求一个数的反码;

3.生成位掩码。

b.算术运算指令

b-1.ADD

将两个源操作数相加并将结果保存到目的寄存器中,可能根据操作结果更新CPSR中的相应条件标志位。

示例

b-2.ADC

将两个源操作数相加,再加上CPSR中的C条件标志位的值,把结果保存到目的寄存器中,可能根据操作的结果更新条件标志位。

ADDS和ADC联合使用可以实现大于32位的操作数的相加。

b-3.SUB

将两个源操作数相减,并将结果保存到目标寄存器中,可能根据操作结果更新标志位。

用途

b-4.SBC

实现两个操作数的相减,并减去CPSR中C条件标志位的反码,将结果保存到目的寄存器中。

SUBS和SBC联合使用可以实现大于32位的操作数的相减操作。

b-5.RSB和RSC

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1