跳转指令
| 指令 |
简介 |
| B |
无条件跳转 |
| BL |
带链接的无条件跳转 |
| BX |
带状态跳转,更改指令集 |
| BLX |
带链接和状态切换的无条件跳转,更改指令集 |
| BXJ |
跳转,更改为 Jazelle |
| TBB , TBH |
表跳转字节、半字 |
存储器和寄存器交互数据指令(内存访问)
➡️ 代表从左到右
⬅️ 代表从右到左
| 指令 |
简介 |
| LDR |
从存储器中加载数据到寄存器 ⬅️ |
| LDR R8,[R9,#04] |
R8为待加载数据的寄存器,加载值为 R9+0x4指向的存储单元 |
| STR |
将寄存器的数据存储到存储器 ➡️ Store |
| STR R8,[R9,#04] |
将R8寄存器的数据 存到 R9+0x4指向的存储单元 ➡️ |
| LDM |
将存储器的数据加载到一个存储器列表 ➡️ |
| LDM R0,{R1-R3} |
将R0指向的储存单元的数据依次加载到R1,R2,R3寄存器 ➡️ |
| STM |
将一个寄存器列表的数据 存储到指定的存储器 ⬅️ |
| PUSH |
将寄存器值推入堆栈 |
| POP |
将堆栈值推出到寄存器 |
| SWP |
将寄存器与存储器之间的数据进行交换 |
| SWP R1,R1 [R0] |
将R1寄存器与R0指向的存储单元的内容进行交换 |
| PLD |
预载数据 |
| PLI |
预载指令 |
| RFE |
从异常中返回 |
| SRS |
存储返回状态 |
| LDREX 和 STREX |
独占加载和存储寄存器。 |
| CLREX |
独占清零,清除执行处理器的局部记录:有地址请求进行独占访问 |
数据传送指令
| 指令 |
简介 |
| MOV |
将立即数或寄存器的数据传送到目标寄存器 ⬅️ |
| MOV R1,R0 |
将寄存器R0的值传送到寄存器R1 |
| MOV PC,R14 |
将寄存器R14的值传送到PC,常用于子程序返回 |
| MOV R1,R0,LSL#3 |
将寄存器R0的值左移3位后传送到R1(即乘8) |
| MOVS PC, R14 |
将寄存器R14的值传送到PC中,返回到调用代码并恢复标志位 |
| MVN R0,#0 |
将立即数0取反传送到寄存器R0中,完成后R0=-1(有符号位取反) |
数据算术运算指令
| 指令 |
简介 ⬅️ |
| ADD |
加 ️ |
| SUB |
减️ |
| MUL |
乘 |
| DIV |
除 |
| ADC |
带进位的加法指令 |
| SBC |
带借位减法指令 |
| AND |
逻辑“与” |
| ASR |
算术右移 |
| RSB |
反向减法 |
| SBC |
带进位减法 |
| RSC |
带进位反向减法(仅 ARM) |
| SDIV |
有符号除法 |
| UDIV |
无符号除法 |
| QADD |
有符号加法 |
| QSUB |
有符号减法 |
| QDADD |
加倍加法 |
| QDSUB |
加倍减法 |
| SSAT |
将有符号值饱和到有符号范围内 |
| USAT |
可将有符号值饱和到无符号范围内 |
数据逻辑运算指令
| 指令 |
简介 |
| AND |
与 |
| ORR |
或️ |
| EOR |
异或️ |
| 移位 |
因为是2进制,逻辑移位左移变大,右移变小,且按2的倍数进行 |
| LSL |
逻辑左移 ⬅️ |
| LSR |
逻辑右移 ⬅️ |
| ROR |
将 Rm 中的值向右循环移 |
| RRX |
可提供经右移一位后的寄存器中的值 |
比较指令
| 指令 |
简介 |
| CMP |
直接比较 |
| CMP R0 #0 |
R0寄存器中的值和0比较 |
| CMN |
负数比较指令 |
| CMN R1,R0 |
将寄存器R1的值与寄存器R0的值相加,并根据结果设置CPSR的标志位 |
| CMN R1,#100 |
将寄存器R1的值与立即数100相加,并根据结果设置CPSR的标志位 |
| CBZ |
比较,为零则跳转 |
| CBNZ |
比较,为非零则跳转 |
组合和分离指令
| 指令 |
简介 |
| BFC 和 BFI |
位域清零和位域插入 |
| SBFX 和 UBFX |
有符号或无符号位域提取 |
| SXT、SXTA、UXT 和 UXTA |
符号扩展或零扩展指令,可选择进行加法运算 |
| PKHBT 和 PKHTB |
半字组合指令 |
并行指令
| 指令 |
简介 |
| USAD8 |
差值的绝对值无符号求和 |
| USADA8 |
差值的绝对值无符号求和再累加 |
| SSAT16 |
可将有符号值饱和到有符号范围内 |
| USAT16 |
可将有符号值饱和到无符号范围内 |
| SXT、SXTA UXT 和 UXTA |
号扩展,符号扩展加,零扩展和零扩展加 |
测试指令
| 指令 |
简介 |
| TST |
位测试指令 |
| TST R1,#%1 |
用于测试在寄存器R1中是否设置了最低位(%表示二进制数) |
| TST R1,#0xffe |
将寄存器R1的值与立即数0xffe按位与,并根据结果设置CPSR的标志位 |
| TST R0, #0x8 |
测试bit_3是否为0 |
| TEQ |
位测试指令 |
| TEQ R1,R2 |
将寄存器R1的值与寄存器R2的值按位异或,并根据结果设置CPSR的标志位 |
ThumbEE指令
| 指令 |
简介 |
| ENTERX, LEAVEX |
将状态更改为 ThumbEE 或更改状态 ThumbEE |
| CHKA |
(检查数组)可比较两个寄存器中的无符号值 |
| HB、HBL、HBLP 、HBP |
处理程序跳转,跳转到指定处理程序 |
| SEL |
根据 APSR GE 标记的状态,从每个操作数中选择字节 |
| REV、REV16、REVSH 和 RBIT |
在字或半字内反转字节或位的顺序 |
协处理器指令
| 指令 |
简介 |
| CDP |
协处理器数据处理操作 |
| CDP2 |
协处理器数据处理操作 |
| MCR、MCR2、MCRR 和 MCRR2 |
从寄存器移动到协处理器 |
| LDC、LDC2、STC、STC2 |
在内存和协处理器之间传送数据,加载协处理器 |
| 指令 |
简介 |
| ADRL |
将相对于程序或相对于寄存器的地址载入寄存器中(中等范围,与位置无关) |
| MOV32 |
将 32 位常数或地址载入寄存器(无范围限制,但与位置相关) |
| LDR |
将 32 位常数或地址载入寄存器(无范围限制,但与位置相关) |
| UND |
生成无体系结构定义的指令。可用于所有 ARM 体系结构 |
无线 MMX 技术伪指令
| 指令 |
简介 |
例子 |
| TMCR |
将源寄存器 Rn 的内容移到控制寄存器 wCn 中 |
TMCR wc1, r10 |
| TMCRR |
将两个源寄存器 RnLo 和 RnHi 的内容移到目标寄存器 wRd |
TMCRR wr4, r5, r6 |
| TMRC |
将控制寄存器 wCn 的内容移到目标寄存器 Rd。不要将 r15 用于 Rd。 |
TMRC r1, wc2 |
| TMRRC |
将源寄存器 wRn 的内容移到两个目标寄存器 RdLo 和 RdHi。 |
TMRRC r1, r0, wr2 |
| WMOV |
将源寄存器 wRn 的内容移到目标寄存器 wRd。 |
WMOV wr1, wr8 |
| WZERO |
清零目标寄存器 wRd。 |
WZERO wr1 |
其他指令
| 指令 |
简介 |
| CPS |
更改处理器状态 |
| CPY |
复制 |
| DBG |
调试 |
| SWT |
协处理器指令,切换用户模式 |
| DCB |
伪指令:分配一片连续的字节存储单元并用指定的数据初始化 |
| BIC |
位清零指令 |
| BIC R0,R0,#%1011 |
该指令清除 R0 中的位 0、1、和 3,其余的位保持不变 |
| BKPT |
断点,当指令到达某个特定地址处时,使用此指令来检查系统状态 |
| MRS |
将 PSR 的内容移到通用寄存器中,MRS{cond} Rd, psr |
| MSR |
将通用寄存器的立即数或内容加载程序状态寄存器 (PSR) 的指定位段中 |
| CPS |
更改处理器状态,只允许在特权模式下使用 |
| SMC |
安全监控调用 SMC{cond} #immed_16 |
| SETEND |
设置 CPSR 中的端序位,不影响 CPSR 中的其他位 |
| NOP |
进行填充来使当前位置与指定的边界对齐 |
| SEV |
设置事件 |
| WFE|WFI|YIELD |
等待事件,等待中断,通知 |
| WFI |
WFI 会暂时将执行中断挂起,直至发生IRQ后 |
| YIELD |
YIELD 可告知硬件有线程正在执行任务,例如可换出的自旋锁 |
| DBG |
调试提示可向调试系统及其相关系统发送提示 |
| DMB |
数据内存屏障可作为内存屏障使用。 |
| DSB |
数据同步屏障是一种特殊类型的内存屏障 |
| ISB |
指令同步屏障 |
| MAR |
MAR 指令可将 RdLo 中的值复制到 Acc 的位 [31:0] 中,还会将 RdHi 的最低有效字节复制到 Acc 的位 [39:32] 中。MAR{cond} Acc, RdLo, RdHi |
| MRA |
MRA{cond} RdLo, RdHi, Acc 可进行以下操作:将 Acc 的 [31:0] 位复制到 RdLo |
寄存器寻址方式
| 指令 |
简介 |
| 立即寻址 |
MOV R0,#1234 R0=0x1234 |
| 寄存器寻址 |
MOV R0,R1 R0=R1 |
| 寄存器移位寻址 |
MOV R0,R1,LSL #2 R0=R1*4 |
| 寄存器间接寻址 |
LDR R0,[R1] ;将R1寄存器中的值作为地址,取出值给R0 |
| 寄存器间接寻址偏移寻址 |
LDR R0,[R1,#-4] |
更多可参考 《ARM汇编指南》
文章来源: blog.csdn.net,作者:考古学家lx,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/weixin_43582101/article/details/108152800
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
评论(0)