函数栈帧的创建和销毁(Xcode13.1 上面以及ARM结构和VS(X86))具体讲解

Objective-C Hello World:解剖iOS运行时与消息派发机制 Objective-C 是 Apple 生态底层运行时模型的核心载体,其本质是基于动态消息派发(objc_msgSend)和运行时(Runtime)的面向对象系统。理解它需从基础概念切入:类对象、SEL选择器、IMP函数指针及方法缓存机制;原理上依赖编译期ARC插入、链接期符号解析与运行期动态查找三级协同;技术价值在于支撑UIKit/Swift桥接/混编调试等关键能力;典型应用场景包括崩溃分析(如unrecognized selector)、内存优化(autoreleasepool作用域)、Runtime 阅读详情


先在这里说一点废话:

因为苹果M1芯片(ARM)的出现改变了整个PC市场,终于有除了x86结构的芯片出现再了PC市场(如果有表述错误请原谅我)。根据相关消息,高通宣布推出其ARM结构的pc芯片(在2023)。M1一切低耗能比著称,因其独特的ARM(精简指令集)。因为其ARM生态还没有完全发展起来,苹果巧妙利用Rosetta(进行翻译),让X86程序在ARM上面跑起来了(虽然苹果宣称其没有性能减少,但是不可避免有性能消耗)。因为苹果的号召力,未来更多的基于ARM的程序(PC)不可避免将会出现出现在ARM平台。这个让我研究ARM上面的汇编更加有意义。

栈区的基本介绍请添加图片描述

[^1]本文将其ARM与X86进行比较

先从X86进行讲解怎么进行函数栈帧的创建和销毁

在这里插入图片描述
上面的以rbp为栈顶,rsp为栈底。

#include<stdio.h>

int Add(int a, int b) {
	int z = a + b;
	return z;
}

