ARM汇编编程基础之六-其它寻址模式与其它指令
再也不会为你应该使用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提供基准地址,指令中的地址码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。例如: 该条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:软中断指令
LOOP
ARM汇编编程寻址模 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)