【问题标题】:ARM assembly pointers to pointers?ARM汇编指针指向指针?
【发布时间】:2015-04-07 22:33:53
【问题描述】:

假设我被作为函数foo 的输入给定了一些指针*pL,它指向一个指向结构体的指针,该结构体中包含一个指针字段。我知道这很奇怪,但我想在汇编中实现的只是带有 ** 的代码行:

typedef struct CELL *LIST;
struct CELL {
  int element;
  LIST next;
};
void foo(LIST *pL){
**(*pL)->next = NULL;**

}

如何在 ARM 程序集中实现这一点?问题来自我想存储时嵌套的startements,例如:

    .irrelevant header junk
foo:
    MOV R1, #0
    STR R1, [[R0,#0],#4]  @This is gibberish, but [R0,#0] is to dereference and the #4 is to offeset that.

【问题讨论】:

  • 这是汇编语言。你必须把它分解成更小的步骤。
  • 你有一个东西的地址。从那个东西,你可以加载不同的东西的地址。这样做,你就有了一个东西的地址......对于 n 级的指针,它并不比重复相同的基本操作 n 次更困难,直到你得到您关心的地址。

标签: c pointers assembly arm


【解决方案1】:

顺序类似于:

        ...                 ; r0 = LIST *pL = CELL **ppC (ptr2ptr2cell)
        ldr     r0,[r0]     ; r0 = CELL *pC (ptr2cell)
        mov     r1,#0       ; r1 = NULL
        str     r1,[r0,#4]  ; (*pL)->next = pC->next = (*pC).next = NULL

【讨论】:

  • @artlessnoise - 已修复。
  • ptr2ptr2node 是什么意思?地址?
  • @psmears - 我更新了答案,假设 r0 以 CELL ** 开头,我将其称为 ptr2ptr2cell 作为示例代码。我的示例现在与无艺术噪音的答案基本相同。
【解决方案2】:

正确的顺序是(假设 ARM ABI 和 LIST *pL 在 R0 中),

.global foo
foo:
     ldr r0, [r0]      # get *pL to R0
     mov r1, #0        # set R1 to zero.
     str r1, [r0, #4]  # set (*pL)->List = NULL;
     bx  lr            # return

您可以交换前两个汇编程序语句,但通常最好将 ALU 与加载/存储交错以提高性能。使用 ARM ABI,您无需保存即可使用 R0-R3。上面的foo() 应该可以使用大多数 ARM 编译器从“C”调用。

“C”可以简化为,

void foo(struct CELL **pL)
{
   (*pL)->next = NULL;
}

如果我理解正确的话。

【讨论】:

  • 汇编示例中的注释不应该是 (*pL)->next = NULL(而不是 (*pL)->List) 吗?
  • 是的,放在那里看看有没有人注意 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多