首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LDR -文本池- ARM

LDR -文本池- ARM
EN

Stack Overflow用户
提问于 2013-07-16 23:02:03
回答 2查看 3.2K关注 0票数 2

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

例如:

LDR R0,=0x0804c088此指令将值(0x0804c088)加载到寄存器r0。当我尝试访问该地址时,它存储在使用gdbx/x $r0中。我得到的消息是:Cannot access memory at address0x0804c088。但这不是地址,它是存储在该寄存器中的值,并且该地址是存储在文字池中的PC相对地址。

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

此外,我应该如何设置文字池,你能给我一个例子吗?

@Carl Norum:这是代码。

代码语言:javascript
复制
__asm__("LDR R0,=0x0804c088");
__asm__("LDR R1,[PC, #34];");

来自gdb的O/p

代码语言:javascript
复制
(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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-16 23:13:06

gdb x命令具有固有的取消引用操作。如果您想以r0格式打印值,只需使用p

代码语言:javascript
复制
p/x $r0

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

例如,让我们以这个简单的示例程序为例:

代码语言:javascript
复制
    .globl f
f:
    ldr r0,=0x12345678

然后构建并拆卸它:

代码语言:javascript
复制
$ 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

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

票数 1
EN

Stack Overflow用户

发布于 2013-07-17 19:34:41

如果您想在运行时知道文字池的实际地址,可以尝试这样做:

代码语言:javascript
复制
adr r12, literal_pool_label
.
.
. // your code here
.
.
.
literal_pool_label:
.ltorg

然后,您可以读取r12,它在运行时包含文字池的地址。

ltorg是一个强制放置文字库的指令。对于短代码,它们会自动附加在代码末尾,但如果代码大于4KB,LDR伪指令将在汇编时导致错误,因为pc相对偏移量大于4096,从而超出了允许的范围。

为了避免这种情况,您可以将ltorg middle放在代码中,这样就不会被误解为指令。(例如,在绝对分支之后)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17680185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档