就这几条混个面熟就行
- 读内存指令:LDR,即Load之意
- 写内存指令:STR,即Store之意
- 加减指令:ADD、SUB
- 跳转:BL,即Branch And Link
- 入栈指令:PUSH
- 出栈指令:POP
此处是学习韦老师的视频整理的,视频中也有讲解这6个指令,参考链接:https://www.bilibili.com/video/BV17U4y1K7EL/?p=4
- 读内存指令:LDR(Load)
- 用途:从内存加载数据到寄存器。
- 语法:LDR Rd, [Rn, #offset]
- Rd:目标寄存器
- Rn:基址寄存器
- #offset:偏移量(可选)
asm
LDR R0, [R1, #4] ; 将内存地址R1+4处的数据加载到寄存器R0
- 写内存指令:STR(Store)
- 用途:将寄存器中的数据存储到内存。
- 语法:STR Rd, [Rn, #offset]
- Rd:源寄存器
- Rn:基址寄存器
- #offset:偏移量(可选)
asm
STR R0, [R1, #4] ; 将寄存器R0中的数据存储到内存地址R1+4处
- 加减指令:ADD(加)、SUB(减)
- 用途:执行加法和减法运算。
- 加法语法:ADD Rd, Rn, Rm
- Rd:目标寄存器
- Rn:第一个操作数寄存器
- Rm:第二个操作数寄存器
asmm
ADD R0, R1, R2 ; 将寄存器R1和R2的值相加,并存储到R0
- 减法语法:SUB Rd, Rn, Rm
- Rd:目标寄存器
- Rn:第一个操作数寄存器
- Rm:第二个操作数寄存器
asm
SUB R0, R1, R2 ; 将寄存器R1减去R2的值,并存储到R0
- 跳转指令:BL(Branch and Link)
- 用途:跳转到一个子程序,同时保存返回地址到链接寄存器(LR)。
- 语法:BL label
- label:目标地址的标签
asm
BL subroutine ; 跳转到subroutine子程序,并保存返回地址到LR
- 入栈指令:PUSH
- 用途:将寄存器内容压入堆栈。
- 语法:PUSH {registers}
- {registers}:要压入堆栈的寄存器列表
asm
PUSH {R0, R1} ; 将寄存器R0和R1的内容压入堆栈
- 出栈指令:POP
- 用途:从堆栈弹出数据到寄存器。
- 语法:POP {registers}
- {registers}:要从堆栈弹出的寄存器列表
asm
POP {R0, R1} ; 从堆栈弹出数据到寄存器R0和R1
ARM汇编示例以下是一个ARM汇编代码示例,演示如何使用这些指令:
asm
.global _start
_start:
LDR R0, =data ; 将data地址加载到R0
LDR R1, [R0] ; 从内存加载data内容到R1
ADD R1, R1, #10 ; 将R1的值加10
STR R1, [R0] ; 将R1的值存回内存data地址
BL subroutine ; 跳转到subroutine子程序
subroutine:
PUSH {LR} ; 将链接寄存器压入堆栈
SUB R0, R0, #5 ; 将R0的值减5
POP {LR} ; 从堆栈弹出返回地址到LR
BX LR ; 返回主程序
.data
data: .word 0x12345678 ; 定义一个32位数据
这个示例代码从内存读取一个数据,加上一个常数,然后存回内存。之后调用一个子程序,该子程序修改寄存器值并返回主程序。