int main() {
	int a = 10;
	int b = 20;
	int c = Add(a, b);
	printf("%d", c);
	return 0;

这个应用简单的代码进行压栈

这Xcode上面进行压栈(以ARM为基本框架)

按照下面的代码执行

#include<stdio.h>

int Add(int a, int b) {
	int z = a + b;
	return z;
}

int main() {
	int a = 10;
	int b = 20;
	int c = Add(a, b);
	printf("%d", c);
	return 0;

这段代码只执行了
int main()这一行代码
ARM结构的好像只有栈顶(sp),没有栈底(fp)

其中Add函数也可以进行压栈操作,这这里不进行讨论了。

ZXing-C++跨平台条码库实战:从编译集成到性能优化全解析 条码(Barcode)技术作为数据自动识别与采集的基础手段,其核心原理在于将信息编码为特定规则排列的图形符号,并通过光电扫描设备进行快速读取。在软件开发领域,实现条码的生成与识别功能是移动应用、桌面软件及嵌入式系统中的常见需求。然而,跨平台开发面临的主要挑战在于如何统一处理不同操作系统和硬件架构下的依赖管理与编译工具链差异。ZXing-C++库通过提供一套高效、可移植的C++解决方案,有效应对了这一挑战,其技术价值在于实现了“一次编写,到处编译”的跨平台开发范式。该库不仅支持QR Code、Data Mat 阅读详情

相关推荐

Unity离线TTS集成实战:基于sherpa-onnx的跨平台流式语音合成方案

文本转语音(TTS)技术是实现人机语音交互的核心基础,其原理是将文本信息通过声学模型和声码器转换为自然语音波形。在工程实践中,离线TTS因其无需网络、低延迟、高隐私的特性,成为教育软件、车载助手、游戏旁白等场景的刚需。sherpa-onnx作为一个高性能、跨平台的语音AI推理框架,集成了VITS、FastSpeech2等先进开源模型,通过ONNX Runtime实现高效推理,并支持流式播放技术,能够实现“边合成边播”的实时交互体验。本文将深入探讨在Unity中集成sherpa-onnx离线TTS的完整方案,

weixin_34396103的博客 445

arm/arm64函数栈帧(stackframe)结构和传参规则

本文汇编代码的平台及编译器:arm/gcc。分析函数调用栈的规则对于理解程序运行基本原理很有帮助,汇编代码分析crash问题也大有裨益。本文示例代码通过C语言函数调用一个汇编函数,再从汇编函数跳转回C函数,分析该示例的汇编代码就可以stack frame的创建和arm函数调用的传参规则。arm32使用哪些寄存器传参,如果参数超过4个怎么传参?arm32/gcc中函数调用stack frame的创建,以及函数返回stack frame的销毁过程是怎样的?

GetnextWindow的专栏 5993

Unity项目资源优化实战:Easy WebP插件实现高效图片压缩与跨平台加载

在游戏与应用开发中,资源管理与性能优化是核心挑战,尤其是图片资源,其体积直接影响应用包体大小、网络加载速度和用户体验。现代图片压缩技术通过先进的编码算法,在保证视觉质量的前提下,显著减小文件体积,从而降低存储与传输成本。WebP作为一种高效的图片格式,其价值在于出色的压缩率与画质平衡,能有效解决资源密集型项目的体积瓶颈。在Unity引擎中,通过集成WebP解码库并封装易用的API,开发者可以无缝地将此技术应用于UI图集、背景大图等场景,实现资源瘦身与加载提速。本文介绍的Easy WebP插件,正是基于lib

weixin_34198881的博客 371

ARM64架构栈帧回溯

ARM64架构栈帧回溯简介以及demo演示

小立仔 3152

Gemma 4本地部署全指南:手机到服务器一键运行实战

大语言模型(LLM)本地部署是当前AI工程化落地的核心能力,其本质是将模型推理能力从云端解耦,依托量化技术、轻量推理引擎与容器化封装实现跨设备适配。关键技术原理包括GGUF格式的内存映射加载、CPU/GPU异构后端自动调度、以及基于cgroup的资源隔离机制。该能力显著降低私有化AI应用门槛,支撑RAG知识库、边缘智能终端、离线代码辅助等高价值场景。本文聚焦Gemma 4系列模型,结合Ollama、llama.cpp与Docker Compose三大主流路径,覆盖Android Termux、无GPU云服务

weixin_34354173的博客 453

【ARMv7-A】——栈帧

在 ARM 中,通常为满减栈(Full Descending FD), 也就是说,堆栈指针指向堆栈内存中最后一个填充的位置,并且随着每个新数据项被压入堆栈而递减。

tyustli 1512

ARM函数调用过程分析

1. ARM的栈帧 先来看看ARM的栈帧布局图: 上图描述的是ARM的栈帧布局方式,main stack frame为调用函数的栈帧,func1 stack frame为当前函数(被调用者)的栈帧,栈底在高地址,栈向下增长。图中FP就是栈基址,它指向函数的栈帧起始地址;SP则是函数的栈指针,它指向栈顶的位置。ARM压栈的顺序很是规矩,依次为当前函数指针PC、返回指针LR、栈指...

weixin_30752377的博客 1406

flutter 学习记录

flutter 基础总结记录,

qq_21460133的博客 204

ARM C语言函数调用栈帧详解

ARM C语言函数调用栈帧详解

JJ1116的博客 1862

IMU数据处理避坑指南:从理论到实践的加速度计重力消除方案

本文详细解析了IMU数据处理中的重力消除技术,从理论基础到实践应用,涵盖了加速度计和陀螺仪的核心问题。通过ROS2实战案例,介绍了静态标定与动态校准的技术对比,以及多传感器融合的进阶策略,帮助开发者避免常见陷阱,提升IMU数据处理的精度和效率。

purple的博客 741

别再到处找模型了!手把手教你用Xinference+Docker部署本地私有大模型(Llama2/Qwen实战)

本文详细介绍了如何使用Xinference和Docker部署本地私有化大模型(如Llama2/Qwen),涵盖硬件配置、模型管理、Docker部署及性能优化等关键步骤。通过实战案例,帮助开发者快速构建企业级AI推理服务,确保数据安全与高效运行。

weixin_28683065的博客 232

Flutter 环境配置 Windows/Mac 完全指南

本文提供了Windows和Mac平台配置Flutter开发环境的详细指南。Windows部分包含:1)Flutter SDK安装与环境变量配置;2)Android Studio安装与SDK工具配置;3)模拟器创建与启动方法;4)VS Code推荐配置;5)常见问题解决方案。Mac部分指导:1)Homebrew安装;2)Flutter SDK配置;3)Xcode与iOS工具链设置;4)Android环境配置;5)多平台开发验证。文章特别强调了环境变量设置、路径命名规范以及不同CPU架构的模拟器选择等易错点,并

