相关疑难解决方法(0)

ARMv6程序集中= label(等号)和[label](括号)之间有什么区别?

我正在跟随剑桥大学的Baking Pi课程,其中一个简单的操作系统是在ARMv6指令集中构建的,目标是Raspberry Pi.

ldr到目前为止,我们一直使用两种方法通过指令将数据加载到寄存器中,现在我意识到我正在使用它们,我不完全理解它们的作用.

所以我使用的东西ldr r0,=0x20200000,我实际上理解为"将存储在存储单元0x20200000的数据读入寄存器r0.

然后我用过以下的东西:

ldr r0,[r1,#4]
Run Code Online (Sandbox Code Playgroud)

我已经理解为"读取存储在r1指向的存储器地址的数据,以4字节的偏移量进入寄存器r0".

然后我遇到了这个:

ldr r0,=pattern
ldr r0,[r0]
Run Code Online (Sandbox Code Playgroud)

pattern这里是一个.int.data部分(表示接通/断开状态的用于LED的序列的位图).我在阅读本文时意识到,我之前的理解=foo一定是错的,否则上述两条指令都会做同样的事情.

=x语法基本都像在C的指针,而[x]语法如果被指向的内存x实际上是读?

让我们说ptr下面的C是一个int*,我的评论是否考虑等效组装(概念上,不是字面意思)有意义吗?

r0 = ptr;     /* equivalent to: ldr r0,=ptr     */
r0 = *ptr;    /* equivalent to: ldr r0,[ptr]    */
r0 = *(ptr+4) /* equivalent to: ldr r0,[ptr,#4] */
Run Code Online (Sandbox Code Playgroud)

assembly arm

17
推荐指数
1
解决办法
7101
查看次数

如何在arm asm上写PC相对地址?

我正在使用GNU AS作为汇编程序,我正在尝试编写与位置无关的二进制文件,并且在编写外部符号的PC相对地址时遇到了一些问题.Normaly是一个相对地址

adr r0, symbol
Run Code Online (Sandbox Code Playgroud)

但这仅适用于汇编文件中同一部分中定义的符号.另一种加载符号的方法是

ldr r0, =symbol
Run Code Online (Sandbox Code Playgroud)

它将符号的绝对地址存储在一个常量中,并从那里加载它的pc.所以你得到这样的代码:

  48:   e59f0008        ldr     r0, [pc, #8]    ; 58 <text+0xc>
  ...
  58:   00000008        .word   0x00200018
                        58: R_ARM_ABS32 symbol
Run Code Online (Sandbox Code Playgroud)

但我需要的是一个R_ARM_REL32链接器引用.

我想出的是这段代码:

tmp1:    ldr    r0, [pc, #tmp2 - tmp1 - 8]
         ldr    r0, [pc, r0]
tmp2:    .word  symbol - tmp1
Run Code Online (Sandbox Code Playgroud)

这会产生:

0000003c <tmp1>:
  3c:   e59f0000        ldr     r0, [pc]        ; 44 <tmp2>
  40:   e79f0000        ldr     r0, [pc, r0]

00000044 <tmp2>:
  44:   00000008        .word   0x00000008
                        44: R_ARM_REL32 symbol
Run Code Online (Sandbox Code Playgroud)

我几乎可以将它放入一个宏中,因此它可以重用于我需要的任何符号.除了我不知道如何告诉汇编程序tmp2需要转到常量块而不是在代码中间结束.

但是在GNU AS中是不是已经存在一些现有的语法或宏?

assembly arm

7
推荐指数
1
解决办法
2046
查看次数

装配中的重新安置

我有一个用于汇编的裸机ARM的启动代码,我试图了解它是如何工作的.二进制文件写在一些外部Flash中,并在启动时将其自身的一部分复制到RAM中.即使我读过这个维基百科条目,我仍然没有在这种情况下完全获得重定位的概念.RAM映射到低地址窗口,闪存在高地址窗口中.有人可以向我解释为什么我们在这里测试链接寄存器的值吗?

/* Test if we are running from an address, we are not linked at */
       bl check_position
 check_position:
        mov     r0, lr                  
        ldr     r1, =check_position
        cmp     r0, r1                  /* ; don't relocate during debug */
        beq     relocated_entry 
Run Code Online (Sandbox Code Playgroud)

assembly arm bare-metal

5
推荐指数
1
解决办法
1794
查看次数

将数据写入绝对地址

我目前正在 Cortex-M3 微控制器上使用汇编器。我不确定这是否重要,但就这样吧。

我需要将一个值写入内存中的某个地址。这是我尝试过的:

LDR     R4, =__cs3_interrupt_vector_cortex_m
STR     R4, [=VTOR]
Run Code Online (Sandbox Code Playgroud)

但似乎我需要引用相对于 PC 寄存器的 VTOR 地址。问题是是否有一种方法可以不引用相对地址并让它自动执行(这样它基本上看起来就像我的方法)。

我正在使用 GNU 汇编器。

assembly thumb cortex-m

2
推荐指数
1
解决办法
6724
查看次数

标签 统计

assembly ×4

arm ×3

bare-metal ×1

cortex-m ×1

thumb ×1