ARM实战番外篇2
使用的工具是ARM的ADS
ARM堆栈
1、 当堆栈指针指向最上头的一个地址时称为:满堆栈
2、 当堆栈指针指向最上头的一个地址的上个地址称为:空堆栈
3、 当堆栈指针从低地址向高地址压栈的时候称为:递增压栈
4、 当堆栈指针从高地址向低地址压栈的时候称为:递减压栈
5、 什么情况的时候需要使用的递增递减压栈?是寄存器和内存中读取的时候(LDR、STR)
ARM数据操作(AUL)
1、 数据操作分为:数学操作、逻辑操作、比较操作
数学操作
1) ADD R0,R0,#4 加法运算
2) ADDS R0,R0,#4 S带表标识位
3) ADDS R2,R0,R1 将R0+R1的值给R2
4) ADC Rd,Rn,Op2 C是进位标识符,整行意思Rn+Op2+C
5) MOV R1,R2 将R2的值传给R1
6) MVN R3,#4 将第5)中的R2-0x4传给R3
7) SUB R3,R1,R2 R1-R2
8) RSB R3,R1,R2 R2-R1
9) RSC R3,R1,R2 R2-R1-C
10) MUL R3,R1,R2 R1*R2 (注意:只保留32位的乘法)
11) MLA R4,R1,R2,R3 R1*R2+R3 (注意:32位累加乘法)
12) UMULL R1,R2,R3,R4 (R1,R2)=R3*R4
(注意:无符号的64位乘法,U代表无符号,最后的L代表长整型,R1和R2是代表寄存器,R1低位,R2高位因为采用了小端模式)
13) UMLAL R1,R2,R3,R4 (R1,R2)=R3*R4+(R1,R2) (注意:64位累加乘法)
14) SMULL R1,R2,R3,R4 (注意:有符号的64位乘法)
15) SMLAL R1,R2,R3,R4 (注意:有符号的64位累加乘法)
重点掌握ADD、ADC、SUB、MOV、MVN、MUL、MLA
逻辑操作
1) AND 就是逻辑“与” R3=R1
例子: MOVR1,#0x0100
MOVR2,#0x0104
ANDR0,R1,R2
0x0100转换2进制为:100000000
0x0104转换2进制为:100000100
最后R0为100000000
2) ORR 就是逻辑“或”
例子: MOVR1,#0x0100
MOVR2,#0x0104
ORRR0,R1,R2
0x0100转换2进制为:100000000
0x0104转换2进制为:100000100
最后R0为100000100
3) EOR就是逻辑“异或”
例子: MOVR1,#0x0100
MOVR2,#0x0104
EORR0,R1,R2
0x0100转换2进制为:100000000
0x0104转换2进制为:100000100
最后R0为000000100
4) BIC是逻辑“位清零逻辑非”
例子: MOVR1,#0x0100
MOVR2,#0x0104
EORR0,R1,R2
0x0100转换2进制为:100000000
0x0104转换2进制为:100000100
最后R0为000000100
比较操作
1) CMP 比较运算R0-Op2 把比较的值存到CPSR位上S上
2) CMN 负数比较运算 R0-(-Op2) 这个也把比较的值存到CPSR位上S上
3) TEQ 测试相等R0^Op2 逻辑异或关系有值就保存到CPSR位上
4) TET 测试R0&Op2 逻辑与的关系有值就保存到CPSR位上