2016-12-12 3 views
0
typedef struct { 
    char array[B];  
    int t;    
    short s[B];  
    int u;    
} str2; 

typedef struct { 
    short x[A][B]; 
    int y;   
} str1;   

void setVal{str1* p, str2 *q) { 
    int v1 = q->t;     
    int v2 = q->u; 
    p->y = v1+v2; 
} 
movl 12(%ebp), %eax 
movl 40(%eax), %edx 
addl 12(%eax), %edx 
movl 8(%ebp), %eax 
movl %edx, 96(%eax) 

У меня возникают проблемы с пониманием IA32 код. Я понимаю, что первая команда movl указывает% eax = q, а четвертая команда movl указывает% eax = p, но я не понимаю, что означает вторая, третья и пятая команды. Я думаю, что вторая инструкция означает, что q + B (char 1byte) = q + 40. Правильно ли это?Что делает этот код для определения размера массива?

ответ

1

Вторая и третья инструкции действуют на значение eax, которое содержит значение q.

Вторая инструкция получает значение в ячейке памяти, на которую указывает q плюс 40 байт. Смещение добавляется, потому что смещение ссылочного элемента struct составляет 40 байт.

Третья инструкция добавляет другой элемент, в основном вычисляя выражение v1+v2. Опять же, eax (содержащий значение q) указывает на str2, а смещение 12 является смещением в этом struct от упомянутого элемента.

Четвертые загружает инструкция eax с p и пятой инструкцией загружает вычисленное выражение, v1+v2, куда p плюс 96 байт, т.е. p->y, точек.

+0

Итак, размер массива «массив» и «s» равен 40? –

+0

@FutureBillionaire 'array' должен быть в индексе' 0' (адрес первого члена должен совпадать с адресом 'struct'). 't' следует, затем' s', затем 'u', поскольку переменные-члены не могут быть переупорядочены в' struct'. Так как '' 'предшествует' u' в 'struct', он должен быть в нижнем индексе, т. Е.' 12'. 'u' находится на' 40'. Это означает 'sizeof (array) = 12 + padding' и' sizeof (s) = 40 - & s'. (Это только псевдокод и не компилируется.) – Downvoter