首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在ARM64汇编代码中,寄存器31XZR和SP是什么时候?

在ARM64汇编代码中,寄存器31XZR是零寄存器,而SP是栈指针寄存器。

  1. 寄存器31XZR(Zero Register)是一个特殊的寄存器,它的值始终为零。在ARM64汇编代码中,它经常被用于执行一些与零相关的操作,比如清零操作、比较操作等。
  2. SP(Stack Pointer)是栈指针寄存器,用于指向当前栈顶的内存地址。栈是一个用于存储临时数据的内存区域,主要用于函数调用和局部变量的存储。当一个函数被调用时,会将参数和返回地址等数据存储到栈中,然后在函数执行完毕后,再从栈中取回这些数据。SP寄存器的值随着栈的增长和收缩而改变。

ARM64架构是一种适用于移动设备和嵌入式系统的处理器架构,具有高性能和低功耗的特点。在ARM64汇编代码中,寄存器31XZR和SP扮演着重要的角色,它们的正确使用能够保证程序的正确性和高效性。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供高性能、可扩展的云服务器实例,适用于各种场景。 链接:https://cloud.tencent.com/product/cvm
  • 腾讯云云函数(SCF):无服务器计算服务,让您无需关心基础设施,实现按需运行代码逻辑。 链接:https://cloud.tencent.com/product/scf
  • 腾讯云云存储(COS):提供高可靠、低成本、强大的对象存储服务,适用于图片、视频、音频等多媒体数据存储。 链接:https://cloud.tencent.com/product/cos

请注意,由于要求不提及某些流行的云计算品牌商,以上链接只是示例,并非真实的腾讯云产品链接。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ARM64 撬开逆向大门

ARM64汇编由什么组成的? • 汇编中共有34个寄存器。其中包括31个通用寄存器SP寄存器、PC寄存器,CPSR寄存器。•31个通用寄存器: X0-X30:表示是64位的寄存器。...•汇编代码中使用 X0 - X30寄存器进行访问操作数据时,它就表示的是一个64位的数据。•汇编代码中使用 W0 - W30寄存器进行访问操作数据时,它表示的是一个32位的数据。 ?...LDUR指令:将内存负数的数据取出来,并存放到寄存器。 LDP指令:表示出栈指令 ? ARM64汇编的函数有那些需要重点关注? 1.函数调用约定是什么约定?...3.3 函数8个参数9个参数的具体情况(不过开发过程参数超过8个的情况是比较少的,因此逆向过程这种超过8个参数的情况也会比较少的) 3.3.1函数中有八个参数的,直接用寄存器W0-...ARM64汇编代码: ? 3.3.2 函数中有九个参数的,需要用栈寄存器来传递参数 源代码: ? ARM64汇编代码: ? 4.函数的堆栈怎么平衡?

2.1K54

汇编语言之ARM64汇编