理论都是虚的,代码才是王道。 605

恶意代码实验3:Word宏病毒实验

只要下次打开这个word文档,就会执行以上代码,并将自身复制到Normal.dot(word文档的公共模板)和当前文档的ThisDocument中,同时改变函数名(模板中为Document_Close,当前文档为Document_Open),此时所有的word文档打开和关闭时,都将运行以上的病毒代码,可以加入适当的恶意代码,影响word的正常使用,本例中只是简单的跳出一个提示框。回答不正确三次,即可自动跳出病毒程序,但那时已经出现几十个文档。1、打开的宏编辑器如图所示,即可编写病毒代码。

qq_63949327的博客 6505

Flutter面试冲刺:30天从原理到实战,打造高含金量教程App

在跨平台开发领域,掌握核心框架原理与工程化实践是开发者进阶的关键。Flutter作为现代UI工具包,其响应式编程模型和高效的渲染引擎,为构建高性能、跨平台应用提供了强大支持。理解其核心三棵树(Widget、Element、RenderObject)的协同机制,是深入性能优化和复杂状态管理的基础。在实际工程中,合理运用状态管理方案(如Riverpod、Provider)和分层架构,能显著提升应用的可维护性和团队协作效率。本文聚焦Flutter面试高频考点,通过一个深度整合原理剖析、性能优化与原生交互的教程Ap

weixin_30315435的博客 494

长安车机破解后能干啥?分享我的UNI-K车机安装第三方应用与优化体验实录

本文详细记录了长安UNI-K车机破解后的实用玩法与深度优化指南,包括安装第三方应用、导航体验升级、影音系统改造及系统美化等。通过工具箱和升级技巧,车主可以大幅提升用车体验,解锁更多隐藏功能。

weixin_33217202的博客 407

OpenAI Realtime API实时语音交互实战指南

实时语音交互是人机自然对话的核心能力,其本质在于构建低延迟、双向、流式协同的音频-语义闭环。它突破传统REST API的请求-响应范式,依托WebSocket实现毫秒级音频输入流(audio.delta)、模型生成流(text/audio.delta)与动态控制流(session.update)三重并行。该技术显著降低端到端延迟至300ms以内,支撑语音助手、智能客服、对话式教育等强实时场景。本文聚焦OpenAI Realtime API的工程落地,详解PCM音频流处理、VAD语音活动检测、AudioCon

weixin_32285357的博客 393

Unity手游广告变现:Google Mobile Ads插件集成与避坑指南

在移动应用开发中,广告变现是开发者实现应用商业化的重要途径。其核心原理是通过集成广告SDK,在应用界面中请求、加载并展示来自广告平台的广告内容,从而根据展示或用户互动获得收益。这项技术的价值在于为开发者提供了一种可持续的收入模式,尤其适用于免费游戏和应用。在Unity游戏开发领域,Google Mobile Ads插件是实现这一功能的关键工具,它封装了原生平台的复杂性,允许开发者使用C#统一管理AdMob广告。然而,在实际工程实践中,从SDK安装、初始化到各广告格式的集成,常会遇到诸如**线程安全**和**

weixin_30915951的博客 413

go语言实现服务器server端与客户client端即时通信(附完整源码)

