ARM汇编指针指向指针?
ARM assembly pointers to pointers?
假设我得到了一个函数 foo
的一些指针 *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()
以上内容应该可以从 'C' 使用大多数 ARM 编译器调用。
'C' 可以简化为,
void foo(struct CELL **pL)
{
(*pL)->next = NULL;
}
如果我没理解错的话
假设我得到了一个函数 foo
的一些指针 *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()
以上内容应该可以从 'C' 使用大多数 ARM 编译器调用。
'C' 可以简化为,
void foo(struct CELL **pL)
{
(*pL)->next = NULL;
}
如果我没理解错的话