【问题标题】:What is the use of arm-none-eabi-ld -Ttext=0x20 -o add.elf add.oarm-none-eabi-ld -Ttext=0x20 -o add.elf add.o有什么用
【发布时间】:2020-07-30 14:46:33
【问题描述】:

我正在练习汇编编程,我的疑问是 arm-none-eabi-ld -Ttext=0x20 -o add.elf。标签从 0x20 到 0x2C 获取地址,因为有 4 条指令,每条指令是 4 个字节。程序计数器包含要获取的指令的地址,这里 R15 是 PC,它包含值 0x0C。它如何保存 0x0C,它应该有地址 0x2C。那么arm-none-eabi-ld -Ttext=0x20 -o add.elf有什么用,将文本部分放在0x20。我是菜鸟,所以如果用简单的术语和逐步的解释会很有帮助。

  1. arm-none-eabi-as add.s -o add.o
start:   
  mov r0, #5
  mov r1, #2
  add r2, r1, r0
stop:
   b stop

arm-none-eabi-ld -Ttext=0x20 -o add.elf.

user@stretch:~/Desktop/Gnu_Toolchain/Adding_Two_Numbers$ arm-none-eabi-nm -n add.elf
         U _start
**00000020** t start
0000002c t stop

qemu-system-arm -M connex -pflash flash.bin -nographic -serial /dev/null

info registers
R00=00000005 R01=0000000c R02=00000011 R03=00000000
R04=00000000 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=00000000 R11=00000000
R12=00000000 R13=00000000 R14=00000000 **R15=0000000c**

【问题讨论】:

  • 不清楚你是如何运行代码的。也许您将它加载到地址为零,即使它链接到0x20

标签: assembly arm microcontroller microprocessors


【解决方案1】:
start:
  mov r0, #5
  mov r1, #2
  add r2, r1, r0
stop:
   b stop


arm-none-eabi-as so.s -o so.o
arm-none-eabi-ld -Ttext=0x20 -o add.elf
arm-none-eabi-ld: no input files
arm-none-eabi-ld -Ttext=0x20 so.o -o add.elf
arm-none-eabi-ld: warning: cannot find entry symbol _start; defaulting to 0000000000000020
arm-none-eabi-objdump -d add.elf

add.elf:     file format elf32-littlearm


Disassembly of section .text:

00000020 <start>:
  20:   e3a00005    mov r0, #5
  24:   e3a01002    mov r1, #2
  28:   e0812000    add r2, r1, r0

0000002c <stop>:
  2c:   eafffffe    b   2c <stop>

所以你在你的问题中遗漏了一些东西,你没有显示 _start 的定义,你的命令行不完整等等。

我看不出 nm 的转储寄存器与任何东西有什么关系,或者为什么这甚至是 nm 会输出的东西。 -Ttext=0x20 的意思是您告诉链接器该代码将被放置在地址 0x20 的处理器内存空间中,因此它需要链接该地址的代码。该分支是相对于 pc 的,因此它与位置无关,因此对于此示例,您最终会得到相同的机器代码,而与此代码所在的地址无关。

当您执行此代码时(nm 不执行代码)并且如果此代码在您指定的内存中,则例如分支将开始执行,PC 设置为 0x2C+8 = 0x34 并在执行分支 0x2C 之后.了解程序计数器是一个伪寄存器,本质上有多个程序计数器,一个用于在执行期间进行数学运算,一个用于获取,一个用于可能的分支目标,还有一个用于在调试器中转储寄存器时看到。

但要查看其中的任何内容,您需要实际运行它并使用停止执行和检查寄存器的工具。要正确地做到这一点,您需要将它的内存放在链接地址并在那里运行。您无法从二进制文件中静态地看到任何内容。

【讨论】:

  • 谢谢先生,你真的是我的守护天使。
猜你喜欢
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
相关资源
最近更新 更多