go语言实现服务器server端与客户client端即时通信(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 629

arm64入栈出栈_arm 栈帧结构

摘要:先看个例子: void test2(int a,int b,int c) { int k=a,j=b,m=c; } GCC反汇编: 00000064 test2: mov ip, sp //IP=SP;保管SP stmdb sp!, {fp, ip, lr, pc} //先对SP加4,再对fp,ip,lr,pc压栈。---------1 sub fp, ip, #4 ; 0x4 /]先看个例...

weixin_33255691的博客 1331

华为云计算——FusionCompute创建虚拟机

华为云计算——FusionCompute创建虚拟机

jks212454的博客 3676

HANA-公司间销售ICS-IDOC系统配置-保姆级配置文档

合作伙伴编号:这个客户表示收票方(销售公司在生产公司中所对应的客户代码,卖方开票,买方收票),也就是咱们在配置消息类型输出的时候合作伙伴的类型的一个具体的客户编码,这个是站在发货工厂的角度去看的,也就是EDI 输出的 BP 合作伙伴的编号;在项目实施过程中经常会遇到关联方交易的问题,有公司间采购的业务场景,也会存在公司间销售的业务场景,本文将着重讲解公司间销售在SAP系统中的实现场景。在这个过程中,销售公司向客户开票产生应收,而生产公司向销售公司开票产生自己的应收,同时销售公司向生产公司产生应付。

我小时候很黑的博客 2393

arm linux 栈帧,arm 栈帧/栈回溯/栈帧回溯 相关

arm平台的调用栈回溯(backtrace)title: arm平台的调用栈回溯(backtrace)date: 2018-09-19 16:07:47tags:介绍arm平台的调用栈与x86平台的调用栈大致相同,稍微有些区别,主要在于栈帧的压栈内容和传参方式不同。在arm平台的不同程序,采用的编译选项不同,程序运行期间的栈帧也会不同。有些工具在对arm的调用栈回溯时,可能会遇到无法回溯的情况。例...

weixin_30150003的博客 521

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ARM栈帧与编译选项

ARM 编译选项 状态寄存器

chenzhjlf的专栏 608

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ARMv7-A 那些事 - 7.栈回溯浅析

在嵌入式开发过程中,经常需要对代码进行调试来解决各种各样的问题,常用的调试手段有:(1)、开发环境搭配硬件仿真器进行在线调试。优点:调试过程中能够清楚的知道各个寄存器的值以及各个变量的值,程序的执行流程也能够一目了然。缺点:板卡需要引出硬件仿真器的连接口,并且需要购买硬件仿真器。(2)、通过调试串口打印信息梳理程序的执行流程,结合代码分析问题产生的原因。

Ailson Jack的专栏 821

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

x86-64平台栈帧结构与ARM64栈帧结构对比

x86-64 ARM64 差异点 ARM64平台上的栈帧寄存器是FP,它记录的是一个函数执行过程中的栈顶(FP=SP),并且把父函数的FP保存在堆栈的栈顶,以便于回溯 X86-64平台上的栈帧寄存器是RBP,它记录的是一个函数执行过程中的栈底,并且把父函数的RBP位置保存到本函数的栈底,以便于回溯 ...

程序猿Ricky的日常干货 2802

ARM下C语言栈帧机制

原文:ARM下C语言栈帧机制 - 简书背景: 最近在某个RTOS上遇到一个系统BUG,几经折腾,终于将其斩于马下。结局美好,过程却很曲折,在分析定位问题的时候,顺便把ARM上C函数调用stack frame机制捋...https://www.jianshu.com/p/91c5dc0a8bb9 Loyen 0.0492018.10.21 22:56:43字数 1,039阅读 4,383 背景: 最近在某个RTOS上遇到一个系统BUG,几经折腾,终于将其斩于马下。结局美好,过程却很曲折,在分析...

maimang1001的专栏 2049
上一篇: Xcode快捷键
下一篇: ARM寄存器与x86寄存器介绍
assibe
博客等级 码龄5年 1640粉丝 84原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值