- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 ppc32 和 ppc64 架构来为我的编译器实现一个新的后端,但是我对一个函数的序言有疑问,我已经阅读了几个关于 PowerPC 的 IBM 文档,但是我读到的关于堆栈的信息很少.一个程序,以及它是如何工作的。因此,为了更好地理解,我使用 godbolt.org 检查函数的编译方式并注意到以下内容:
一个有4个int类型参数的函数,prolog生成如下代码:
test1(int, int, int, int):
stwu 1,-32(1)
stw 31,28(1)
mr 31,1
stw 3,8(31)
stw 4,12(31)
stw 5,16(31)
stw 6,20(31)
一个函数,有5个int类型的参数,使用代码如下:
test2(int, int, int, int, int):
stwu 1,-48(1)
stw 31,44(1)
mr 31,1
stw 3,8(31)
stw 4,12(31)
stw 5,16(31)
stw 6,20(31)
stw 7,24(31)
具有 10 个 int 类型参数的函数使用以下代码:
test4(int, int, int, int, int, int, int, int, int, int):
stwu 1,-48(1)
stw 31,44(1)
mr 31,1
stw 3,8(31)
stw 4,12(31)
stw 5,16(31)
stw 6,20(31)
stw 7,24(31)
stw 8,28(31)
stw 9,32(31)
stw 10,36(31)
我注意到对于 4 参数和 5 参数函数,堆栈偏移量的计算在以下指令中发生了变化。
; 4 parameters
stwu 1,-32(1)
stw 31,28(1)
; 5 parameters
stwu 1,-48(1)
stw 31,44(1)
但在 10 参数函数中,偏移量与 5 参数函数相同,仅使用 8 条“stw”指令加载参数,其余参数稍后使用“lwz”指令加载
为什么会这样?我认为它是堆栈上的东西,但是什么?
PS.: 我在这个问题中展示的汇编代码是由 GCC 4.8.5 PowerPC 生成的
最佳答案
你提到:
only 8 'stw' instructions were used to load the parameters
-但这不是加载参数的代码。根据 ELF ABI,参数已经在寄存器 r3
-r10
中,因为这就是它们传递给函数的方式。
相反,那些 stw
指令将函数参数存储到堆栈中。目前尚不清楚为什么编译器在没有可用函数代码的情况下将参数复制到堆栈,但假设您的函数很简单,我猜您禁用了优化,因此它会将所有内容保存到堆栈帧。
8 参数和 10 参数版本在序言中没有区别的原因是只有前 8 个参数是通过寄存器传递的。任何进一步的参数都传递到调用者的堆栈,并通过 lwz
指令加载。
您应该阅读 ELF ABI specification对于 ppc,它定义了函数调用序列(第 3-14 节)等。虽然您没有指定要针对哪个 ABI 规范进行编译,但在这方面与 ELF 规范应该不会有太多差异。
关于embedded - ppc32和ppc64函数栈计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59557799/
ASIDE:是的,这可以被认为是一个主观问题,但我希望从回答的统计数据中得出结论。 有各种各样的计算设备。它们的物理尺寸、计算能力和电力各不相同。我想知道嵌入式开发人员认为什么是使系统“嵌入式”的决定
当我听到这个时,我总是想到移动设备。但为什么硬件“嵌入”在那里?整个设备不就是硬件吗?为什么个人电脑没有嵌入式硬件系统? 最佳答案 在当今世界,嵌入式仅指具有以下一项或多项特征的系统: 单一用途(即,
我想测试嵌入式 PowerBI 所以我下载了 the sample app能够发布 pbix 文件并嵌入它。 所以我创建了最简单的 PowerBI 文件,可以使用 Azure SQL 制作,使用 Di
我需要问几个关于词嵌入的问题......可能是基本的。 当我们转换一个词的 one-hot 向量时,例如 king [0 0 0 1 0]嵌入向量 E = [0.2, 0.4, 0.2, 0.2] .
我想知道如何将 CEF 添加到我的 Yocto 项目中。此时,我还没有对项目进行任何修改。它由我们的电路板制造商提供。该板有一个ARM 9。 最佳答案 直接在 CEF 论坛上问这个问题是个好主意,可能
实体是否可以访问其 Embedded 对象的 Embedded?例如: @Embeddable public class Address { @Embedded protected A
我有一个类似于这个的 Morphia 架构: @Entity class BlogEntry { @Embedded List comments } @Embedded class B
我的 pom.xml 中有以下插件配置: com.day.jcr.vault maven-vault-plugi
直到现在,我仍然对 Openembedded-core 和 meta-openembedded 中的食谱感到困惑。很多时候,很难将食谱放在正确的目录中。它们真的很相似,但在食谱的内容上似乎如此不同。
我正在尝试使用此处找到的 Tensorflow 运行单词教程的矢量表示: http://www.tensorflow.org/tutorials/word2vec/index.md 第一个脚本 wor
谁能帮我解释一下 power BI premium 和 power BI Embedded 之间的区别? 最佳答案 Power BI Embedded 容量(也称为 SKU)是 billed hour
我在执行一个 MongoDB 请求时遇到了一些麻烦。我在 Node.js 上下文中使用 MongoDB 3.2 和 Mongoose。这是文档: { _id: ObjectId('12345'),
Xcode 常规选项卡中的“嵌入式二进制文件”和构建阶段选项卡中的“嵌入式框架”有什么区别? General 选项卡中的“Linked Frameworks”和 Build Phrases 选项卡中的
我正在尝试执行 maven install在 pom 上,显示的结果是: Grave: SEC5054: Certificate has expired 此结果会在测试执行开始后立即出现。 我一直在搜
我正在研究 ppc32 和 ppc64 架构来为我的编译器实现一个新的后端,但是我对一个函数的序言有疑问,我已经阅读了几个关于 PowerPC 的 IBM 文档,但是我读到的关于堆栈的信息很少.一个程
我大部分时间都在使用 Atmel Studio 等工具和 IDE 开发微 Controller ,并抽象出幕后发生的事情。 假设在这种情况下,我们直接从闪存执行代码,这在嵌入式系统中可能是这种情况。
我刚刚发现我在(Cortex M0)上编写代码的ARM不支持未对齐的内存访问。 现在,在我的代码中,我使用了很多打包结构,并且从未收到任何警告或硬故障,所以当Cortex不允许不对齐访问时,Corte
我正在研究 Uboot bootstrap 。我有一些关于 Bootloader 的功能和它要处理的应用程序的基本问题: Q1:据我所知,引导加载程序用于将应用程序下载到内存中。在互联网上,我还发现引
我想了解基本的RISC架构。经过一些研发,我想使用MIPS架构。但是,我没有获得有关带有MIPS处理器的嵌入式开发板的良好信息。 如果有人可以提出好的董事会建议,将会有很大的帮助。 问候, 拉姆吉 最
考虑我们正在为裸机 MCU 编写固件,即没有操作系统。有人告诉我不可能(非法?)将参数传递给中断处理函数? 我无法准确理解为什么会这样?这有什么问题? 附注。是否可以在某些 RTOS-es、嵌入式 L
我是一名优秀的程序员,十分优秀!