第八课 (3)汇编指令

①LDR (load register):读寄存器

举例:LDR R0,[R1]

假设R1的值是x,读取地址x上的数据(4字节),保存到R0中;

②STR (store register):写寄存器

举例:STR R0,[R1]

假设R1的值是x,把R0的值写到地址x(4字节);

③B 跳转

举例:
死循环
halt:
B hal

④MOV (move)移动,赋值

举例1:MOV R0,R1
把R1的值赋值给R0;

举例2:MOV R0,#0x100
把0x100赋值给R0,即R0=0x100;

⑤LDR的伪指令

举例:LDR R0,=0x12345678
这是一条伪指令,即实际中并不存在这个指令,他会被拆分成几个真正的ARM指令,实现一样的效果。
最后结果是R0=0x12345678。
为什么会引入伪指令?
第八课 (3)汇编指令
对于32位的指令,要有字节表示指令,要有字节表示数据,因此表示数据的不足32位,则不能表示32的任意值,引入伪指令后,利用LDR就可以为R0赋任意大小的值,编译器会自动差分成真正的指令。

⑥ADD/SUB 加法/减法

举例1:
add r0,r1,#4
效果为
r0=r1+4;

举例2:
sub r0,r1,#4
效果为
r0=r1-4;

举例3:
sub r0,r1,r2
效果为
r0=r1-r2;

⑦BL (Brarch and Link)带返回值的跳转

跳转到指定指令,并将返回地址(返回地址就是下一条指令的地址)保存在lr寄存器;

⑧LDM/STM (many) 读内存,写入多个寄存器 / 把多个寄存器的值写入内存

(LDR和STR只涉及一个寄存器)
可搭配的后缀有 过后增加(Increment After)、预先增加(Increment Before)、过后减少(Decrement After)、预先减少(Decrement Before);

举例1:
stmdb sp!, {fp,ip,lr,pc}
假设Sp=4096。
db意思是先减后存,按 高编号寄存器存在高地址 存。
意思就是{}内寄存器的名字,随意排列不影响
! 表示sp会存放最终被修改的sp的值,如果不加!则,sp保留原来4096的值
第八课 (3)汇编指令
举例2:
ldmia sp, {fp,ip,pc}
先读后加
第八课 (3)汇编指令