ARM汇编基础指令集
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
ARM汇编基础指令集
一、Cortex-A 的内核寄存器组
二、赋值指令 MOV、LDR
1、MOV
MOV
目标寄存器,
立即数
MOV R0,#1 ;为寄存器R0赋值值为1
2、LDR
LDR
目标寄存器, =
赋值数
LDR R0,=0xAB00CD ;为寄存器R0赋值值为0xAB00CD
三、算数指令 ADD、SUB、MUL
注意:运算符只能为 A+B两个参数A+B+…超过两个是不允许的
1、ADD加法
ADD
目标寄存器,
寄存器1,
寄存器2也可以是立即数
ADD R0,R0,R1 ;*R0 = *R0 + *R1
ADD R0,R0,#10 ;*R0 = *R0 + 10
2、SUB减法
SUB
目标寄存器,
寄存器1,
寄存器2也可以是立即数
SUB R0,R0,R1 ;*R0 = *R0 - R1
SUB R0,R0,#10 ;*R0 = *R0 - 10
3、MUL乘法
MUL
目标寄存器,
寄存器1,
寄存器2也可以是立即数
MUL R0,R0,R1 ;*R0 = *R0 * R1
MUL R0,R0,#10 ;*R0 = *R0 * 10
四、移位指令 LSL、LSR
1、LSL左移位
MOV
目标寄存器,
寄存器1, LSL
立即数
MOV R0,R1,LSL #4 ;*R0 = *R1 << 4
2、LSR右移位
MOV
目标寄存器,
寄存器1, LSR
立即数
MOV R0,R1,LSR #4 ;*R0 = *R1 >> 4
五、逻辑位指令 AND、ORR、MVN、EOR
1、AND与
AND
目标寄存器,
寄存器1,
寄存器2也可以是立即数
AND R0,R0,R1 ;*R0 = *R0 & *R1
AND R0,R0,#0X0F ;*R0 = *R0 & 0X0F
2、ORR或
ORR
目标寄存器,
寄存器1,
寄存器2也可以是立即数
ORR R0,R0,R1 ;*R0 = *R0 | *R1
ORR R0,R0,#0X0F ;*R0 = *R0 | 0X0F
3、MVN非
将 操作2 取反的值给目标寄存器
MVN
目标寄存器,
寄存器2也可以是立即数
MVN R0,R1 ;*R0 = ~*R1
MVN R0,#0X0F ;*R0 = ~0X0F
4、EOR异或
EOR
目标寄存器,
寄存器1,
寄存器2也可以是立即数
EOR R0,R0,R1 ;*R0 = *R0 ^ *R1
EOR R0,R0,#0X0F ;*R0 = *R0 ^ 0X0F
六、跳转指令 B、BL
1、B直接跳转
B
跳转地址可以是标签因为标签就是地址
MOV R0,#100 ;*R0 = 100
B set_R1 ;goto set_R1 该操作也可以使用 LDR PC,=set_R1 理论是一样的
ADD R2,R0,R1 ;*R2 = *R0 + *R1 这里将不会执行因为跳转到set_R1无法再回到当前位置
set_R1:
MOV R1,#200
2、BL暂存当前位置后直接跳转
BL与B的不同之处就是在跳转(给PC赋值)之前先保存了当前的程序运行位置的地址保存在了寄存器LR中
B L
跳转地址可以是标签因为标签就是地址
MOV R0,#100 ;*R0 = 100
BL set_R1 ;goto set_R1 该操作也可以使用: MOV LR,PC SUB LR,LR,#4 LDR PC,=set_R1 理论是一样的
ADD R2,R0,R1 ;*R2 = *R0 + *R1 这里将不会执行因为跳转到set_R1无法再回到当前位置
set_R1:
MOV R1,#200
MOV PC,LR
B指令和BL指令在跳转存放的不是一个绝对地址而存放的是一个相对地址相对于我当前地址偏移的一个距离存放的是一个偏移量。
七、比较指令 CMPEN、EQ、GT、LT、GE、LE
CMP
比较寄存器1比较寄存器2也可以是立即数
基础指令+模式基础指令相关参数…
EN 》》不等于
EQ 》》等于
GT 》》大于
LT 》》小于
GE 》》大于等于
LE 》》小于等于
在R0 = 10,R1 = 20的情况下
允许赋值指令
CMP R0,R1
MOVEN ,R2,R1
if(*R0 == *R1) *R2 = *R1;
允许算数指令
CMP R0,R1
ADDEN ,R2,R0,R1
if(*R0 == *R1) *R2 = *R0 + *R1;
允许逻辑位指令
CMP R0,R1
EOREN R2,R0,R1
if(*R0 == *R1) *R2 = *R0 & *R1;
允许跳转指令
CMP R0,R1
BLEN fun
CMP R0,R1
BEN fun
if(*R0 == *R1) goto fun;
比较指令允许的指令不止这些还有很多
八、单个内存读写指令 LDR、STR
1、LDR 读取内存的地址
普通
LDR
目标寄存器[
读取地址]
基地址偏移LDR
目标寄存器[
读取地址纯偏移
]
基地址偏移+改变LDR
目标寄存器[
读取地址偏移并改变
]
普通+改变LDR
目标寄存器[
读取地址]
偏移并改变
2、STR 写入内存的地址
普通
STR
目标寄存器[
读取地址]
基地址偏移STR
目标寄存器[
读取地址纯偏移
]
基地址偏移+改变STR
目标寄存器[
读取地址偏移并改变
]
普通+改变STR
目标寄存器[
读取地址]
偏移并改变
LDR
目标寄存器 [
读取地址]
九、多个内存读写指令 STM、LDM
模式
IA 先读写后增加地址
IB 先增加地址后读写
DA 先读写后减少地址
DB 先减少地址后读写
指令+模式 基地址值(必须是寄存器){写入值} ;基地址(寄存器) 的地址不会发生改变
指令+模式 基地址值(必须是寄存器)!,{写入值} ;基地址(寄存器) 的地址会发生改变
1、STM
LDM 在基地址的基础上将数据写入偏移数据
设R0 = 0x100,R1 = 1,R2 = 2,R3 = 3;
以R0内存中的数值为基地址将数据写入对应的 基地址/基地址偏移 内存中
IA 先读写后增加地址
STMIA R0,{R1-R3} ;先写入后偏移(向高)但R0内存中的值还是0X100
STMIA R0,{R1,R2,R3} ;编译器会将其转换成STMIA R0,{R1-R3}
STMIA R0,{R3,R2,R1} ;编译器会将其转换成STMIA R0,{R1-R3}
STMIA R0!,{R1-R3} ;先写入后偏移(向高)但最终R0内存中的值也会偏移变为0X110
IB 先增加地址后读写
STMIB R0,{R1-R3} ;先偏移后写入(向高)但R0内存中的值还是0X100
STMIB R0,{R1,R2,R3} ;编译器会将其转换成STMIB R0,{R1-R3}
STMIB R0,{R3,R2,R1} ;编译器会将其转换成STMIB R0,{R1-R3}
STMIB R0!,{R1-R3} ;先偏移后写入(向高)但最终R0内存中的值也会偏移变为0X110
DA 先读写后减少地址
STMDA R0,{R1-R3} ;先写入后偏移(向低)但R0内存中的值还是0X100
STMDA R0,{R1,R2,R3} ;编译器会将其转换成STMDA R0,{R1-R3}
STMDA R0,{R3,R2,R1} ;编译器会将其转换成STMDA R0,{R1-R3}
STMDA R0!,{R1-R3} ;先写入后偏移(向低)但最终R0内存中的值也会偏移变为0X0F4
DB 先减少地址后读写
STMDB R0,{R1-R3} ;先偏移后写入(向低)但R0内存中的值还是0X100
STMDB R0,{R1,R2,R3} ;编译器会将其转换成STMDB R0,{R1-R3}
STMDB R0,{R3,R2,R1} ;编译器会将其转换成STMDB R0,{R1-R3}
STMDB R0!,{R1-R3} ;先偏移后写入(向低)但最终R0内存中的值也会偏移变为0X0F4
2、LDM
LDM 读取基地址内存中的数据存放到其它地址中
下面只举例 模式IA
设一个R0 = 0X100R1 = 0,R2 = 0;R1的地址为0X200,R2的地址为0X300
LDMIA R0,{R1,R2}
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |