Pop Pu sh Использование Arm GNU ассемблер - PullRequest
0 голосов
/ 12 апреля 2020

Я использую оценочную плату TM4C123 (на базе Cortex M4f) и пытаюсь скомпилировать проект, используя различные наборы инструментов. G CC Ассемблер генерирует ошибку для этих инструкций, которую я не смог разрешить или использовать другие инструкции:

POP     {R4-R11}
POP     {R12}
POP     LR 
STMDB   R2!, {R4 - R11}    @ Stacking R4-->R11
LDMIA   R2!, {R4 - R11}    @ unStacking R4-->R11 

Известно, что инструкция POP была приемлемой при использовании для вызова R0-R3 или R12. помочь или обратиться к альтернативным инструкциям?

1 Ответ

1 голос
/ 12 апреля 2020

Поскольку у cortex-m есть ограничения, сначала прочтите документацию. как для ядра процессора, так и для ассемблера. Язык ассемблера определяется ассемблером, инструментом, а не целью. Нет оснований предполагать, что для одной и той же целевой языки ассемблера переносимы между инструментами.

При обычном кодировании большого пальца T1 в документах вы можете только pu sh r0-r7, T2, который поддерживает m4, r0-r12, и T3 для одного регистра за раз также thumb2, который поддерживает m4. Тогда P C и LR смешиваются там. Что показывает ваша разборка и какие команды вы используете для ее сборки? какой процессор вы указали?

.cpu cortex-m4
.thumb
POP     {R4-R11}
POP     {R12}
POP     LR
STMDB   R2!, {R4 - R11}    @ Stacking R4-->R11
LDMIA   R2!, {R4 - R11}    @ unStacking R4-->R11

arm-none-eabi-as so.s -o so.o
so.s: Assembler messages:
so.s:4: Error: invalid register list to push/pop instruction -- `pop {R4-R11}'
so.s:5: Error: invalid register list to push/pop instruction -- `pop {R12}'
so.s:6: Error: expression too complex -- `pop LR'
so.s:7: Error: lo register required -- `stmdb R2!,{R4-R11}'
so.s:8: Error: lo register required -- `ldmia R2!,{R4-R11}'

затем

.cpu cortex-m4
.thumb
POP     {R4,R5,R6,R7,R8,R9,R10,R11}
POP     {R12}
POP     LR
STMDB   R2!, {R4,R5,R6,R7,R8,R9,R10,R11}    @ Stacking R4-->R11
LDMIA   R2!, {R4,R5,R6,R7,R8,R9,R10,R11}    @ unStacking R4-->R11

so.s: Assembler messages:
so.s:4: Error: invalid register list to push/pop instruction -- `pop {R4,R5,R6,R7,R8,R9,R10,R11}'
so.s:5: Error: invalid register list to push/pop instruction -- `pop {R12}'
so.s:6: Error: expression too complex -- `pop LR'
so.s:7: Error: lo register required -- `stmdb R2!,{R4,R5,R6,R7,R8,R9,R10,R11}'
so.s:8: Error: lo register required -- `ldmia R2!,{R4,R5,R6,R7,R8,R9,R10,R11}'

, и инструмент сообщит вам о проблемах, поэтому обратитесь к документации по набору инструкций, чтобы узнать, что вы сделали не так.

Теперь я предпочитаю не использовать унифицированный синтаксис и обычно не пишу инструкции thumb2 в asm, но если это так, то для gnu вам действительно следует установить унифицированный синтаксис.

.cpu cortex-m4
.syntax unified
.thumb
POP     {R4,R5,R6,R7,R8,R9,R10,R11}
POP     {R12}
POP     LR
STMDB   R2!, {R4,R5,R6,R7,R8,R9,R10,R11}    @ Stacking R4-->R11
LDMIA   R2!, {R4,R5,R6,R7,R8,R9,R10,R11}    @ unStacking R4-->R11

arm-none-eabi-as so.s -o so.o
so.s: Assembler messages:
so.s:7: Error: expression too complex -- `pop LR'

, который плюс процессор позволяет использовать инструкции thumb2, и снова прочитайте, что говорит вам инструмент

.cpu cortex-m4
.syntax unified
.thumb
POP     {R4,R5,R6,R7,R8,R9,R10,R11}
POP     {R12}
POP     {LR}
STMDB   R2!, {R4,R5,R6,R7,R8,R9,R10,R11}    @ Stacking R4-->R11
LDMIA   R2!, {R4,R5,R6,R7,R8,R9,R10,R11}    @ unStacking R4-->R11

00000000 <.text>:
   0:   e8bd 0ff0   ldmia.w sp!, {r4, r5, r6, r7, r8, r9, r10, r11}
   4:   f85d cb04   ldr.w   r12, [sp], #4
   8:   f85d eb04   ldr.w   lr, [sp], #4
   c:   e922 0ff0   stmdb   r2!, {r4, r5, r6, r7, r8, r9, r10, r11}
  10:   e8b2 0ff0   ldmia.w r2!, {r4, r5, r6, r7, r8, r9, r10, r11}

Обратите внимание, что инструмент выбрал, чтобы дать вам эквивалент, используя ldr вместо pop. (pu sh и pop - это псевдоинструкции большого пальца, они действительно являются stm / ldm, как полноразмерная рука)

Для ухмылок:

push {r0,lr}
push {r0,r1}
pop  {r0,pc}
pop  {r0,r1}

  14:   b501        push    {r0, lr}
  16:   b403        push    {r0, r1}
  18:   bd01        pop {r0, pc}
  1a:   bc03        pop {r0, r1}

, поэтому биты M / P в Кодировка действительно используется для pc / lr

...