В сборке ARM инструкция BL правильно связывает меня с начальной процедурой, но указанный адрес всегда неверен - PullRequest
0 голосов
/ 08 октября 2019

Запуск этого кода после инициализации на Keil для TM4C1233H6PM в режиме THUMB:

1) loop1 2) BL loop2 3) MOV R3, #3 4) loop2 5) PUSH {LR} 6) POP {PC}

Линия (2) переводит меня в loop2 и сохраняет 0x00000381 в LR, но после выводав стек (6), в ПК хранится 0x00000380, который является адресом строки (3).

Почему ПК принимает 0x00000380, когда фактически 0x00000381 был помещен в стек и выдвинутиз этого?

1 Ответ

3 голосов
/ 08 октября 2019

Некоторые процессоры ARM Cortex-M могут выполнять либо код Thumb2, либо оригинальный код ARM, где все инструкции являются 32-битными. Поэтому, возвращаясь из подпрограммы, процессор должен знать, к какому типу кода он возвращается. Если младший бит адреса возврата установлен в 1, то процессор знает, что он возвращается к коду Thumb2.

Обратите внимание, что фактические инструкции должны быть выровнены по полуслову, поэтому истинный целевой адрес ветвления должен иметь младший бит0. После проверки LSB, чтобы увидеть, какой код выполнять, процессор заставляет LSB установить значение 0, прежде чем фактически извлечь инструкцию.

...