第八课 (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。
为什么会引入伪指令?
对于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的值
举例2:ldmia sp, {fp,ip,pc}
先读后加