函数本质

作者: 泰克2008 | 来源:发表于2018-06-09 17:19 被阅读0次

002--函数本质

  • 栈:是一种具有特殊的访问方式的存储空间(后进先出, Last In Out Firt,LIFO)

SP(stack pointer)和FP寄存器

  • sp寄存器在任意时刻会保存我们栈底的地址.
  • fp寄存器也称为x29寄存器属于通用寄存器,但是在某些时刻我们利用它保存栈顶的地址!

注意:ARM64开始,取消32位的 LDM,STM,PUSH,POP指令! 取而代之的是ldr\ldp str\stp
ARM64里面 对栈的操作是16字节操作的!!

关于内存读写指令

注意:读/写 数据是都是往高地址读/写

st指令

  • stur指令
    • 把寄存器的值(32位)写进内存
  • stp/str指令
    • 把寄存器的值(128位/64位)写进内存

ld指令

  • ldr指令
    • 从内存地址取一个单个的32位值
  • dlp指令
    • 从内存地址取一个单个的64位值

堆栈操作练习

使用32个字节空间作为这段程序的栈空间,然后利用栈将x0和x1的值进行交换.

sub    sp, sp, #0x20    ;拉伸栈空间32个字节
stp    x0, x1, [sp, #0x10] ;sp往上加16个字节,存放x0 和 x1
ldp    x1, x0, [sp, #0x10] ;将sp偏移16个字节的值取出来,放入x1 和 x0

bl和ret指令

bl标号

  • 将下一条指令的地址放入lr(x30)寄存器
  • 转到标号处执行指令

ret

  • 默认使用lr(x30)寄存器的值,通过底层指令提示CPU此处作为下条指令地址!

ARM64平台的特色指令,它面向硬件做了优化处理的

x30寄存器

x30寄存器存放的是函数的返回地址.当ret指令执行时刻,会寻找x30寄存器保存的地址值!

注意:在函数嵌套调用的时候.需要讲x30入栈!

函数的参数和返回值

ARM64下,函数的参数是存放在X0到X7(W0到W7)这8个寄存器里面的.如果超过8个参数,就会入栈.
函数的返回值是放在X0 寄存器里面的.

函数的局部变量

函数的局部变量放在栈里面!

相关文章

  • Redis

    1.指针函数与函数指针 指针函数本质是指针,其返回值是指针。如 float *fun(); 函数指针,本质是指针。...

  • 指针扫盲

    一.函数指针与指针函数 总结函数指针, 本质上它是一个指针,这个指针指向一个函数地址指针函数,本质上它是一个函数,...

  • C++supplement之指针函数与函数指针

    ●指针函数:本质为函数,函数返回类型是某一类型的指针。 e.g.: int *f() ●函数指针:本质为指针,其指...

  • 如何理解Python装饰器

    装饰器本质 装饰器本质上是用一个新的函数替换原先的函数. 本质上是如下语句 使用wraps保存原函数的name和d...

  • 函数与作用域

    函数声明和函数表达式有什么区别 函数声明的本质是使用function声明一个函数,而函数表达式的本质是将一个函数赋...

  • Block的原理

    block的原理是怎样的?本质是什么? 本质就是一个封装了函数调用impl.FuncPtr以及函数调用环境函数需要...

  • 函数的本质

    函数的参数和返回值 ARM64下,函数的参数是存放在X0到X7(W0到W7)这8个寄存器里面的.如果超过8个参数,...

  • 函数本质

    002--函数本质 关于CPU的补充 寄存器 CPU除了有控制器、运算器还有寄存器。其中寄存器的作用就是进行数据的...

  • 函数本质

    002--函数本质 栈 栈:是一种具有特殊的访问方式的存储空间(后进先出, Last In Out Firt,LI...

  • 函数本质

    逆向课程随堂笔记 002--函数本质 关于CPU的补充 寄存器 CPU除了有控制器、运算器还有寄存器。其中寄存器的...

网友评论

    本文标题:函数本质

    本文链接:https://www.haomeiwen.com/subject/lnateftx.html