已解决
常用ARM汇编
来自网友在路上 166866提问 提问时间:2023-11-12 22:38:45阅读次数: 66
最佳答案 问答题库668位专家为你答疑解惑
1. 数据处理指令:
ADD
,SUB
,MUL
: 算术操作(加、减、乘)。AND
,ORR
,EOR
,BIC
: 逻辑操作(与、或、异或、位清除)。MOV
,MVN
: 寄存器传送和取反。CMP
,CMN
,TST
,TEQ
: 比较操作。
示列:
算术操作:
ADD Rn, Rm, Operand2
: 将 Rm 和 Operand2 的值相加,并存入寄存器 Rn。SUB Rn, Rm, Operand2
: 从 Rm 减去 Operand2 的值,并将结果存储在 Rn。MUL Rn, Rm, Rs
: Rm 乘以 Rs,并将结果存储在 Rn。
逻辑操作:
AND
:AND R0, R1, R2
- R0 = R1 AND R2。将R1和R2的按位与结果存储到R0。ORR
:ORR R0, R1, R2
- R0 = R1 OR R2。将R1和R2的按位或结果存储到R0。EOR
:EOR R0, R1, R2
- R0 = R1 XOR R2。将R1和R2的按位异或结果存储到R0。BIC
:BIC R0, R1, R2
- R0 = R1 AND NOT R2。将R1和R2的按位清零结果存储到R0。
寄存器传送和取反:
MOV
:MOV Rn, Operand2
: 把 Operand2 的值移动到寄存器 Rn 中。MVN
:MVN Rn, Operand2
: 把 Operand2 的值取反后移动到寄存器 Rn 中。
比较操作:
CMP
:CMP R0, R1
- 比较R0和R1。将R0和R1的值进行比较,但不存储结果,只更新状态寄存器。CMN
:CMN R0, R1
- 比较R0和-R1。将R0和R1的负值进行比较,但不存储结果。TST
:TST R0, R1
- 测试R0和R1的按位与。进行按位与操作但不存储结果,只更新状态寄存器。TEQ
:TEQ R0, R1
- 测试R0和R1的按位异或。进行按位异或操作但不存储结果。CMP
:CMP Rn, Operand2
: 比较 Rn 和 Operand2 的值。
2. 分支和跳转指令:
B
,BL
: 无条件跳转和跳转并链接。BX
,BLX
: 切换到 ARM 或 Thumb 模式并跳转。B.cond
: 条件分支,其中 “cond” 是条件代码(例如BEQ
为等于分支)。
示列:
B
:B label
: 无条件跳转到标签label
。BL
:BL label
: 跳转到label
并在链接寄存器 (LR) 中保存返回地址。BX
:BX Rn
: 跳转到寄存器 Rn 中的地址。
BEQ, BNE, BGT, BLT, BGE, BLE`: 有条件的跳转。
-
BEQ
:BEQ label
- 如果上一个指令的结果是相等(Zero标志被设置),则跳转到标签label
。例如,如果之前的CMP
指令比较的两个寄存器值相等,则执行跳转。 -
BNE
:BNE label
- 如果上一个指令的结果不等(Zero标志未被设置),则跳转到标签label
。例如,如果之前的CMP
指令比较的两个寄存器值不相等,则执行跳转。 -
BGT
:BGT label
- 如果上一个指令的结果大于(Zero标志未设置且Negative标志等于Overflow标志),则跳转到标签label
。通常在比较指令之后使用,比如CMP
。 -
BLT
:BLT label
- 如果上一个指令的结果小于(Negative标志不等于Overflow标志),则跳转到标签label
。用于实现小于条件的分支。 -
BGE
:BGE label
- 如果上一个指令的结果大于等于(Negative标志等于Overflow标志),则跳转到标签label
。这通常用于循环或条件检查。 -
BLE
:BLE label
- 如果上一个指令的结果小于等于(Zero标志被设置或Negative标志不等于Overflow标志),则跳转到标签label
。用于实现小于或等于的条件跳转。
3. 内存访问指令:
LDR
,STR
: 加载和存储。LDM
,STM
: 多重加载和存储,用于从/到连续的寄存器组读/写数据。PUSH
,POP
: 压入和弹出堆栈。
示列:
加载和存储:
LDR Rn, [Rm, #offset]
: 从内存地址 (Rm + offset) 加载值到 Rn。STR Rn, [Rm, #offset]
: 将 Rn 的值存储到内存地址 (Rm + offset)。
多重加载和存储:
LDM
:LDM R0!, {R1-R3}
- 从R0指向的地址加载多个寄存器(R1到R3),R0的值自动增加。STM
:STM R0!, {R1-R3}
- 将多个寄存器(R1到R3)的数据存储到R0指向的地址,R0的值自动增加。
压栈和出栈:
PUSH
:PUSH {R0-R3}
- 将寄存器R0到R3的值压入堆栈。POP
:POP {R0-R3}
- 从堆栈中弹出数据到寄存器R0到R3。
4. 异常和中断处理指令:
SVC
: 软件中断。CPS
: 更改处理器状态。
示列:
SVC
:SVC #0
- 软件中断指令,通常用于调用操作系统服务。CPS
:CPS ID
- 更改程序状态,如中断使能/禁用。
5. 系统指令:
MRS
,MSR
: 从/到特殊寄存器读/写。ISB
,DSB
,DMB
: 同步屏障。
示列:
特殊寄存器读/写:
MRS R0, CPSR
会将当前程序状态寄存器 (CPSR) 的值移动到 R0 寄存器。
MSR CPSR_c, R0
将 R0 寄存器的值复制到 CPSR 的控制字段。
特殊屏障:
ISB
:ISB
- 指令同步障碍,确保之前的所有指令完成。DSB
:DSB
- 数据同步障碍,确保之前的所有存储操作完成。DMB
:DMB
- 数据存储障碍,确保之前的所有存储操作对其他处理器可见。
6. 协处理器指令:
MCR
,MRC
: 从协处理器移动数据。
示列:
从协处理器移动数据:
MCR
:MCR p15, 0, R0, c7, c10, 5
- 将寄存器R0的值移动到协处理器寄存器。MRC
:MRC p15, 0, R0, c7, c10, 5
- 从协处理器寄存器移动值到寄存器R0。
7.条件执行码:
EQ
: 等于NE
: 不等于CS
或HS
: 大于等于,无符号CC
或LO
: 小于,无符号MI
: 负数PL
: 非负
查看全文
99%的人还看了
相似问题
- 寄存器、缓存、内存之间的关系和区别
- 北邮22级信通院数电:Verilog-FPGA(10)第十周实验 实现移位寄存器74LS595
- PCIe寄存器之二
- 嵌入式养成计划-51----ARM--ARM汇编指令--内存读写指令--程序状态寄存器传输指令--软中断指令--混合编程
- 野火霸天虎 STM32F407 学习笔记_3 尝试寄存器映射方式点亮 LED 灯
- verilog——移位寄存器
- ARMday03(寄存器读写、栈、程序状态寄存器、软中断和异常、混合编程)
- 【单片机基础小知识-如何通过指针来读写寄存器】
- verilog 每日一练- 移位寄存器
- 汇编的各种指令(数据搬移、移位、位运算、算数、比较、跳转、特殊功能寄存器、单寄存器、多寄存器、栈指针指令)
猜你感兴趣
版权申明
本文"常用ARM汇编":http://eshow365.cn/6-38464-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!