私は GNU Assembly を使用して、C struct Linked Listed を反復処理し、構造体の値の 1 つから特定の値を見つけようとしています。次のノードに移動して値を確認するために、構造体の *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;
}
自分でそれを理解するのを助けるために、メインの 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