2013-10-02 2 views
0

Использование флага -S в gcc Я создал файл сборки из моего кода на C и чтобы лучше понять, как используется память. Вот некоторые сборки из верхней части главной функции:Как работает указатель кадра на MSP430 и что делает макрос `# llo`?

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

Макрос llo возвращает младшие 16 бит аргумента. Я думаю, что это нужно, чтобы избежать переполнения при использовании отрицательного числа (или компилятор ленив).

Похоже, что код вычисляет местоположение какого-либо объекта в R15. Трудно сказать только с частью кода ... Кроме того, если R4 больше не использует функцию, этот код может быть оптимизирован очень сильно.

Линия add #llo(-14), r1 выделяет пространство в стеке.

Было бы интересно посмотреть, что делают другие компиляторы с таким кодом (gcc для MSP430 на самом деле не является современным).

+0

Чтение остальной части кода r15 используется для удержания расстояния от вершины стека до указателя кадра и позднее добавляется обратно в указатель стека. Это кажется бессмысленным, потому что вы не можете просто сбросить указатель стека на указатель кадра. С помощью этого метода, в чем смысл даже иметь указатель на фрейм? Все флаги оптимизации отключены с помощью этого кода, я включу некоторые из них и посмотрю, как это изменится. – tylerjw