在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是堆栈指针。
答案 0 :(得分:0)
llo
宏返回它的参数的低16位。我想这是需要它来避免使用负数时溢出(或编译器是懒惰的)。
看起来代码计算R15中某个对象的位置。只有部分代码很难说明...而且,如果R4在函数中没有使用更多,这段代码可以进行很多优化。
行add #llo(-14), r1
在堆栈上分配空间。
看看其他编译器用这样的代码做什么会很有趣(MSP430的gcc并不是最先进的技术)。