本文将我遇到的ARM汇编指令用法及其用例记录,边用边学,也能当做自己的手册使用。可能稍显粗糙,待后续更新调整。
一条ARM指令长度为32bits
LDR(load) :读内存
LDR R0,[R1] //将R1地址的数据读取存储到R0
LDR R0,=0x12345678 //伪指令,为被拆分为几条真正的ARM指令(因为每一条指令都是固定长度)
LDM(load many):读内存,写入多个寄存器
//与IA、IB、DB、DA后缀使用
//IA:increase after DB:decrease before
//IB:increase before DA:decrease after
//一般多与DB连用居多,用来做寄存器入栈保存
STMDB sp!, {fp, ip, lr, pc} //此处SP做decrease操作实际上是对sp的tmp操作
//对SP寄存器没有做写操作,加上!表示最后的tmp赋值到sp
STR(store):写内存
STR R0,[R1] //将R0值存储到R1地址内存(4Bytes)
STM(store many):把多个寄存器的值写入内存中
//后缀详见STRM指令处
//一般多与IA连用居多,用来做寄存器出栈恢复
LDMIA sp, {fp, sp, pc} //此处sp后未加!,则sp的值为栈中值赋值给{}中的sp完成赋值
STREQ:相等则写内存(用法和STR一样)
//一般与CMP等比较指令连用,判断程序状态寄存器(R15/PC)中的Z bit,为1即相等则执行
STREQ R0,=1234
B:跳转
B main
BL:跳转,并把返回地址保存到LR寄存器中
BL main
MOV :赋值
MOV R0,R1 //把R1的值赋值给R0
MOV R0,#0x10 //把立即数0x10赋值给R0
MOVEQ:相等则赋值
//一般与CMP等比较指令连用,判断程序状态寄存器(R15/PC)中的Z bit,为1即相等则执行
MOVEQ R0,#10
BIC:位清零
//最后一个操作数的某位上为1,则第二个操作数对应位清0,最终结果赋值给第一个操作数
bic r3, r3, #16128 //0x3f00
CMP:比较指令
//将两个寄存器值做差(R1-R2),同时影响程序状态寄存器(R15/PC)中的状态位
CMP R1,R2
ADD:加法指令
add r0,r1,#4 //r0 =r1 + 4
add r0,r1,r2 //r0 =r1 + r2
SUB:减法指令
sub r0,r1,#4 //r0 =r1 - 4
sub r0,r1,r2 //r0 =r1 - r2
MVN:按位取反后赋值
MVN R0,R1
MVN R0, #4 //R0 = -5
MVN R0, #0 //R0 = -1
ARM汇编程序格式:
.text
.global _start
_start:
halt:
b halt