汇编

汇编指令

随机数

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
相关推荐
黎雁·泠崖1 天前
Java底层探秘进阶:JIT汇编逐行拆解!Java方法栈帧与C语言深度对标
java·c语言·汇编
小初生ZLD1 天前
CSDN年度技术趋势预
汇编
切糕师学AI2 天前
ARM 汇编指令:STM
汇编·arm开发·stm
黎雁·泠崖3 天前
Java 方法栈帧深度解析:从 JIT 汇编视角,打通 C 与 Java 底层逻辑
java·c语言·汇编
切糕师学AI3 天前
ARM 汇编指令:LDM
汇编·arm开发
山峰哥4 天前
SQL调优核心战法——索引失效场景与Explain深度解析
大数据·汇编·数据库·sql·编辑器·深度优先
切糕师学AI8 天前
ARM 汇编指令:UBFX
汇编·arm开发
切糕师学AI8 天前
ARM 汇编指令:STP\LDP
汇编·arm开发
Trouvaille ~8 天前
【Linux】库制作与原理(三):动态链接与加载机制
linux·c语言·汇编·got·动静态库·动态链接·plt
猫猫的小茶馆9 天前
【ARM】从零封装STM32标准库
汇编·arm开发·stm32·单片机·嵌入式硬件·架构