对于arm64系的CPU来说, 如果寄存器以x开头则表明的是一个64位的寄存器,如果以w开头则表明是一个32位的寄存器系统没有提供16位8位的寄存器供访问使用。...x1的数据存入sp+0x10所指向的栈空间 []相当于是获取指定地址的空间,不会改变sp原来的值,如果想改变sp的值只需末尾加上!...,获取所对应的空间 8086的[bx]是类似的 另外 汇编简写 stp x29,x30,[sp,#-0x10]!...arm代码示例 .text ;代码段 .global _A,_B ;定义两个全局函数 AB _A: mov x0 ,#0xa0 ;arm汇编数据用#开头 mov x1 ,#0x00 add...又称为末尾函数 这种函数在编写汇编代码时可以省略使用栈空间, 栈空间是为了临时保护数据不被下一个函数污染, 叶子函数不存在这种风险,所以不需要进行保护处理,直接使用寄存器即可 ARM64方法返回值 ARM64

3.2K60
  • 低于0.01%的极致Crash率是怎么做到的?

    因为respondsToSelector:的参数是一个selector,所以只要再查出这个selector是什么(对应查询x2符号表的符号),也可以马上定位到问题代码。...图8(摘自技术博客) _funcB的前三行代码如图8的汇编代码所示: 第1行stp指令是表示将_funcA的栈底指针fp、链接寄存器lr存到_funcA的栈顶sp - 0x10的地址上,并将sp设置为sp...为了看到调用过程的汇编代码,我们需要在- (IBAction)testCmethodCall1:(id)sender设置断点,然后Xcode设置Always Show Disaasembly(见图...由上面的分析过程我们可以看到: 子函数开头的汇编代码会调整fp、sp指针 参数传递少于8个的使用x0-x7寄存器 超过8个的则使用栈来传递 子函数的返回值一般存在x0 因为x0、x1、x29、x30等寄存器有特殊含义...,所以有时候会把这些寄存器的值先存到栈上,然后再使用它们 2.2.

    2K51

    一文搞懂 Ftrace 的实现原理

    arm64 栈帧结构 arm64 有31个通用寄存器 r0-r30,用法分别如下: 寄存器 意义 SP Stack Pointer: 栈指针 r30 Link Register: 调用函数时候,保存下一条要执行指令的地址...函数调用过程传递参数返回值 NZCV 状态寄存器:N(Negative)负数 Z(Zero) 零 C(Carry) 进位 V(Overflow) 溢出 下面以如下代码为例,说明它的栈帧结构:...d); return0; } int main(int argc,char **argv) { int a = 0; int b = 1; fun1(a,b); } 其反汇编后的结果对应栈帧结构为...callee函数,由于x29保存了上一级caller的栈顶sp指针,因此不在需要入栈保存,如示例fun2执行时,此时x29指向fun1的栈顶sp 编译阶段 以 blk_update_request 为例...,看下其开启 Ftrace 前后的反汇编代码: 可以看出,右图中多插入了一段【3f3c: 94000000 bl 0 】,那么是由谁何时插入的呢?

    55510

    ARM64下函数参数的传导

    一·代码 int sum(int a,int b){ return a+b; } 二·Debug调试结果 QQ图片20210131143525.png 我们可以发现编译器做了如下几件事情 1....拉伸main函数栈空间 用来存放参数 2.保护x30 x29寄存器的值 3.参数以x29赋值的sp作为参照物依次减去所需要参数的内存空间 4.参数传递到我们写的sum函数当中去 2.png 三·优化思考...1.在上一章 ARM64下用汇编写一个死循环及函数保护栈 我们写了一个空函数,与以往不同的是这次编译器没有进行简写操作 2.既然编译器做的事情是把参数寄存器里出栈入栈运算的话,为什么不直接通过汇编操作寄存器...那么我们可以知道参数最后传递给w0或x0,再次通过Debug调试得到w0=1e #30 QQ图片20210131150450.jpg 四·通过汇编手写一个函数栈图 1.sub sp, sp, #0x40...从上一章 ARM64下用汇编写一个死循环及函数保护栈 我们可以知道,死循环是由于ret 返回后lr保存的值当前函数地址一致导致死循环。

    2K40

    一文搞懂 | Ftrace 的实现原理

    arm64 栈帧结构 arm64 有31个通用寄存器 r0-r30,用法分别如下: 寄存器 意义 SP Stack Pointer: 栈指针 r30 Link Register: 调用函数时候,保存下一条要执行指令的地址...函数调用过程传递参数返回值 NZCV 状态寄存器:N(Negative)负数 Z(Zero) 零 C(Carry) 进位 V(Overflow) 溢出 下面以如下代码为例,说明它的栈帧结构:...d); return0; } int main(int argc,char **argv) { int a = 0; int b = 1; fun1(a,b); } 其反汇编后的结果对应栈帧结构为...callee函数,由于x29保存了上一级caller的栈顶sp指针,因此不在需要入栈保存,如示例fun2执行时,此时x29指向fun1的栈顶sp 编译阶段 以 blk_update_request 为例...,看下其开启 Ftrace 前后的反汇编代码: 可以看出,右图中多插入了一段【3f3c: 94000000 bl 0 】,那么是由谁何时插入的呢?

    1.3K30

    iOS逆向之ARM64汇编基础

    armv6|armv7|armv7s|arm64都是ARM处理器的指令集,这些指令集都是向下兼容的,例如arm64指令集兼容armv7,只是使用armv7的时候无法发挥出其性能,无法使用arm64的新特性...iPhone5s及其之后的iOS设备指令集都是ARM64。 还有两个我们也很熟悉的指令集:i386x86_64是Mac处理器的指令集,i386是针对intel通用微处理器32架构的。...而对于函数参数是浮点数的情况,传参时则不再使用X0~X7寄存器,而是使用D0~D7寄存器。超出8个的参数仍然使用栈来传递。 操作栈的时候,通常包括栈空间的开辟回收。...开辟回收栈空间通常使用的是SUBADD指令FP、SP寄存器。...用于指向栈底 5.SP寄存器为栈指针寄存器,用于指向栈顶 6.每次数据入栈或出栈都会更新SP寄存器的值 如下2张图所示,可以看出两个变量栈内存的布局。

    9.3K32

    如何编写一个Android inline hook框架

    所以issues说的把mov r0,sp去掉用来接收参数也是有问题的,就是参数栈上的情况,传过来的时候sp不是原来的sp了。...源码函数第一行内嵌汇编恢复寄存器?很可惜,这种只无参、无返回值(空实现)、只有内嵌汇编的情况会成功,其他情况下源码的第一行并不是汇编的第一行。。。...难就难在这个不好通过内嵌汇编实现,因为b跟的是个偏移值,汇编可以使用 //函数名称,编译器替换,但是内嵌汇编不行。...上面的汇编添加一个蹦床一样的问题,除非自己实现预处理之类的自动插入汇编代码、宏等,似乎不太现实。。。 似乎很难实现自动化,手动写代码太麻烦且arm的部分接口、行为不一致。...奇怪的是编译出的文件包含armthumb32,混合的。没有细看是什么情况,编译c/c++使用的汇编器不一致吗?

    3.3K30

    使用 Unicorn 模拟器运行具有不同 CPU 架构的代码

    我用它来跟踪分析 iOS arm64 二进制文件严重混淆深度嵌套的代码部分。所以它可以是一个非常好的工具来帮助进行一些动态代码分析。您可以运行具有不同目标架构的代码并立即观察结果。...但理论上,在生成的汇编代码,调用约定可能因平台而异.) mbp:~ clang demo.c -o demo -arch arm64 -isysroot /Applications/Xcode.app...正如我们调用之前看到的那样strcmp,我们有ldur x1, [x29, -8]一条指令从内存中加载一个值,该值x29寄存器指向递减的8寄存器x1,并将add x0, sp, #13其添加13到sp...根据调用约定,这些应该是上面源代码我们dec_key变量的地址。key 让我们模拟器运行这段代码,x0并x1strcmp调用之前转储内容。...我将使用它即时反汇编记录指令。 这是一个完全工作的模拟器代码。让我们部分地回顾它。 #!

    2.1K10

    ThreadInfo结构内核栈的两种关系

    结构 上面的一种方式是thread_info结构内核栈共用一块存储区域,而另一种方式是thread_info结构存储task_struct结构。...这时候我们再来看下当thread_infotask_struct结构时,用一张图描述下。 ?...那sp_el0是什么东西? sp:堆栈指针寄存器 el0: ARM64架构分为EL0,EL1,EL2,EL3。EL0则就是用户空间,EL1则是内核空间,EL2则是虚拟化,EL3则是secure层。...sp_el0: 则就是用户空间栈指针寄存器SP_EL0值存储的是什么? 这个内存其实在后面的进程切换中会涉及到,这里先简单说明了。..., x9 msr sp_el0, x1 ret ENDPROC(cpu_switch_to) 这段汇编的意思是将prev进程的x19到x29, x9, lr寄存器都存储在内核堆栈

    2.7K10

    深入iOS系统底层之CPU寄存器介绍

    我们高级语言里面看到的只是变量,但是低级语言里面看到的就是内存地址寄存器,你可以将内存地址寄存器也理解为定义的变量,带着这样的思路去阅读汇编代码时你就会发现其实汇编语言也不是那么的困难。...高级语言中我们可以根据自身的需要定义出很多有特殊意义的变量,但是低级语言中因为寄存器就那么几个,它必须要被复用重复使用,因此汇编语言中就会出现大量的将寄存器的内容保存到内存的指令代码以及从内存读取到寄存器的指令代码...在说分类之前要说一下寄存器的长度问题。有时候我们看汇编代码时会发现代码中出现了x0, w0(arm64); 或者rax, eax, ax, al(x64)。 它们之间有什么关系吗?...X0-X30, XZR arm64 32 W0-W30, WZR 如果你仔细观察一些汇编代码寄存器的使用,其实你会发现一些特点: x64体系RAX以及arm64体系的X0一般都用来保存函数的返回值...假设我们foo1的某处调用foo2函数,这时候因为foo2函数内部的代码指令也可能会用到x0,x1,x2等寄存器

    1.3K41

    Ftrace function graph简介

    详细进入这段汇编代码的解释之前,我们先看一下设置current_tracer的时候具体发生了什么。...所以其实mcount_enter函数就是将FP及LR寄存器的值保持栈里面。同时将当前的栈指针SP作为新函数的FP(frame pointer)。...依然以上面的cpu_up的汇编代码为例,首先通过压栈将LR、FP寄存器的内容保存在栈里。函数结束时,通过ldr x29, x30, [SP], #32将栈里面的LR及FP的内容恢复到寄存器里面。...这一段依然是汇编代码。 其中save_return_regs将X0~X7的值保持栈里面,restore_return_regs 用于将内容重新restore到寄存器里面。 为什么要这么做呢?...由于执行过程要动态的修改栈内容,所以需要关闭CONFIG_SHADOW_CALL_STACK;比较旧的内核版本上是需要关闭CONFIG_STRICT_MEMORY_RWXKERNEL_TEXT_RDONLY

    63820

    Arm64 栈回溯

    AArch64过程调用标准寄存器的使用规则 下面是Arm64程序调用标准规定的通用寄存器的使用方法。...调用者保存的临时寄存器(X9-X15) 调用者若使用到了X9-X15寄存器调用子函数之前,需要将X9-X15寄存器保存到自己的栈,子函数使用这些寄存器时候不需要保存恢复。...第一张图片是寄存器信息,pc寄存器sp寄存器对栈回溯有重要作用。第二张图是内核线程irq/231-dwc3栈数据的二进制转储,栈回溯就是在这些二进制数据中找到栈帧,从而找到调用的函数地址。...sp寄存器指向了第一个栈帧的FP1寄存器,即0xffffffc0ee823b80地址,FP1向高地址偏移8字节得到LR1寄存器,即0xffffff80087369e4地址,该地址位于dwc3_ep0_...需要注意的是,代码里调用了该函数,但在栈回溯没有找到符号,肯定是编译器优化,将该函数内联了,是否内联可以通过反汇编确认。

    51111

    iOS汇编ARM64基础介绍

    0x1234567的大端字节序小端字节序的写法如下图: ARM64寄存器 可以通过register read查看 通用寄存器 arm64提供了31个64位通用寄存器。...MOV BX, AX ;(BX)=(AX) 复制代码 寄存器间接寻址 操作数的有效地址基址寄存器,而操作数存储器的寻址方式。...MOV AL, [BX] 复制代码 寄存器相对寻址 也称为直接变址寻址方式。操作数的有效地址是一个基址(BX、BP)或变址(SI、DI)寄存器的内容指令给定的一个位移量(disp)之和。...(BX、BP)一个变址寄存器(SI、DI)的内容之和 MOV AL,[BX][SI] MOV AL,[BX+SI] 复制代码 汇编指令介绍 参考链接 leylfl.github.io/2018/05...bl指令:同样是跳转指令,但是跳转之前,会将下一条指令保存到LR寄存器,因此,可以通过将lr的内容重新加载到pc,来返回到跳转指令之后的那个指令处执行。

    1.5K11

    栈详解

    SPFP寄存器 sp寄存器在任意时刻会保存我们栈顶的地址。 fp寄存器也称为x29寄存器属于通用寄存器,但是某些时刻我们利用它保存栈底的地址!...iOS栈是往低地址开辟空间 image.png 函数调用栈 常见的函数调用开辟恢复的栈空间: //开辟栈空间 sub sp, sp, #0x40 ; 拉伸0x40...ldr(load register)指令 将数据从内存读出来,存到寄存器。 ldr str 的变种 ldp stp 还可以操作2个寄存器。...寄存器的值交换了,内存的值不变。 add sp, sp, #0x20 ;恢复栈空间 ret 这段代码相当于 x0,x1遍历,sp内存没有变。...⚠️:函数嵌套调用的时候,需要将x30入栈!开辟空间需要16字节对齐。如果开辟8字节再读的时候会坏地址访问。写的时候没问题。

    1.8K00

    (重磅原创)冬之焱: 谈谈Linux内核的栈回溯与妙用

    还有就是如果崩溃发生在C库,CPU的pclr(arm架构)寄存器指向的函数指令C库的用户空间,很难找到应用的代码哪里调用了C库的函数。...3.1.2 arm架构从汇编代码角度解释栈回溯的原理 为了使读者理解的更充分,下文列出一段应用层C语言代码汇编后的代码 C代码 ? 汇编代码 ?...请回头看上一节的代码演示 ? 汇编代码是 ? 可以发现,test_a_函数前两条指令不是stpx29, x30,[sp,#-16]mov x29,sp,这两条指令可是栈回溯的关键环节。怎么解决呢?...如下是mips架构内核驱动ko文件的 C代码汇编代码。 C代码 ?...与内核栈回溯原理一致,打印崩溃过程每个函数的指令地址,然后应用程序的反汇编文件查找,就能找到该指令处于的函数,如果不理解,请看文章前方讲解的内核栈回溯代码与原理。

    4.8K31
    领券