寄存器相關介紹
文章目录
一、寄存器和内存以及緩存的區別?
寄存器是CPU的组成部分,高速访问的存储器,分为通用寄存器和特殊寄存器,一般只把一些计算机指令,频繁用到的数据存在其中,提高运行速度。
缓存:数据交换的缓冲区,但某一个硬件要读取数据,会先从缓存中查找,然后才去内存。
CPU只与寄存器进行存取。cpu<—> 寄存器<–>缓存<–>内存
内存:内存是用于存储程序和数据的主要存储设备
二、寄存器介绍
ARM架构的处理器也包含寄存器,它们在ARM处理器中发挥着重要的作用,用于存储指令、数据和地址等信息。
在每一种处理器模式中有一组相应的寄存器。在任意一种处理器模式下,可见的寄存器包括 15 个通用寄存器(R0~R14)、一个或者二个状态寄存器以及程序计数器(PC)。
寄存器 | 释疑 |
---|---|
r0~r3 | 主要用于子程序间传递参数 |
r4~r11 | 主要用于保存局部变量 |
r12 | 用作子程序间scratch 寄存器,即 ip 寄存器 |
r13 | 通常用做栈指针,即 sp |
r14 | 寄存器又被称为连接寄存器(lr),用于保存子程序以及中断的返回地址 |
r15 | 用作程序计数器(pc) |
CPSR和SPSR | 程序状态寄存器 |
1.通用寄存器
R0-R3 :
父函数在调用子函数前,先将子函数入口参数存入R0~R3 这4个寄存器中,若只有一个入口参数,则使用R0,当超过四个时,其余的参数依次压入当前栈通过栈传递。子函数运行时,将根据自身参数个数从R0~R3,栈中读取
子函数通过R0寄存器将函数返回值传递给父函数,子函数返回时,将返回值存入R0寄存器,当返回到父函数时,父函数读取R0即可。
AAPCS规定,发生函数调用前,由父函数备份R0~R3的寄存器数据。以防止父函数保存在R0-R3的数据被改变
R4-R11 :
发生函数调用时,父函数无需对这些寄存器进行备份处理,若子函数需要使用这些寄存器,则由子函数负责备份,需要那个备份那个,以防止破坏父函数保存在R4~R11的数据,返回时,就需要恢复
R12 :
暂无
R13 :
用于保护栈的当前指针,函数返回时需要保证该寄存器执行调用该函数时的栈地址。
R14:
用来
保存函数的返回地址,父函数调用子函数时,父函数会将调用子函数指令的下一条指令存到LR寄存器中,当子函数返回时,只需要跳转到R14存的地址对于的指令即可。那么父函数在村下一条语句前,需要备份上一级函数的返回地址。
R15:
正在执行的指令地址就存在这里。
2.状态寄存器
暂无
三、汇编指令介绍
Push :
push指令用于将数据或指令推入栈(stack)中。栈是一种后进先出(LIFO)的数据结构,最后一个进入栈的元素会首先被取出。
push operand
1.将寄存器中的值推入栈中
push eax //这条指令会将 eax 寄存器中的值推入栈中
2.将内存中的值推入栈中
push dword ptr [ebp-4]
//dword ptr 表示这是一个双字(32 位)指针。[ebp-4] 是一个内存地址,通常在函数中用于引用局部变量或者参数。
push 指令将地址 [ebp-4] 处的内容压入栈中
3.将立即数推入栈中
push 42
mov :
用于将数据从一个位置(寄存器、内存、立即数等)复制到另一个位置。
mov destination, source
ldr:
从内存中加载数据到寄存器中
ldr destination, source
#其中 destination 是目标寄存器,source 是源操作数,通常是一个内存地址。
1.将一个内存地址中的值加载到寄存器中
ldr r0, [r1]
#这条指令将 r1 中的值作为地址,从该地址读取数据,并将其加载到 r0 寄存器中。
2.将一个立即数加载到寄存器中
ldr r2, =0x1234
3.使用偏移量加载数据:
ldr r3, [r4, #4]
#这条指令将地址 r4 + 4 处的数据加载到 r3 寄存器中
cmp :
cmp 是汇编语言中的一条指令,用于比较两个操作数的值,并根据比较结果设置处理器状态寄存器中的标志位
cmp operand1, operand2
beq :
如果前一个比较操作结果为相等,则执行跳转。它通常用于条件分支,根据先前的比较操作结果来决定程序执行的流程。
CMP R0, R1 ;# 比较 R0 和 R1 的值
BEQ target ;# 如果 R0 等于 R1,则跳转到 target 标签处
#如果在执行 CMP 指令后,R0 和 R1 的值相等,那么程序将跳转到 target 处继续执行。否则,程序将继续执行 BEQ 指令后面的指令。
str:
用于将数据存储到内存中。它通常与寄存器一起使用,将寄存器中的数据写入到指定的内存地址中。
STR Rd, [Rn, #offset]
#其中:
Rd 是要存储的寄存器,它包含要写入内存的数据。
Rn 是基址寄存器,它包含要存储数据的内存地址的基地址。
offset 是偏移量,表示要存储数据的内存地址相对于基址寄存器的偏移量。
STR R1, [R2, #4] #这条指令将 R1 中的数据存储到 R2 + 4 的内存地址处。R2 是基址寄存器,#4 是偏移量。
adds :
即在执行加法操作时设置标志位。它用于将两个操作数相加,并将结果存储到目标寄存器中。此外,ADDS指令还会更新程序状态寄存器(PSR)中的标志位,如零标志、进位标志等,以反映加法结果。
ADDS Rd, Rn, Operand2
#Rd 是目标寄存器,用于存储加法结果。Rn 是第一个操作数寄存器。Operand2 是第二个操作数,可以是另一个寄存器、立即数或寄存器移位操作的结果。
ADDS R0, R1, #10
#这条指令将 R1 中的值与立即数 #10 相加,并将结果存储到 R0 中。同时,根据加法结果,更新程序状态寄存器中的标志位。
ble :
表示 “Branch if Less than or Equal to Zero”,即如果前一个比较操作的结果是小于或等于零,则执行跳转。
CMP R0, R1 ; 比较 R0 和 R1 的值
BLE target ; 如果 R0 小于或等于 R1,则跳转到 target 标签处
movw:
将一个立即数加载到目标寄存器的低 16 位中
MOVW R0, #0xABCD
#这条指令将立即数 0xABCD 加载到寄存器 R0 的低 16 位中,同时将 R0 的高 16 位清零。
movt :
与上相反。
dsb :
实现数据同步栅栏(Data Synchronization
Barrier)。数据同步栅栏是一种同步指令,用于确保在执行指令序列时,先前的数据操作已经完成,然后才能继续执行后续的数据操作。
DSB {options}
#其中 {options} 是可选的参数,用于指定数据同步的方式,如 SY(全系统数据同步)或 ISH(隔离型共享数据同步)等。这些选项用于控制数据同步栅栏的行为,以满足特定的同步需求。
// 执行一系列数据操作
DSB
// 继续执行后续的数据操作
这样,通过在 DSB 指令之前插入一系列的数据操作,并在 DSB 指令之后继续执行后续的数据操作,可以确保数据的一致性和完整性。
bne :
CMP R0, R1 ; 比较 R0 和 R1 的值
BNE target ; 如果 R0 不等于 R1,则跳转到 target 标签处
bx lr :
将程序控制权返回到调用函数的地方。LR 是链接寄存器(Link
Register),通常用于保存函数调用时的返回地址。在函数调用时,调用指令会将返回地址存储到 LR 中,以便在函数执行完毕后返回到调用点。
BX LR 指令的含义是将程序控制权返回到 LR
寄存器中保存的地址,实现函数调用的返回操作。这通常用于函数的结尾处,以将执行控制权返回到调用点,继续执行调用函数之后的指令