Я хотел выяснить, как работают объекты, посмотрев на ассемблерный вывод программы. У меня есть класс Numbers
, содержащий три класса ints
.
class Numbers {
public:
int n1;
int n2;
int n3;
};
Внутри основной функции я создаю экземпляр с именем obj
и присваиваю каждой из переменных число.
int main() {
Numbers obj;
obj.n1 = 1;
obj.n2 = 2;
obj.n3 = 3;
}
Следующий код представляет собой сгенерированную сборку:
int main() {
00935240 push ebp
00935241 mov ebp,esp
00935243 sub esp,0D8h
00935249 push ebx
0093524A push esi
0093524B push edi
0093524C lea edi,[ebp-0D8h]
00935252 mov ecx,36h
00935257 mov eax,0CCCCCCCCh
0093525C rep stos dword ptr es:[edi]
0093525E mov eax,dword ptr ds:[0093F000h]
00935263 xor eax,ebp
00935265 mov dword ptr [ebp-4],eax
Numbers obj;
obj.n1 = 1;
00935268 mov dword ptr [obj],1 ; === Here ===
obj.n2 = 2;
0093526F mov dword ptr [ebp-10h],2 ; === Here ===
obj.n3 = 3;
00935276 mov dword ptr [ebp-0Ch],3 ; === Here ===
return 0;
0093527D xor eax,eax
}
Я думал, что базовый указатель указывает на вершину стекового фрейма, а так как функция основная, то указывает на начало программы. Как он может вычитать из базового указателя, когда указатель стека указывает на текущий адрес? Кроме того, почему он обращается к переменным не по порядку. Он изменяет n1
, затем вычитает 16 байтов, чтобы получить адрес n2
, а затем 12 байтов, чтобы добраться до n3
. Есть ли причина для этого?
Я использую Visual Studio 2013 с MASM в качестве ассемблера.
sub esp,0D8h
. Поскольку до этого он был сохранен вebp
, все выделенное пространство находится с отрицательным смещением отebp
.dword ptr [obj]
вводит в заблуждение, я почти уверен, что это тожеebp
-относительная адресация. Используя правильный дизассемблер, вы должны увидеть тамebp-14h
, поэтомуn1
,n2
иn3
расположены в ожидаемом порядке возрастания. - person Jester   schedule 10.02.2016