Поскольку у 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