㈠ ARM指令集的ARM 指令列表
ADC 带进位的32位数加法 ADD 32位数相加 AND 32位数的逻辑与 B 在32M空间内的相对跳转指令 BEQ相等则跳转(Branch if EQual)BNE不相等则跳转(Branch if Not Equal)BGE大于或等于跳转(Branch if Greater than or Equa)BGT大于跳转(Branch if Greater Than)BIC 32位数的逻辑位清零 BKPT 断点指令 BL 带链接的相对跳转指令 BLE小于或等于跳转(Branch if Less than or Equal)BLEQ带链接等于跳转(Branch with Link if EQual)BLLT带链接小于跳转(Branch with Link if Less Than)BLT小于跳转(Branch if Less Than)BLX 带链接的切换跳转橘盯 BX 切换跳转 CDP CDP2 协处理器数据处理操作 CLZ 零计数 CMN 比较两个数的相反数 CMP 32位数比较 EOR 32位逻辑异或 LDC LDC2 从协处理器取一个或多个32位值 LDM 从内存送多个32位字到ARM寄存器 LDR 从虚拟地址取一个单个的32位值 MCR MCR2 MCRR 从寄存器送数据到协处理器 MLA 32位乘累加 MOV 传送一个32位数到寄存器 MRC MRC2 MRRC 从协处理器传送数据到寄存器 MRS 把状态寄存器的值送到通用寄存器 MSR 把通用寄存器的值传送到状态寄存器 MUL 32位乘 MVN 把一个32位数的逻辑“非”送到寄穗握存器 ORR 32位逻辑或 PLD 预装载提示指令 QADD 有符号32位饱和加 QDADD 有符号双32位饱和加 QSUB 有符号32位饱和减 QDSUB 有符号双32位饱和减 RSB 逆向32位减法 RSC 带进位的逆向32法减法 SBC 带进位的32位减法 SMLAxy 有符号乘累加(16位*16位)+32位=32位 SMLAL 64位有符号乘累加((32位*32位)+64位=64位) SMALxy 64位有符号乘累加((32位*32位)+64位=64位) SMLAWy 号乘累加((32位*16位)>>16位)+32位=32位 SMULL 64位有符号乘累加(32位*32位)=64位 SMULxy 有符号乘(16位*16位=32位) SMULWy 有符号乘(32位*16位>>16位=32位) STC STC2 从协处理器中把一个或多个32位值存到内存 STM 把多个32位的寄存器值存放到内存 STR 把寄存器的圆族和值存到一个内存的虚地址内间 SUB 32位减法 SWI 软中断 SWP 把一个字或者一个字节和一个寄存器值交换 TEQ 等值测试 TST 位测试 UMLAL 64位无符号乘累加((32位*32位)+64位=64位) UMULL 64位无符号乘累加(32位*32位)=64位
㈡ 004.ARM指令之LDR
LDR{条件} 目的寄存器 <存储器地址>
作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。
LDR指令的寻址方式比较灵活,实例如下:
LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读入寄存器R0,然晌尘后R1=R1+8。
LDR R0,[R1],#8 ;将存储器地址为R1的字数据读入寄存器R0,迅谨唯并将R1+8的值存入R1。
LDR R0,[R1,R2]! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将R1+R2的值存入R1。
LDR R0,[R1,LSL #3] ;将存储器地址为R1 8的字数据读入寄存器R0。
LDR R0,[R1,R2,LSL #2] ;将存储器地址为R1+R2 4的字数据读入寄存器R0。
LDR R0,[R1,,R2,LSL #2]! ;将存储器地址为R1+R2 4的字数据读入寄存器R0,并将R1+R2 4的值存入R1。
LDR R0,[R1],R2,LSL #2 ;将存储器地址为R1的字数据读入寄存器R0,并将R1+R2*4的值存入R1。
LDR R0,亩培Label ;Label为程序标号,Label必须是当前指令的-4~4KB范围内。
要注意的是
LDR Rd,[Rn],#0x04 ;这里Rd不允许是R15。
另外LDRB 的指令格式与LDR相似,只不过它是将存储器地址中的8位(1个字节)读到目的寄存器中。
LDRH的指令格式也与LDR相似,它是将内存中的16位(半字)读到目的寄存器中。
LDR R0,=0xff
这里的LDR不是arm指令,而是伪指令。这个时候与MOVE很相似,只不过MOV指令后的立即数是有限制的。这个立即数必须是0X00-0XFF范围内的数经过偶数次右移得到的数,所以MOV用起来比较麻烦,因为有些数不那么容易看出来是否合法。
LDR 是ARM中的指令,也是伪指令。
当用 LDR r, =imd // r 为寄存器, imd为立即数
LDR 是一条伪指令。编译器会根据 立即数的大小,决定用 ldr 指令或者是mov或mvn指令。
当imd能用mov或者mvn操作时,就将它翻译成一条mov或mvn指令。当imd大于mov或mvn能够操作的数时,编译器会将imd存在一个内存单元中,然后再用一条ldr指令加载这个内存单元的的值到寄存器中。
LDR r, label 和 LDR r, =label的区别:
LDR r, =label 会把label表示的值加载到寄存器中,而LDR r, label会把label当做地址,把label指向的地址中的值加载到寄存器中。
譬如 label的值是 0x8000, LDR r, =label会将 0x8000加载到寄存器中,而LDR r, label则会将内存0x8000处的值加载到寄存器中。