【问题标题】:How does the frame pointer work on the MSP430 and what does the `#llo` macro do?帧指针在 MSP430 上是如何工作的?`#llo` 宏有什么作用?
【发布时间】:2013-10-02 07:28:49
【问题描述】:

使用 gcc 中的 -S 标志,我从我的 C 代码创建了一个汇编文件,以便更好地了解内存的使用方式。这是 main 函数顶部的一些程序集:

main:
    mov r1, r4          ; FP = SP
    add #2, r4          ; FP += 2
    add #llo(-14), r1           ; SP -= 14 ?
    mov #llo(-16), r15          ; ???
    add r4, r15         ; r15 += FP
    add #4, r15

当我试图剖析正在发生的事情时,我发表了评论。我的问题是#llo 宏的使用,以及堆栈上的内存是如何使用的,最后是什么进入 r15?

对于上下文,我有一个变量,包括一个结构,该结构位于 main 开头的堆栈中,占用 14 个字节(7 个 16 位字)。我不明白#llo 宏是什么以及 r15 的用途是什么?我知道 r4 是帧指针,r1 是堆栈指针。

【问题讨论】:

    标签: c assembly msp430


    【解决方案1】:

    llo 宏返回其参数的低 16 位。我想这是在使用负数时需要它来避免溢出(或者编译器是懒惰的)。

    看起来代码计算了 R15 中某个对象的位置。只用部分代码很难说……另外,如果R4在函数中不使用更多,这段代码可以优化很多。

    add #llo(-14), r1 行在堆栈上分配空间。

    看看其他编译器如何处理这样的代码会很有趣(MSP430 的 gcc 并不是最先进的)。

    【讨论】:

    • 读取其余代码 r15 用于保存从栈顶到帧指针的距离,稍后会添加回栈指针。这似乎毫无意义,因为您不能将堆栈指针重置为帧指针。使用这种方法,即使有一个帧指针又有什么意义呢?这段代码关闭了所有优化标志,我将打开其中一些,看看它是如何变化的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    相关资源
    最近更新 更多