【问题标题】:understanding the addressing offset in ASM [duplicate]了解 ASM 中的寻址偏移量 [重复]
【发布时间】: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 &lt;queue_empty+0x10&gt;)
-^ 这个地址 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”的上下文切换;上面“静态共享库”的一部分。

标签: assembly arm


【解决方案1】:
  1. pc 比当前指令执行提前 两 步(因此是 4,而不是 2)
  2. 值 0 在链接时被替换。它可能是在不同文件中定义的全局变量。 (指向结构的指针)
  3. 见 2

【讨论】:

  • 1.所以下一个执行指令是 = PC - 2 ?因为PC指向下一条指令的下一条? ..
  • @Hasanalattar 没错。
  • 3.抱歉,我的问题不清楚,为什么链接器不使用直接寻址模式,因为大多数 bss 数据都在小内存中,我们可以在小地址(不是 32 位)中寻址它们。所以(ldr 直接到内存地址)...
  • @Hasanalattar 因为它是一个变量。
  • 据我了解,对于基于堆栈的变量而不是全局变量和常量(.bss + 数据)来说,这将是 变量地址?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多