微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM汇编编程基础之六-其它寻址模式与其它指令

ARM汇编编程基础之六-其它寻址模式与其它指令

时间:11-27 来源:互联网 点击:

再也不会为你应该使用ia、ib、da还是db来实现出、入栈操作而苦恼了。

STMED、STMEA、STMFD、STMFA和LDMED、LDMEA、LDMFD、LDMFA就是所谓的堆栈寻址指令。由此可见:为了对程序员体贴入微,ARM指令集的设计者设计了堆栈寻址指令,其实质就是多寄存寻址指令的快捷方式。

4、寄存器移位寻址

寄存器移位寻址是ARM指令集特有的寻址方式。当第2个操作数是寄存器移位方式时,第2个寄存器操作数在与第1个操作数结合之前,选择进行移位操作。例如:

MOV R0,R2,LSL #3 表示将R2的值逻辑左移3位,结果放入R0,即是R0=R2×8。

移位的方式有以下几种:

LSL(logic shift left):逻辑左移

LSR(logic shift right):逻辑右移

ASR(arithmetic shift right):算术右移

ROR(rotate shift right):循环右移

RRX(rotate shift right with extend):带扩展的循环右移。其中的C指的是CPSR的C位

5、相对寻址

相对寻址是基址寻址的一种变通。由程序计数器PC提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。例如:

BLOOP
...
LOOPMOVR6,#1

该条B指令的意思是要跳转到标号LOOP所代表的指令处,其含义相当明显,但你要明白CPU根本不明白标号是个什么东西(事实上在指令的机器码中根本就没有标号这种东西),那么b loop这条指令的机器码会是什么呢?答案是:高8bit是操作码相关内容,低24bit是一个常数,表示从b指令到mov指令之间的内存地址的差值(如果不考虑流水线的影响的话)。由此可见,b loop这条指令相当于add pc, pc, #偏移量常数,典型的相对于PC(当前指令地址)的相对寻址。由于是相对于当前指令地址进行相对寻址,所以无论程序最终运行在内存的何处(即使运行的地址不是它预期的位置),这条B指令都能正确运行。关于相对寻址、程序期望的运行地址等等,我将在“ARM汇编伪指令”一文中详细描述。

随便说一下,前面学到b指令的跳转范围是当前指令的先后32M,为什么是这个范围呢?因为24bit常数用1个比特区别正负,还剩23bit,同时由于ARM指令在内存中的地址其最低2bit一定是0(为什么?请自行思考一下),因此23bit中可以不必表示这2个0,所以23bit可以表示的范围是0 ---- 2^25,即:0 ---- 32M。

我们在“基本寻址模式与基本指令”一文中学习了最常用的指令。下面介绍其它较为常用的指令。

1、访存指令

LDRH(半字加载);LDRSH (有符号半字加载);STRH(半字存储)

交换指令

助记符

说明

操作

SWP Rd,Rm,[Rn]

寄存器和存储器字数据交换

Rd←[Rn],[Rn]←Rm (Rn≠Rd或Rm)

SWPB Rd,Rm,[Rn]

寄存器和存储器字节数据交换

Rd←[Rn],[Rn]←Rm (Rn≠Rd或Rm)

2、数据处理指令

助记符

说明

操作

MVN Rd,operand2

数据非传送

Rd←(~operand2)

助记符

说明

操作

RSB Rd, Rn, operand2

逆向减法指令

Rd←operand2-Rn

ADC Rd, Rn, operand2

带进位加法

Rd←Rn+operand2+Carry

SBC Rd, Rn, operand2

带进位减法指令

Rd←Rn-operand2-(NOT)Carry

RSC Rd, Rn, operand2

带进位逆向减法指令

Rd←operand2-Rn-(NOT)Carry

这里要特别提到,ADC指令结合CPSR,可以实现64位整数加法,详情参见“杂项解释”一文

助记符

说明

操作

BIC Rd, Rn, operand2

按位清除指令

Rd←Rn & (~operand2)

其实现功能是:将Rn中对应于operand2中为1的bit位全部清0,然后将结果保存到Rd中

助记符

说明

操作

CMN Rn, operand2

负数比较指令

标志N、Z、C、V←Rn+operand2

TST Rn, operand2

位测试指令

标志N、Z、C←Rn & operand2

TEQ Rn, operand2

相等测试指令

标志N、Z、C←Rn ^ operand2

TST指令测试的是:Rn中所有指定bit位是否全为0(指定的bit位是operand2中为1的所有位);

TEQ指令测试的是:Rn和operand2是否相等。这点上与CMP指令一样,区别在于CMP指令除了可以比较2个数是否相等外,也可以比较2个数谁大谁小,但TEQ不行。

3、乘法指令

助记符

说明

操作

MUL Rd,Rm,Rs

32位乘法指令

Rd←Rm*Rs (Rd≠Rm)

MLA Rd,Rm,Rs,Rn

32位乘加指令

Rd←Rm*Rs+Rn (Rd≠Rm)

UMULL RdLo,RdHi,Rm,Rs

64位无符号乘法指令

(RdLo,RdHi) ←Rm*Rs

UMLAL RdLo,RdHi,Rm,Rs

64位无符号乘加指令

(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)

SMULL RdLo,RdHi,Rm,Rs

64位有符号乘法指令

(RdLo,RdHi) ←Rm*Rs

SMLAL RdLo,RdHi,Rm,Rs

64位有符号乘加指令

(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)

4、协处理器指令

参见“MMU与内存保护的实现”一文

5、杂项指令

SWI:软中断指令

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top