- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
正如标题所说,我在理解 ARM 架构的调用约定时遇到了问题。特别是,我仍然很难知道调用子程序时 LR 寄存器会发生什么。
我认为在进入子程序时处理 LR 寄存器的最明显和更安全的方法是将其存储到堆栈中,但该行为并未出现在文档中,因此我想到了以下示例。
我将用 C 语言编写,因为我认为用 C 语言更容易解释。假设你只有两个函数
void function_1(void){
//some code here
}
void function_2(void){
//some code here
function_1();
//some code here
}
我在 function_1
中使用 LR 寄存器的方式就像我之前说的那样,我会将它的值存储在堆栈中,但如果你仔细观察,function_1 不会调用任何其他子程序,这样就没有必要了。
是否有可能在使用 ARM 编译器时,该编译器会决定不将 LR 存储到堆栈中?
我在 infocenter 的这个网站上读到了调用标准
最佳答案
调用约定仅定义哪些寄存器是调用保留的,哪些是调用破坏的,以及在哪里可以找到堆栈参数。
当函数准备好返回时,如何确保其返回地址在某处可用,这 100% 取决于函数。处理这个问题的最简单和有效的方法是将它一直留在 LR 中,在叶函数中。 (一个不调用其他函数的函数:它是调用图/树中的一片叶子)。
实践中的编译器通常会将它留在叶函数的 LR 中,即使禁用了优化。例如,GCC 设置了一个禁用优化的帧指针,但当它知道不需要那么多暂存寄存器以使用 LR 时,它仍然不存储/重新加载 LR。
否则在非叶函数中,普通编译器会通常将其存储到堆栈中,但如果他们愿意,他们可以将 R4 保存到堆栈中,然后 mov r4, lr
,然后在他们准备好返回时恢复 LR 并重新加载 R4。
如果需要,非租用/非线程安全函数理论上可以将其返回地址保存在静态存储中。
来源和GCC8.2 -O2 -mapcs-frame
output from Godbolt ,强制它生成 APCS(ARM 过程调用标准)堆栈帧,即使在不需要时也是如此。 (看起来它与 -fno-omit-frame-pointer
具有类似的效果,后者在优化时默认打开。)
void function_1(void){
//some code here
}
function_1:
bx lr @ with or without -mapcs-frame
void unknown_func(void); // not visible to the compiler; can't inline
void function_2(void){
function_1(); // inlined, or IPA optimized as pure and not needing to be called.
unknown_func(); // tailcall
unknown_func();
}
function_2: @@ Without -macps-frame
push {r4, lr} @ save LR like you expected
bl unknown_func
pop {r4, lr} @ around a call
b unknown_func @ but then tailcall for the 2nd call.
或使用 APCS:
mov ip, sp
push {fp, ip, lr, pc}
sub fp, ip, #4
bl unknown_func
sub sp, fp, #12
ldm sp, {fp, sp, lr}
b unknown_func
int func3(void){
unknown_func();
return 1; // prevent tailcall
}
func3: @@ Without -macps-frame
push {r4, lr}
bl unknown_func
mov r0, #1
pop {r4, pc}
或使用 APCS:
func3:
mov ip, sp
push {fp, ip, lr, pc}
sub fp, ip, #4
bl unknown_func
mov r0, #1
ldmfd sp, {fp, sp, pc}
由于不需要 thumb 交互操作(使用默认编译选项),GCC 会将保存的 LR 弹出到 PC 中,而不是仅仅返回到 LR 中用于 bx lr
。
将 R4 与 LR 一起压入可使堆栈按 8 位对齐,这是 IIRC 的默认设置。
关于assembly - ARM 调用约定是否允许函数不将 LR 存储到堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60927163/
我有一个 ASP.NET 网站,我希望只允许 AD 组中的用户访问该网站。我正在使用如下的 web.config 片段,但这似乎不起作用:
仅当选中所有框时才应禁用“允许”按钮。我该怎么做?我已经完成了 HTML 部分,如下所示。如何执行其中的逻辑部分?即使未选中一个复选框,也应禁用“允许”按钮
当前有一个Navigator.push(context,route),但是上下文部分返回了错误,在尝试调试后,我发现问题是因为我在调用一个函数而不是直接将home设置为widget树。但是现在我不确定
这是我的邮政编码正则表达式 ^[a-zA-Z0-9]{1,9}$ 但不允许 A-12345。如何更改 - 也将被允许的正则表达式? 最佳答案 在字符集的开头或结尾添加-([...]): ^[-a-zA
我目前正在建立我的网站,但遇到了一个问题 JavaScript 中的混合内容阻止 当我尝试加载和显示来自 的图像和页面时,Chrome、Mozilla 和 Explorer 会发生这种情况http 我
我见过使用: [mysqld] bind-address = 255.112.324.12 允许远程访问单个 IP。我如何允许从 mysql 远程访问所有 IP? 最佳答案 如果你想允许它用于所
我想知道是否可以使用模板实现某些功能。我想要做的是允许特定的“复制构造函数和赋值运算符”从一个模板到另一个模板并禁用其他模板。 我想我只完成了一件我想要的事情,所以我提供了下面的类(class)。对于
这个问题在这里已经有了答案: How to validate an email address in PHP (15 个答案) 关闭 2 年前。 正则表达式让我大吃一惊。我如何更改此设置以验证带有加
解析可以采用以下格式之一的日期的最佳方法是什么 "dd-MM-yyyy HH:mm" "dd/MM/yyyy HH:mm" "dd.MM.yyyy HH:mm" 无需创建 3 个 SimpleD
我们知道,下面的代码格式不正确,因为成员 x 在依赖的基类中。但是,将指定行上的 x 更改为 this->x 将修复错误。 template struct B { int x; }; tem
如果能帮助我理解“Java 并发实践”中的以下内容,我将不胜感激: Calling an overrideable instance method(one that is neither privat
此时如果上传一个不在预定义的安全扩展名列表,如.lrc,会报错: File type does not meet security guidelines. Try another. 解决此问题有
我有一个运行韵律,可以为我的几个域和一个 friend 域处理 XMPP。我 friend 域中的一位用户(他的妻子)想更改她的密码(实际上她忘记了她,所以我会用 prosodyctl 设置一个,然后
使用 nginx,您可以允许和拒绝范围和 ips (https://www.nginx.com/resources/admin-guide/restricting-access/)。使用realip模
什么是一些好的克里金法/插值想法/选项,可以让重度权重的点在绘制的 R map 上的轻权重点上流血? 康涅狄格州有八个县。我找到了质心并想绘制这八个县中每个县的贫困率。其中三个县人口稠密(约 100
我正在使用 virtualbox + ubuntu + vagrant . 但是我不能ping或 wget任何网址。请指导我如何允许虚拟机访问我的主机的互联网? 最佳答案 这对我有用。 使用此配置 V
标题可能有点令人困惑,所以让我向您解释一下。 在 Swift 中,我们可以拥有带有默认参数值的函数,例如: func foo(value: Int = 32) { } 我们也可以有 In-Out 参数
有TextView1 和TextView2。 TextView2 应该 float 在 TextView1 的右侧。只要两个 TextView 的总宽度不使 TextView2 与右侧的框重叠,Tex
使用 Magento 收集方法 addFieldToFilter 时是否可以允许按 NULL 值进行过滤?我想选择集合中具有自定义属性的所有产品,即使没有为该属性分配任何值。 最佳答案 您不需要使用
我正试图从 .htaccess 文件中的规则中“排除”一个目录(及其所有文件夹)... 不确定这是否可能? .htaccess 文件是这样的: Order Allow,Deny Deny from a
我是一名优秀的程序员,十分优秀!