门户网站开发如何提高产品排名保定做网站建设

news/2025/10/9 10:12:46/文章来源:
门户网站开发如何提高产品排名,保定做网站建设,做百科发那些网站新闻好,登录wordpress数据库吗一.栈的整体作用 (1)保存现场/上下文 (2)传递参数:汇编代码调用c函数时#xff0c;需传递参数 (3)保存临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。 二.为什么汇编代码调用c函数需要设置栈 之前看了很多关于uboot的分析#xff0c;其中就有说要为C语…一.栈的整体作用 (1)保存现场/上下文 (2)传递参数:汇编代码调用c函数时需传递参数 (3)保存临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量。 二.为什么汇编代码调用c函数需要设置栈 之前看了很多关于uboot的分析其中就有说要为C语言的运行准备好栈。而自己在Uboot的start.S汇编代码中关于系统初始化也看到有栈指针初始化这个动作。但是从来只是看到有人说系统初始化要初始化栈即正确给栈指针sp赋值但是却从来没有看到有人解释为何要初始化栈。所以接下来的内容就是经过一定的探究试图来解释一下为何要初始化栈。要明白这个问题首先要了解栈的作用。关于栈的作用要详细讲解的话要很长的篇幅所以此处只是做简略介绍。总的来说栈的作用就是保存现场/上下文传递参数保存临时变量 1.保存现场/上下文现场/上下文意思就相当于案发现场总有一些现场的情况要记录下来的否则被别人破坏掉之后你就无法恢复现场了。而此处说的现场就是指CPU运行的时候用到了一些寄存器比如r0,r1等等对于这些寄存器的值如果你不保存而直接跳转到子函数中去执行那么很可能就被其破坏了因为其函数执行也要用到这些寄存器。因此在函数调用之前应该将这些寄存器等现场暂时保持起来(入栈push)等调用函数执行完毕返回后(出栈pop)再恢复现场。这样CPU就可以正确的继续执行了。保存寄存器的值一般用的是push指令将对应的某些寄存器的值一个个放到栈中把对应的值压入到栈里面即所谓的压栈。然后待被调用的子函数执行完毕的时候再调用pop把栈中的一个个的值赋值给对应的那些你刚开始压栈时用到的寄存器把对应的值从栈中弹出去即所谓的出栈。其中保存的寄存器中也包括lr的值因为用bl指令进行跳转的话那么之前的pc的值是存在lr中的然后在子程序执行完毕的时候再把栈中的lr的值pop出来赋值给pc这样就实现了子函数的正确的返回。 2.传递参数C语言进行函数调用的时候常常会传递给被调用的函数一些参数对于这些C语言级别的参数被编译器翻译成汇编语言的时候就要找个地方存放一下并且让被调用的函数能够访问否则就没发实现传递参数了。对于找个地方放一下分两种情况。一种情况是本身传递的参数不多于4个就可以通过寄存器传送参数。因为在前面的保存现场的动作中已经保存好了对应的寄存器的值那么此时这些寄存器就是空闲的可以供我们使用的了那就可以放参数。另一种情况是参数多于4个时寄存器不够用就得用栈了。 3.临时变量保存在栈中 包括函数的非静态局部变量以及编译器自动生成的其他临时变量。 4.举例分析C语言函数调用是如何使用栈的对于上面的解释的栈的作用显得有些抽象此处再用例子来简单说明一下就容易明白了用:arm-inux-objdump–d u-boot dump_u-boot.txt可以得到dump_u-boot.txt文件。该文件就是中包含了u-boot中的程序的可执行的汇编代码其中我们可以看到C语言的函数的源代码到底对应着那些汇编代码。下面贴出两个函数的汇编代码一个是clock_init另一个是与clock_init在同一C源文件中的另外一个函数CopyCode2Ram33d0091cCopyCode2Ram:33d0091c:  e92d4070  push   {r4, r5, r6, lr}33d00920:  e1a06000  mov r6, r033d00924:  e1a05001  mov r5, r133d00928:  e1a04002  mov r4, r233d0092c:  ebffffef  bl  33d008f0 bBootFrmNORFlash......33d00984:  ebffff14  bl  33d005dc nand_read_ll......33d009a8:  e3a00000  mov r0, #0 ; 0x033d009ac:  e8bd8070  pop {r4, r5, r6, pc}33d009b0clock_init:33d009b0:  e3a02313  mov r2, #1275068416   ;0x4c00000033d009b4:  e3a03005  mov r3, #5 ; 0x533d009b8:  e5823014  str r3, ......33d009f8:  e1a0f00e  mov pc, lr1clock_init部分的代码可以看到该函数第一行33d009b0:  e3a02313  mov r2, #1275068416   ;0x4c000000就没有我们所期望的push指令没有去将一些寄存器的值放到栈中。这是因为我们clock_init这部分的内容所用到的r2,r3等等寄存器和前面调用clock_init之前所用到的寄存器r0没有冲突所以此处可以不用push去保存这类寄存器的值不过有个寄存器要注意那就是r14即lr其是在前面调用clock_init的时候用的是bl指令所以会自动把跳转时候的pc的值赋值给lr所以也不需要push指令去将PC的值保存到栈中。而clock_init的代码的最后一行:33d009f8:e1a0f00e mov pc, lr就是我们常见的movpc,lr把lr的值即之前保存的函数调用时候的PC值赋值给现在的PC这样就实现了函数的正确的返回即返回到了函数调用时候下一个指令的位置。这样CPU就可以继续执行原先函数内剩下那部分的代码了。2CopyCode2Ram部分的代码其第一行33d0091c:e92d4070 push {r4, r5, r6, lr}就是我们所期望的用push指令保存了r4,r5,r以及lr。用push去保存r4,r5,r6那是因为所谓的保存现场以后后续函数返回时候再恢复现场而用push去保存lr那是因为此函数里面还有其他函数调用33d0092c:  ebffffef  bl  33d008f0 bBootFrmNORFlash......33d00984:  ebffff14  bl  33d005dc nand_read_ll......也用到了bl指令会改变我们最开始进入clock_init时候的lr的值所以我们要用push也暂时保存起来。而对应地CopyCode2Ram的最后一行33d009ac:e8bd8070 pop {r4, r5, r6,pc}就是把之前push的值给pop出来还给对应的寄存器其中最后一个是将开始push的lr的值pop出来给赋给PC因为实现了函数的返回。另外我们注意到在CopyCode2Ram的倒数第二行是33d009a8:e3a00000 mov r0, #0 ;0x0是把0赋值给r0寄存器这个就是我们所谓返回值的传递是通过r0寄存器的。此处的返回值是0也对应着C语言的源码中的“return0”.对于使用哪个寄存器来传递返回值当然你也可以用其他暂时空闲没有用到的寄存器来传递返回值但是这些处理方式本身是根据ARM的APCS的寄存器的使用的约定而设计的你最好不要随便改变使用方式最好还是按照其约定的来处理这样程序更加符合规范。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/932396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文详解企业如何借助AI技术重构业务基因(附发展趋势、关键能力、具体策略)

