gpt4 book ai didi

gcc - 使用 Arm GNU 汇编器弹出推送

转载 作者:行者123 更新时间:2023-12-04 10:14:10 25 4
gpt4 key购买 nike

我正在使用 TM4C123 评估板(基于 cortex M4f)并尝试使用不同的工具链编译项目。
GCC 汇编程序为这些指令生成错误,我无法解析或使用不同的指令:

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时是可以接受的
你能帮忙或引用任何替代说明吗?

最佳答案

作为 cortex-m 有一些限制:请先阅读文档,包括处理器内核和汇编器。汇编语言是由汇编器、工具而非目标定义的;没有理由假设对于相同的目标汇编语言可以跨工具移植。
在文档中的普通拇指 T1 编码中,您只能推送 m4 支持 r0-r12 的 r0-r7、T2,而 T3 一次用于一个寄存器,也推送 m4 支持的拇指 2。然后PC和LR在那里混合。您的反汇编显示什么以及您使用什么命令来构建它?你指定了什么cpu?

.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}'
并且该工具会告诉您问题,因此请参阅指令集文档以找出您做错了什么。
现在我不喜欢使用统一语法,并且通常不会在 asm 中编写 thumb2 指令,但是如果是这样,那么对于 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'
加上 cpu 可以使用拇指 2 指令,并再次阅读该工具告诉您的内容
.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 为您提供等效项。 (push 和 pop 是拇指中的伪指令,它们真的是 stm/ldm,就像全尺寸的 ARM 一样)
对于笑容:
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

关于gcc - 使用 Arm GNU 汇编器弹出推送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61163653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com