Я использую сборку GNU, пытаюсь перебрать структуру C, связанную в списке, и найти определенное значение из одного из значений структур. Мне интересно, как мне добраться до указателя *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 файла main.
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
-S
, вы получите аннотированный вывод сборки с дополнительной информацией, такой как имена символов, которые объяснят, что такое$0x804861c
, и что это за бессмысленные строки компилятора (подсказка: это не чепуха). - person DCoder   schedule 07.10.2012