gpt4 book ai didi

c - LDR - 文字池 - ARM

转载 作者:太空宇宙 更新时间:2023-11-03 23:30:12 25 4
gpt4 key购买 nike

我知道如何在 ARM 中使用 LDR 指令加载立即数。

例如:

LDR R0,=0x0804c088该指令将值 (0x0804c088) 加载到寄存器 r0。当我尝试使用 gdb 访问存储在 x/x $r0 中的地址时。我收到消息:无法在地址访问内存0x0804c088。但这不是地址,它是存储在该寄存器中的值,地址是存储在文字池中的 PC 相对地址。

我在那里做错了什么?我是不是理解错了什么?

另外,文字池应该怎么设置,能举个例子吗?

@Carl Norum:这是代码。

__asm__("LDR R0,=0x0804c088");
__asm__("LDR R1,[PC, #34];");

来自 gdb 的 O/p

(gdb) info registers
r0 0x804c088 134529160
r1 0xf2c00300 4072669952
r2 0x0 0
r3 0x1 1
r4 0x8961 35169
r5 0x0 0
r6 0x0 0
r7 0xbe8f4b74 3197062004
r8 0x0 0
r9 0xef99 61337
r10 0xf00d 61453
r11 0x0 0
r12 0x0 0
sp 0xbe8f4b74 0xbe8f4b74
lr 0x89a7 35239
pc 0x8a62 0x8a62 <test46+34>
cpsr 0x60000030 1610612784
(gdb) x/x $r0
0x804c088: Cannot access memory at address 0x804c088
(gdb) p/x$r0
$1 = 0x804c088
(gdb) p/x $r1
$2 = 0xf2c00300
(gdb) x/x $r1
0xf2c00300: Cannot access memory at address 0xf2c00300
(gdb) x/x $r15
0x8a62 <test46+34>: 0x1022f8df

最佳答案

gdb x 命令有一个固有的解引用操作。如果要打印 r0 中的值,只需使用 p:

p/x $r0

您使用的 LDR 形式不是真正的指令 - 它是一个汇编器宏指令,它被转换成一个 pc-relative ldr 指令和一个内存中某处的文字值(可能靠近您使用它的位置)。如果要在文字池中找到常量的地址,则需要查看输出二进制文件。您的源汇编代码不包含它。

例如,让我们来看这个简单的示例程序:

    .globl f
f:
ldr r0,=0x12345678

然后构建和反汇编它:

$ arm-none-eabi-clang -c example.s 
$ arm-none-eabi-objdump -d example.o

example.o: file format elf32-littlearm


Disassembly of section .text:

00000000 <f>:
0: e51f0004 ldr r0, [pc, #-4] ; 4 <f+0x4>
4: 12345678 .word 0x12345678

您可以看到文字就在偏移量 4 处。

您不需要做任何事情来“设置文字池”。汇编程序将为您设置任何必要的文字。

关于c - LDR - 文字池 - ARM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17680185/

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