【发布时间】:2019-10-10 07:41:12
【问题描述】:
我来自这个question
第二个答案有以下代码:
> arm-none-eabi-gcc -march=armv6-m \
-mcpu=cortex-m0 \
-mthumb \
-Os \
-c \
-o test.o \
test.c
> arm-none-eabi-objdump -dr test.o
00000000 <queue_empty>:
0: 4b03 ldr r3, [pc, #12] ; (10 <queue_empty+0x10>)
2: 6818 ldr r0, [r3, #0]
4: 685b ldr r3, [r3, #4]
6: 1ac0 subs r0, r0, r3
8: 4243 negs r3, r0
a: 4158 adcs r0, r3
c: 4770 bx lr
e: 46c0 nop ; (mov r8, r8)
10: 00000000 .word 0x00000000
10: R_ARM_ABS32 .bss
> arm-none-eabi-nm -S test.o
00000000 00000004 b head
00000000 00000014 T queue_empty
00000004 00000004 b tail
第一季度:
第一条指令是 ldr r3, [pc, #12]
pc 寄存器是程序计数器,下一条指令地址应该是 (0x2) + offset #12
这将是 #14 或 0xE ...
它是如何被注释为 0x10 的?
第二季度:
我们正在将内存地址 () 中的值加载到 R3
我可以在这里看到:10: 00000000 .word 0x00000000 等于 0。
R3 = 0。
然后我们将值加载到 R3 的地址中(即 0x0)。 那不是:它自己的函数地址相同吗?
0: 4b03 ldr r3, [pc, #12] ; (10 <queue_empty+0x10>)
-^ 这个地址 0
第三季度: 直接加载数据不是更快更小的代码,因为这个 bss 部分已经在小内存值中了吗?
【问题讨论】:
-
请参阅:-msingle-pic-base、-mpic-data-is-text-relative 和 -mpic-data-is-text-relative。 ARM 寻址模式没有绝对寻址;您必须先将常量加载到寄存器中。请参阅:arm constants blog 以及,static shared libraries。虽然下面的答案是重复的,但我认为您的 Q/A 更多的是如何不使用常量..esp Q3。
-
请参阅:Cortex-M and busybox 其中一些寻址考虑因素由于 Cortex-M 和 Linux 基础结构而发挥作用,系统性能不佳,可能假设 MMU 系统具有性能但仍然可以工作(很差) 没有一个。使用“PIC base”进行寻址的系统将在 Cortex-M 上运行得更好。
-
一种解决方案,将 R9 专用于“静态基础”,在引导时指向 DTCM,并设置链接器文件和引导代码以实现此目的。您还可以插入 R9 将更改并重新使用“.text”的上下文切换;上面“静态共享库”的一部分。