摘 要 近年来,AI 技术应用迎来新的发展高潮,成为企业重构业务基因、提档进阶的重要驱动力量。在 AI 技术的支持下,企业可以更高质高效地实现业务系统灵活配置和快速迭代,破除当前业务架构过于刚性、业务系统自由度…

课后作业一

动手动脑: 这段代码展示了方法重载(Method Overloading)的特性。 方法重载是指在同一个类中,可以定义多个同名的方法,只要它们的参数列表(参数的类型、个数、顺序)不同即可。 在这段代码里: 有两个名为 square…

我工作中用MQ的10种场景

前言 最近有球友问我:MQ的使用场景有哪些?工作中一定要使用MQ吗? 记得刚工作那会儿,我总是想不明白:为什么明明直接调用接口就能完成的功能,非要引入MQ这么个"中间商"? 直到经历了系统崩溃、数据丢失…

提升网站的访问速度优化关键词的方法有哪些

链接:C 设计模式 链接:C 设计模式 - 工厂方法 链接:C 设计模式 - 抽象工厂 链接:C 设计模式 - 建造者模式 原型模式(Prototype Pattern)是一种创建型设计模式,它允许一个对象通过复制现有对象来…

提示缺少xxx.dll文件,DLL修复工具 全系列完整版 (支持32位/64位winxp/win7/win10/win11系统)

