首页 > 其他分享 >X86/ARM 寄存器

X86/ARM 寄存器

时间:2024-01-13 17:22:09浏览次数:29  
标签:X86 int param rbp 地址 寄存器 rsp ARM

1、X86 64寄存器

1.1、x86 通用寄存器16个

寄存器名 寄存器作用
rdi 第一个入参
rsi 第二个入参
rdx 第三个入参
rcx 第四个入参
r8 第五个入参
r9 第六个入参 更多的参数则通过压栈传入
r10--r15   临时数据
rax  

rax 寄存器可以用来存储函数的返回值、临时存储数据以及进行算术和逻辑运算。

一些常见的用途包括:

1、函数返回值: 当函数返回一个整数值时,通常会将该值存储在 rax 寄存器中。例如,C 语言中的 int 类型的函数返回值。

2、临时数据存储: 由于 rax 是通用寄存器,它可以用来存储临时数据,供计算和操作使用。

3、算术和逻辑运算: rax 可以用于执行各种算术和逻辑运算,例如加法、减法、乘法、与、或、异或等。

4、系统调用: 在进行系统调用时,一些返回值或参数可能存储在 rax 寄存器中。

rbx

存储一般性目的的数据

1、函数调用期间,rbx 通常被视为一个可以被调用者保存的寄存器。这意味着如果函数在使用 rbx 寄存器的时候需要保留其值,那么在函数调用结束时,它需要还原 rbx 的值。

2、rbx 寄存器来保存临时数据、计数器值、数组地址等。

rsp

栈向下生长,rsp 寄存器(栈指针)的主要作用是指示栈的当前位置。栈是一种后进先出(Last-In-First-Out,LIFO)的数据结构,用于存储函数调用、局部变量和其他相关信息。

具体而言,rsp 寄存器的作用包括:

1、栈的增长和收缩: rsp 寄存器的值指示栈的顶部,即最新压入的数据的位置。当新的数据被推送到栈上时,rsp 的值减小;当数据从栈上弹出时,rsp 的值增加。

2、函数调用: 在函数调用时,参数和返回地址通常会被推送到栈上。rsp 的值在函数调用前后发生变化,指示栈的新位置。

3、局部变量的分配和释放: 局部变量通常存储在栈上,通过 rsp 寄存器来管理它们的分配和释放。当函数需要分配一些局部变量空间时,rsp 的值减小;当函数退出时,通过增加 rsp 的值来释放这些空间。

4、栈的边界: rsp 的值还用于检查栈的边界。当 rsp 的值超出了栈的范围时,可能触发栈溢出。

rbp

rbp 寄存器(基址指针)的主要作用是用于建立函数的栈帧。栈帧是函数在运行时在栈上创建的局部存储区域,用于存储局部变量、函数参数、返回地址和其他与函数执行相关的信息。

具体而言,rbp 寄存器的作用包括:

1、建立栈帧: 在函数的开头,通常会执行类似以下的指令序列:

assembly
Copy code
push rbp // 保存调用者的栈底
mov rbp, rsp // 设置当前栈帧的基址

 

2、这将调用者的栈底地址保存在新栈帧的基址寄存器 rbp 中,并将当前栈顶地址(栈指针 rsp 的值)赋给 rbp,从而建立了一个新的栈帧。

3、局部变量和参数的访问: 通过 rbp,函数可以轻松访问栈上的局部变量和函数参数。局部变量通常是相对于 rbp 的负偏移,而函数参数通常是相对于 rbp 的正偏移。

4、函数调用和返回: 在函数调用时,调用者将返回地址和其他信息推送到栈上。rbp 的使用使得函数可以准确地找到返回地址。在函数返回时,通过 pop rbp 恢复调用者的栈底,从而撤销当前栈帧。

5、更好的调试信息: 使用 rbp 寄存器建立栈帧可以提供更好的调试信息。调试器可以通过 rbp 寄存器更容易地还原函数调用堆栈,从而更方便地进行源代码级别的调试。

1.2、 x86 64其他常用寄存器

寄存器名 寄存器作用
rip

指令寄存器(RIP)包含下一条将要被执行的指令的逻辑地址。

通常情况下,每取出一条指令后,RIP会自增指向下一条指令。在x86_64中RIP的自增也即偏移一定字节。(可通过disassemble 查看下一个地址,字节大小不一定等长)

但是RIP并不总是自增,也有例外,例如call 指令和ret指令。call指令会将当前RIP的内容压入栈中,将程序的执行权交给目标函数;ret指令则执行出栈操作,将之前压入栈的8个字节的RIP地址弹出,重新放入RIP。

   
   
   
   

 

2 arm 寄存器

2.1armv8 通用寄存器

寄存器名 寄存器作用
x0--x7 传递子程序的参数和返回值,使用时不需要保存。多余参数用堆栈传递,64位cpu 返回结果保存在x0 寄存器中。
x8 保存子程序的返回地址,使用时不需要保存。
x9--x15 临时寄存器,子程序使用时不需要保存。
x16--x17 子程序内部调用寄存器(IPx) ,使用时不需要保存,尽可能不使用
x18 平台寄存器,与平台相关,尽量不使用、ABI 相关
x19--x28 临时寄存器, 子程序使用时必须保存
x29 帧指针寄存器(FP) 用于连接栈帧,使用时必须保存 frame pointer register
x30 链接寄存器(LR) ,用于保存子程序的返回地址。 procedure link register

2.2、其他常用寄存器

