汇编指令
- 随机数
- mov指令
- mov指令
- ldr指令(伪指令)
- add指令
- sub指令
- bic指令
- orr指令
- b指令
- cmp指令
- stmfd指令
- ldmfd指令
- import
- 栈
- 汇编指令的s后缀
随机数
1.如果某个数的数值范围是0~255之间,那么这个数一定是立即数;
2.把某个数展开成2进制,这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位;
3.这个数的二进制序列的右边必须为偶数个连续的 0
mov指令
mov指令:加载12位立即数到寄存器或转移一个寄存器的值到另外一个寄存器
1.mov r0, #2 ;加载立即数2到寄存器r0,MOV{S}<c> <Rd>, #<const>
2.mov r1, r0 ;将r0寄存器的值加载到r1,MOV{S}<c> <Rd>, <Rm>
大多数指令的格式为opcode rd, rn ,rm,其中,rd是目标寄存器,rn是第一操作数寄存器
mov指令
mov指令:按位取反立即数并将该数写入寄存器中
ldr指令(伪指令)
向目标地址的内存中加载数据到某个寄存器
ldr r0, =0x1FF
mov r0, #0x4000 0000
ldr r1, [r0, #4]
#4偏移量
add指令
add指令常用的两种方式
ADD{S}<c> <Rd>, <Rn>, #<const> : 将#随机数 和寄存器Rn中的值相加存入Rd寄存器中
ADDS}<c> <Rd>, <Rn>, <Rm>{, <shift>}:将Rn寄存器和Rm中的值相加存入Rd寄存器中
sub指令
1.SUB{S}<c> <Rd>, <Rn>, #<const> :将Rn寄存器中的值和#随机数相减存入寄存器Rd中
2.SUB{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}:将Rn中的值和Rm中的值相减存入Rd中
bic指令
指定位清零
bic r1, r0, #(1<<0) 将r0中数据为1的位数清零后 存入r1中
orr指令
指定位置一
orr r1, r0, #(1<<0)
b指令
1.b 跳转至目标指令
2.bl 跳转至目标指令 并且保存pc的值到LR中
3.bx(pc) lr 将lr中的值装入pc中
4.blx
cmp指令
cmp r0, r1 (r0-r1)
stmfd指令
stmfd sp!, {r0 - r12, …}
入栈保护
ldmfd指令
ldmfd sp!, {r0-r12, …}
出栈
import
import c语言函数入口地址
bl fn
参数由寄存器传递
如果参数超过五个 由栈传参
如果函数有返回值 将存入r0返回
push{r0} 入栈
pop{r0} 出栈
栈
增栈:指针向地址增加方向移动
减栈:指针向地址减小方向移动
满栈:先移动再写入
空栈:先写入再移动
ARM中为满减栈
汇编指令的s后缀
汇编指令的s后缀,几乎所有的汇编指令都可以在指令后面加上s后缀,s后缀的含义是在指令执行过程中会更新cpsr寄存器的N,V,C,Z位
N:在结果是有符号的二进制补码情况下,如果结果为负数,则N=1;如果结果为非负数,则N=0
Z:如果结果为0,则Z=1;如果结果为非零,否则Z=0
C:是针对无符号数最高有效位向更高位进位时C=1;减法中运算结果的最高有效位从更高位借位时C=0
V:该位是针对有符号数的操作,会在下面两种情形变为1,两个最高有效位均为0的数相加,得到的结果最高有效位为1;两个最高有效位均为1的数相加,得到的结果最高有效位为0;除了这两种情况以外V位为0