繁体   English   中英

ARM汇编指针指向指针?

[英]ARM assembly pointers to pointers?

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

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

}

如何在ARM汇编中实现这一点? 问题来自于我想存储诸如以下内容的嵌套实例:

    .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.

顺序将类似于:

        ...                 ; 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

正确的顺序是(假设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与load / store交错以提高性能。 使用ARM ABI,无需保存即可使用R0-R3。 上面的foo()应该可以在大多数ARM编译器中从'C'调用。

“ C”可能会简化为

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

如果我理解正确的话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM