- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在试图分析通过msp430 gcc生成的简单程序集文件时,我无意中发现了一组指令,我不理解如何处理帧指针和msp430的堆栈指针。
C程序:
#include "msp430g2553.h"
int main()
{
int i;
for(i = 0; i < 3; i++);
}
main:
mov r1, r4 ;Stores address of stack pointer in r4(frame pointer)
add #2, r4 ; ?
sub #2, r1 ; subtract 2 to allocate int i
mov #0, -4(r4) ; assign 0 to i
jmp .L2 ; start loop
.L3:
add #1, -4(r4) ; Adds one to int i
.L2:
cmp #3, -4(r4) ; Compare to #3
jl .L3 ; jump to .L3 if true
add #2, r1 ; deallocate int i
.Lfe1:
.size main,.Lfe1-main
add #2, r4
这一行这里到底发生了什么,为什么
int i
被引用到
-4(r4)
?
最佳答案
通常,在函数中要做的第一件事是:
push r4
push
将自动将堆栈指针减小2,因此在执行此操作时:
mov r1, r4
r4
上的地址将高于刚才推到堆栈上的值(这里是“上面”,意思是堆栈向下增长,实际上是数字内存地址的下面)您将希望帧指针实际指向您刚刚推送到堆栈上的值的下方,因此您将它增加两个值以实现此目的:
add #2, r4
main()
是执行的第一个函数,所以没有保存的现有框架指针,所以你在这里看到的是
mov
和
add
没有的
push
。
push r4
mov r1, r4
add #2, r4
-2(r4)
将引用刚才推送到堆栈上的帧指针的上一个值,并且由于尚未向堆栈指针的值添加两个值,
-2(r4)
也将等于该值。
i
以腾出空间,因此
2
的地址将为
i
。
-4(r4)
,而帧指针包含
0x200
,然后要调用函数从这样的堆栈开始:
r4 --> 0x202 ---------------------
<empty>
r1 --> 0x200 ---------------------
0x202
之后,值
push r4
被推送到内存位置
0x202
(即由
0x200
指向的堆栈顶部),堆栈指针被
r1
递减以腾出空间,因此您可以:
r4 --> 0x202 ---------------------
<empty>
0x200 ---------------------
0x202
r1 --> 0x1FE ---------------------
2
中来开始此操作,然后得到:
0x202 ---------------------
<empty>
0x200 ---------------------
0x202
r1 == r4 --> 0x1FE ---------------------
r4
在此之前指向,而不是在它之后指向为此,将
r4
添加到
2
,您将得到:
0x202 ---------------------
<empty>
r4 --> 0x200 ---------------------
0x202
r1 --> 0x1FE ---------------------
r4
指向堆栈帧的底部,而
r4
指向堆栈帧的顶部,这是您想要的位置此时,当前堆栈帧中唯一实际存在的是在函数开始时推送到它上面的帧指针的上一个值。
r1
以腾出空间给新的局部变量,最后得到:
0x202 ---------------------
<empty>
r4 --> 0x200 ---------------------
0x202
0x1FE ---------------------
<uninitialized i>
r1 --> 0x1FC ---------------------
2
存储在
i
中,即
0x1FC
再次指出,您所处的位置
-4(r4)
指向堆栈帧的底部,
r4
指向堆栈帧的顶部,但现在您在当前堆栈帧中有两个16位值,因此两个指针相距4字节。
r1
来“释放”局部变量
add #2, r1
的内存这将给你:
0x202 ---------------------
<empty>
r4 --> 0x200 ---------------------
0x202
r1 --> 0x1FE ---------------------
i
,它将从堆栈中弹出最后一个值(现在是帧指针的原始值
pop r4
),将其放入
0x202
,并将堆栈指针增加
r4
,以反映该值已从堆栈中删除,这将使您处于:
r4 --> 0x202 ---------------------
<empty>
r1 --> 0x200 ---------------------
关于c - MSP430程序集堆栈指针行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26374287/
附上一张照片来解释这个概念,但本质上,我想要一个背景视频或图像,上面有多个 png 像这样分层。 我将如何实现这一目标?我觉得 jit.alphablend 是这个的一个组成部分...... 我也在
我一直在阅读 hyperledger 织物的文档,但我被困在了一些东西上。这一段实际上是什么意思: “ channel 和本地 MSPs 之间的拆分反射(reflect)了组织管理其本地资源(例如对等
我用 Advanced Installer 创建了一个补丁通过使用旧的(目标镜像)msi 和新的(升级镜像)。检查 MSP 文件我发现它包含修改过的和全新的文件。问题是在安装过程中它只安装“添加”的文
我已经在Apple的论坛上阅读了许多帖子,在Cycling '74的论坛上也阅读了很多帖子(我自己的问题都散布在两个论坛上),而且似乎没有人可以帮助我。 我用Max / MSP编写了一个“样本”来采样
对于背景:我有一个非常好的 TeamCity 设置;包含一个 ci 构建和一个使用 WiX 构建我的安装程序并修补所有版本号的发布构建。当我进行新版本构建时,我想针对以前的一组安装程序自动创建 MSP
我正在尝试构建 Microsoft 安装程序更新 (MSP),我希望更新安装程序从原始安装中删除文件。 我已经成功创建了一个新的 msi,在 Orca.exe 中查看时,我可以看到 RemoveFil
我们的团队最近一直在考虑向用户推出一个小的注册表修复程序,以修改一个特定的有问题的 key 。非常简单的东西,只需要更新注册表中的 1 个键/值。 所以目前,我们正在使用 Wix 为产品构建 .msi
我正试图帮助一个 friend 弄清楚是否可以在 Max/MSP javascript 中实现 DSP 算法。他在类里面被告知,他向我寻求帮助,但我找不到任何方法来处理实际 sample 。 长话短说
我正在开发压力测量装置。我使用过 MSP430F133 芯片并使用 IAR 嵌入式工作台。它以 3 个不同的单位显示压力。 我取了 32 个样本并取平均值。 P5上的单位选择,根据选择的单位计算输出值
friend 们,我必须使用计时器输入(项目要求)在 61 微秒插槽中每 14 微秒采样一次输入。 我必须做 8 次才能生成一个字节。更像 UART ,但我将它用于我的硕士项目的单线总线通信。 我编写
Fabric CA 是 MSP 的实现吗? MSP 本身就没有用吗? MSP 和 Fabric CA 的作用是什么?这些功能的区别? 最佳答案 MSP是成员(member)服务提供者 - 支持各种凭证
Steven S. Skiena 在他的算法设计手册一书中提出了以下问题: Now consider the following scheduling problem. Imagine you are
目前我正在开发一个使用 MSI 包部署的项目。要修补该程序,我们只需部署另一个 MSI 安装程序包而不是 MSP。这是解决此问题的有效/高效方法,还是我们应该部署 MSP 补丁包?我有过 MSI 但没
我正在构建一个 Excel 仪表板,我希望它从我的部门 MSP 总体规划中获取数据。 到目前为止,我设法获得了我想要的所有数据,除了子项目的状态日期。 Sub ImportMSPData() Dim
我正在使用带有 MSP-GCC 编译器的最新 CCS。代码如下 #pragma vector=USCI_A1_VECTOR __interrupt void USCI_A1_ISR(void) {..
我应该把 .js 文件放在 Max 的什么地方? 我目前正在使用 Cycling 论坛上此线程的帮助将飞利浦 Hue 照明与 Max 7 链接起来。 https://cycling74.com/for
我一直在阅读 ARM 信息中心的各个部分,试图找到答案,但是文档让我感到困惑,所以我希望这里有人可以提供帮助。 据我所知,Cortex-M 处理器中有两个堆栈: MSP(主堆栈指针) PSP(进程堆栈
我正在 OS X 上尝试 first-network 演示,但出现以下错误。我试过寻找答案。我确实在这里找到了一个,但它似乎适用于 Ubuntu。所有命令都不适用于 OS X。 任何人都可以在 OS
在阅读有关 Hyperledger Fabric 的文档时,我无法理解 MSP 是什么。我真的不清楚 MSP 到底是什么以及它与 CA 有何不同? 我的理解是 CA 颁发证书,MSP 说其中哪些是有效
我使用 TI UniFlash 云工具成功上传了 MSP430G2553 的 Mecrisp Forth 十六进制文件。 (我也使用相同的工具为 MSP430F5529 和 TI Tiva Launc
我是一名优秀的程序员,十分优秀!