当前位置: 首页 > news >正文

杂志社网站建设意义开发小程序定制软件

杂志社网站建设意义,开发小程序定制软件,如何在自己的网站上做歌单,小红书推广在哪里说明 看了下ARM平台上C语言函数调用的反汇编代码,理清楚了其中的内存栈汇编操作,特整理下。本文环境基于:ARMv8-a架构A53核soc,aarch64状态。 预先了解的知识点 内存栈 栈和栈帧的基本概念重点:出栈入栈的单位不是…

说明

  • 看了下ARM平台上C语言函数调用的反汇编代码,理清楚了其中的内存栈汇编操作,特整理下。
  • 本文环境基于:ARMv8-a架构A53核soc,aarch64状态。

预先了解的知识点

内存栈

  • 栈和栈帧的基本概念
  • 重点:出栈入栈的单位不是单个局部变量,而是栈帧。

相关寄存器

  1. FP:Frame Pointer(栈帧指针),指向当前栈帧的顶部,在A53平台是使用通用寄存器x29保存。
  2. SP:Stack Pointer(栈顶指针),保存当前栈顶地址,在A53平台是一个特殊寄存器,不同异常等级是不同的寄存器,
  3. LR:Link Register(链接寄存器),保存子函数运行结束后的返回地址(跳转指令的下一条指令地址),在A53平台是使用通用寄存器x30充当,详细使用请看bl和ret指令说明。
  • 问题:初次了解,不好理解和区分FP和SP的作用和角色,SP是全局唯一的保存栈顶地址的寄存器,而FP是保存单个函数的栈帧基址,调用新函数,入栈操作结束后,需要将SP的值赋值给FP,类似于:SP是全局变量,而x29是局部变量,虽然大部分时刻两个寄存器值是一样的。

相关汇编指令

  • 函数调用实现原理,跳转和返回指令
  • 内存操作store,load

实例

  • C源码(a.c)
#include <stdio.h>int test1()
{return test(1, 2);
}int test(int a, int b)
{return a+b;
}int main()
{test1();return 0;
}
  • 对应的汇编代码(aarch64-linux-gnu-gcc -S a.c)
    .arch armv8-a.file   "a.c".text.align  2.global test1.type   test1, %function
test1:stp x29, x30, [sp, -16]!add x29, sp, 0mov w1, 2mov w0, 1bl  testldp x29, x30, [sp], 16ret.size   test1, .-test1.align  2.global test.type   test, %function
test:sub sp, sp, #16str w0, [sp, 12]str w1, [sp, 8]ldr w1, [sp, 12]ldr w0, [sp, 8]add w0, w1, w0add sp, sp, 16ret.size   test, .-test.align  2.global main.type   main, %function
main:stp x29, x30, [sp, -16]!add x29, sp, 0bl  test1mov w0, 0ldp x29, x30, [sp], 16ret.size   main, .-main.ident  "GCC: (Linaro GCC 6.3-2017.05) 6.3.1 20170404".section    .note.GNU-stack,"",@progbits

说明

  • 从汇编代码可以看出存在两种不同实现,如下:
  1. 函数调用栈中间函数(test1)
  2. 函数调用栈末端函数(test)

中间函数

test1:stp x29, x30, [sp, -16]! //将栈空间扩大16字节(更改sp寄存器值),再将x29,x30的数据(遗传自父函数)保存到栈顶 add x29, sp, 0 //将栈顶地址(sp)即此函数的栈帧基址保存到x29,...  //函数操作(省略)bl  test //跳转到test函数执行ldp x29, x30, [sp], 16 //将栈顶数据load到x29,x30中,再缩小栈空间16字节(即将sp恢复到父函数的栈顶)ret //返回父函数

末端函数

test:sub sp, sp, #16 //将sp保存的数据减小16字节,即将栈空间扩大16字节... //函数操作(省略)add sp, sp, 16 //将sp保存的数据增加16字节,即将栈空间缩小16字节ret

问题

  1. 为什么中间函数和末端函数实现不同,中间函数需要将x29,x30保存到栈内存中,最后再从栈内存中load到x29,x30中。
  • 是因为中间函数(test1)bl指令调用末端函数(test)时,会覆盖掉x30的数据(原本保存的是父函数main,跳转test1的下一条指令),覆盖后中间函数(test1)的ret指令就跳不回main函数了,因此需要先将x30的数据保存到栈上,从子函数跳转回来后,需要将x29,x30的数据从栈上恢复。
  • x29是栈帧指针,保存是当前函数的frame pointer,是约定俗成,因此需要保存和恢复,但是也不是必须,例如:test函数中就没有使用x29。

注意项

  1. sp 必须16Byte 对齐,扩大和缩小都必须是16字节的倍数。
http://www.yayakq.cn/news/187806/

相关文章:

  • 做网站都可以用什么框架马鞍山建设局网站
  • 网站提取规则怎么设置基于asp的网络课程网站开发
  • 自建网站投放广告海洋网站建设性价比高
  • 百度提交网站已删内容重庆网站建设公司销售
  • 荆门哪里有专门做企业网站的新准则中公司网站建设费用计入什么科目
  • 微信网站改版价格具有价值的网站制作
  • 优秀设计工作室网站怒江州城乡建设局网站
  • 水果电商网站开发方案网站开发接口文档模板
  • 个人做商贸网站外贸平台大全
  • 湖南省建设银行网站wordpress编辑器转义
  • 阿里云网站域名备案wordpress kvstore
  • 常州网站制作机构网站建设服务商城
  • 淘宝客网站需要多大空间做网站公司价格多少
  • 万金娱乐网站开发网站文字规范
  • 建设网站的公司兴田德润在哪里现在做电商还能赚钱吗
  • 网站路径河南企业网官方网站
  • 普通网站怎么做h5网络规划工程师
  • 中和华丰建设有限责任公司网站郑州市二七建设局网站
  • 三合一网站建设平台编辑网站的软件手机
  • 监控网站开发建筑网站搜图
  • 外贸公司网站建设 重点是什么意思熊猫代理ip
  • 建设一个电商网站的流程是什么公司培训课程有哪些
  • 关于加强网站建设上海小程序定制公司
  • 公司网站自己可做吗建筑模板生产厂家
  • 茂名建站价格内蒙古最新消息
  • 外贸网站推广建站软件开发者选项
  • 购物网站页面福州网站建设推进
  • 大连 模板网站星子县网站建站公司
  • 网站备案号规则广州市品牌网站建设怎么样
  • 外网有趣的网站沈阳小装修公司哪家好