Зачем отображать PUSH, а не STM, когда процессор находится в режиме ARM? - PullRequest
0 голосов
/ 19 февраля 2019

Я отлаживаю в Code Composer Studio от Texas Instruments и заметил, что в представлении дизассемблирования отображается инструкция push , когда процессор находится в режиме ARM .

Согласно Инструкции по сборке ARM и Thumb :

PUSH Переносит несколько регистров в стек в состоянии Thumb (для состояния ARM используется STM)

Q1: Почемувместо STM отображается инструкция push?

Я также заметил, что перед запуском программы значение указателя стека уже было установлено.

Q2: Значение указателя стека определяется кем?

Программа:

int main(void)
{   // program stops here

    OS_ERR  err = OS_ERR_NONE;

    /*rest of code are omitted*/
}

Разборка:

          main():
805dce18:   E92D4008            push       {r3, lr}
17          OS_ERR  err = OS_ERR_NONE;
805dce1c:   E3A0C000            mov        r12, #0
805dce20:   E58DC000            str        r12, [sp]

Регистры:

Name    Value            Description

CPSR    0x6000019F       current program status registers
   T    0                If set ARM is in Thumb mode



  SP    0x88000F30       stack pointer

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Для Q1) Обратите внимание, что ссылка, которую вы дали, предназначена для Архитектура ARMv6 .Будьте осторожны, если ваша ситуация сохраняется в этом случае.

Кроме того, Информационный центр по вооружению дает ответ:

PUSH является синонимом STMDB sp !,reglist и POP - это синоним для LDMIA sp!reglist.PUSH и POP являются предпочтительными мнемониками в этих случаях.

Если вы хотите проверить всю дискуссию по этому вопросу, пожалуйста, обратитесь к здесь в дискуссионном форуме TI.

0 голосов
/ 19 февраля 2019

Для Q2) Местоположение инициализации Stack Pointer находится в вашем двоичном файле.Первые четыре байта в вашем выходном двоичном файле обозначают местоположение, в которое должен быть инициализирован указатель стека.Вы можете изменить это значение, а также размер стека в файле компоновщика.

...