我正在使用 GNU Assembly 尝试遍历 C 结构 Linked Listed 并从其中一个结构值中找到某个值。我想知道如何到达结构的 *next 指针以移动到下一个节点并检查值。下面是我编写的一些示例 C 代码以尝试和学习。
struct node{
struct node *next;
int id;
};
struct node *root;
void functionToBuildLinkList(){
//Code to malloc and link 4 nodes
}
int main(int argc, char *argv[]){
functionToBuildLinkList();
int valueOne;
rootPtr = rootPtr->next;
valueOne = rootPtr->id;
printf("The valueOne is: %i\n", valueOne);
return 0;
}
为了帮助自己弄清楚,我查看了 main 的 objdump。
mov 0x804a024,%eax //Moving the rootPtr->next address into eax
mov 0x4(%eax),%eax //Offset 4 bytes for id
mov %eax,0x804a024 //Compiler nonsense?
mov 0x804a024,%eax //Compiler nonsense?
mov (%eax),%eax //Moving the contents of EAX into EAX or more nonsense?
mov %eax,0x1c(%esp) //Moving id into the stack
mov $0x804861c,%eax //What address is being moved into EAX?
mov 0x1c(%esp),%edx //Moving id into edx
mov %edx,0x4(%esp) //Moving edx (id) into the stack
mov %eax,(%esp) //What's the address in EAX? The top of stack - ESP?
call 8048340 <printf@plt>
mov $0x0,%eax //Returning O
我有点被甩了,因为看起来编译器正在提供硬编码的内存地址。我怎么知道下一个内存地址或某些节点在哪里?当我通过在堆上分配内存来创建列表时,它是按顺序排列的,所以我可以尝试以这种方式计算它吗?我将如何通过列表工作?同样,当我将内存地址获取到结构的开头时,*next 指针是第一个成员变量,它不会有偏移(访问它)吗?任何帮助表示赞赏。
感谢大家的帮助!因此,使用示例代码中的全局指针根迭代列表将是:
movl root, %eax //Move root into EAX
movl (%eax), %eax //eax = eax->next