使用gcc中的-S标志,我从C代码创建了一个程序集文件,以便更好地了解内存的使用方式。这是主要功能顶部的一些装配:

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是堆栈指针。

最佳答案

llo宏返回其参数的低16位。我想这是需要的,以便在使用负数时避免溢出(否则编译器是惰性的)。

看起来该代码计算了R15中某个对象的位置。仅使用部分代码很难说清楚...而且,如果R4在函数中的使用量不大,则可以对该代码进行很多优化。

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

看看其他编译器如何处理这种代码(MSP430的gcc并不是真正的最新技术)会很有趣。

07-26 09:29