寄存器名 寄存器作用
x31 堆栈指针寄存器(SP), 用于指向每一个函数的栈顶  current stack pointer
pc program pointer 存储当前正在执行的指令的地址,指向正在执行的下一条指令

 

3、测试

栈向下生长,栈顶在低地址,栈底在高地址

查看指定地址汇编代码

x/30xi 0x00000000004005e4

查看指定地址的代码数据(堆栈)

x/30x 0x7ffffffac0

3.1 测试程序

#include <stdint.h>

void test_func(int param_1, int param_2, int param_3, int param_4, int param_5, int param_6, int param_7, int param_8, int param_9)
{
    int szArr[10];
    szArr[1] = param_1;
    szArr[2] = param_2;
    szArr[3] = param_3;
}

int main()
{
        int param_1 = 1, param_2 = 2, param_3 = 3;
        int param_4 = 4, param_5 = 5, param_6 = 6;
        int param_7 = 7, param_8 = 8, param_9 = 9;
    test_func(param_1, param_2, param_3, param_4, param_5, param_6, param_7, param_8, param_9);
    return 1;
}

 

标签:X86,int,param,rbp,地址,寄存器,rsp,ARM
From: https://www.cnblogs.com/tzj-kernel/p/17960135

相关文章

  • armv8虚拟化原理笔记
    随便记记,没有章法。VTTBR_EL2和TTBR1_EL2有啥区别?VTTBR_EL2是内存虚拟化中stage2页表的基地址存放的寄存器,高16位存放了VMID,用于提高VMTLB性能;TTBR1_EL2,是指在VHE开启的情况下hostOS可以在EL2运行,这时候内核使用的页表基地址就存放在这里;设备模拟分为软件模拟和直接assign。......
  • GDB调试之寄存器查看与修改(六)
    一、寄存器查看命令命令:"iregister"查看所有的寄存器,如果只想查看指定的寄存器,则使用"ir寄存器名称",如"irrdi",寄存器的名称列表如下所示:函数参数低于六个的时候,会把参数放在寄存器中,当函数参数高于六个参数的时候,就不会把参数放在寄存器中,而是放在函数栈中。调试代码如下......
  • 持续构建行业影响力|HarmonyOS SDK荣膺年度“技术卓越”奖项
    持续构建行业影响力|HarmonyOSSDK荣膺年度“技术卓越”奖项自2023年9月华为宣布鸿蒙原生应用全面启动以来,HarmonyOSSDK通过将HarmonyOS系统级能力对外开放,支撑开发者高效打造更纯净、更智能、更精致、更易用的鸿蒙原生应用,和开发者共同成长。通过在开发者社区和HarmonyOS开发者持......
  • 持续构建行业影响力|HarmonyOS SDK荣膺年度“技术卓越”奖项
    自2023年9月华为宣布鸿蒙原生应用全面启动以来,HarmonyOSSDK通过将HarmonyOS系统级能力对外开放,支撑开发者高效打造更纯净、更智能、更精致、更易用的鸿蒙原生应用,和开发者共同成长。 通过在开发者社区和HarmonyOS开发者持续的内容共创与技术交流互动,HarmonyOSSDK获得OSCHINA、IT......
  • 教您在79元ARM平台实现H.265视频解码
    什么是H.265视频编解码?(1)什么是H.265H.265,也被称为HEVC(HighEfficiencyVideoCoding),作为H.264的继任者,提供了更好的视频压缩和更高的视频质。H.265通过引入更多先进的编码技术,如更强大的运动估计和更高效的变换编码,对比H.264进行了改进。这些改进使得H.265能够以相同的质量下使......
  • Docker Swarm Cluster 部署
    1、部署环境服务器名称IP地址备注node0110.32.161.124Managernode0210.32.161.125Worknode0310.32.161.126Work2、DockerCE安装参考:https://www.cnblogs.com/a120608yby/p/9883175.html3、更改所有节点配置#修改配置并重启docker#vi/etc/doc......
  • 23年最新版pycharm找不到conda可执行文件解决办法
    引言我下载的是2023年最新版本的pycharm,新版的pycharm安装好了之后就会出现一个问题,就是在配置conda虚拟环境找不到conda的可执行文件,出现了以下问题。遇到这个问题有两种解决办法。解决办法1、第一种按照以下步骤,找到condabin文件下面,conda.bat文件,把路径给复制下来......
  • harmonyOS一:基本语法
    基本语法文件构成一个文件以__.ets__结尾的,基本上要包含装饰器@Entry@Component@builder@State...自定义组件用@Component装饰的structIndex变量声明UI描述build方法里包含的代码块系统组件ArkUI框架中默认内置的基础和容器组件,可直接被开发者调用。......
  • 32Bit、基于ARM CPU的STM32F100C6T6BTR、STM32G030F6P6TR微控制器(MCU)
    1、STM32F1系列主流MCU:STM32F100C6T6BTR ICMCU32BIT32KBFLASH48LQFPSTM32F1系列主流MCU满足了工业、医疗和消费类市场的各种应用需求。该系列在集成一流的外设和低功耗、低电压运行等基础上实现了高性能,同时还以可接受的价格实现了高集成度,并具有简单的架构和简便易用的工具......
  • proteus8 单步调试stm32 外置arm gcc
    10年前proteus7的时代,51单片机就已经可以用keil和proteus联调了,单步调试,像连接了一个jtag调试口一样。proteus官方提供的keil调试器驱动有arm设备,不过我反复尝试,虽然识别到ProteusVSMSimulator设备和端口,但是还是报错,无法成功。本文只是借助proteus内置的编辑器和单步调试器,......