寄存器与部分汇编指令介绍

本文详细介绍了寄存器在CPU中的作用,区分了寄存器、内存和缓存的区别,重点讲解了ARM架构处理器中的通用寄存器(R0-R15)、状态寄存器以及常用的汇编指令如push、mov、ldr等,展示了它们在程序执行中的关键角色。
摘要由CSDN通过智能技术生成

寄存器相關介紹


一、寄存器和内存以及緩存的區別?

寄存器是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
寄存器中保存的地址,实现函数调用的返回操作。这通常用于函数的结尾处,以将执行控制权返回到调用点,继续执行调用函数之后的指令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值