使用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并不是真正的最新技术)会很有趣。