下载地址获取https://weibo.com/ttarticle/p/show?id=2309405219774505812150 image 使用说明 image 自动修复文件 image 手动输入需要安装的DLL文件修复后-文件会下载到以下目录:如果是32位的就放在C:\Windows\Syst…

推广网站建设上海公司注册虚拟地址

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 以下是正文! 一、写文背景 我们在写后端…

中国建设银行支付网站广州有哪些网站建设

目录 1. LSTM的背景人工神经网络的进化循环神经网络(RNN)的局限性LSTM的提出背景 2. LSTM的基础理论2.1 LSTM的数学原理遗忘门(Forget Gate)输入门(Input Gate)记忆单元(Cell State)…

2025 年电线电缆厂家最新推荐实力厂家榜单:聚焦优质企业,助力精准选购

在当前工业建设、民生工程及新兴产业快速发展的背景下,电线电缆作为关键基础配套产品,其质量与性能直接影响项目安全与效率。然而,市场上企业数量繁杂,部分产品存在质量不达标、技术落后等问题,导致采购方难以精准…

基于MATLAB的火灾检测GUI系统设计与实现

一、系统架构设计 1. 技术架构 graph TD A[摄像头/视频输入] --> B(图像预处理) B --> C{特征提取} C --> D[火焰检测模块] C --> E[烟雾检测模块] D --> F(GUI显示) E --> F F --> G[报警模块] …

博客园登录bug

今天登录博客园遇到的情况 1、人机验证初次生效,之后尝试新密码后只能弹出提示并不能验证 2、短信登录根本收不到验证码

从零开始:C#实现计算表达式解析与求值——以后缀表达式为例

从零开始:C#实现计算表达式解析与求值——以后缀表达式为例当提到表达式解析技术时,很多人第一反应可能是复杂且精细的递归下降方法。这种方法主要用于构建抽象语法树(AST),虽然功能强大,能够处理复杂的语法结构,…

基于Java+Springboot+Vue开发的鲜花商城管理系统源码+运行步骤

项目简介该项目是基于Java+Springboot+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过…

tp3企业网站开发百度云平面设计网站源码

转载地址:https://www.cnblogs.com/qingchunjun/p/4208159.html

简单网站建设规划方案新媒体网站建设十大的经典成功案例

目录 AIoT的协同计算 一、背景与意义 二、原理与方法 三、关键技术与挑战 四、应用与实践 AIoT的协同计算 一、背景与意义 随着物联网和人工智能技术的快速发展,智能物联网(AIoT)成为了一个新兴的前沿领域。在这个领域中,多移动终端设备如智能手机、可穿戴设备、无人…

78建筑网站品牌策划书范文案例

我们都知道,当 Oracle 数据库出现性能故障后,一般会在线上实时诊断数据库性能问题,特别是资源突然打高的场景,这个时候用到ASH的数据,就能很大程度上准确定位问题所在。 Oracle ASH 在 Oracle 数据库中,实…

新开传奇网站韩版小橘子被做h网站

我使用的是airbnb规则进行代码eslint。 会出现保存后,数组或者对象最后一个元素尾随逗号。 此时需要在.eslintrc.js中加入下面代码即可 "comma-dangle": ["error", {"arrays": "never","objects": "never…

第五届无线通信、网络与物联网国际学术会议

第五届无线通信、网络与物联网国际学术会议 2025 5th International Conference on Wireless Communication, Networking and Internet of Things (WCNIoT 2025) 第五届无线通信、网络与物联网国际学术会议(WCNIoT 2…

php自适应网站开发wordpress空间满

知乎传送门:https://www.zhihu.com/question/29355920 为什么图片反复压缩后会普遍会变绿而不是其他颜色?这是大神做的模拟迭代压缩的测试:https://m13253.github.io/JPEGreen/。排名第一的回答已经很仔细了,关于图像压缩不是很懂…

2025 年低温冷水机厂家联系方式推荐:广东弘星制冷专注工业温控,提供定制设备与管家式服务

当前工业领域对温度控制的精准度、稳定性及节能性要求日益提升,新能源、医药化工、半导体等关键行业,更是将可靠的温控系统视为生产流程高效运转的核心保障。然而,市场上部分温控设备存在选型适配性差、能耗过高、故…