2009-11-24 2 views
0

Есть ли учебник или объяснение в любом месте, как C++ объекты переводят в инструкцию ассемблера двигающихся данных между регистрами ...Assembler и C++ отношения

Я не понимаю, как мы манипулируем объект на высокоуровневых языках, где в Ассемблер, по сути, вы перемещаете данные между регистрами? Плюс делаю некоторые основные операции над ними.

ответ

3

Отказ от ответственности: Я буду использовать сборку IA-32 для образцов.

Как правило, каждый объект представляет собой структурный блок памяти, выделенный либо на куче (через вызов new), либо на stacK (в основном, перемещая esp, чтобы зарезервировать для него память). После выделения памяти указатель передается конструктору объекта для инициализации (обратите внимание, что ctor может быть встроен, таким образом, не производится call).

Обычно каждый объект, имеющий виртуальные методы, имеет указатель на таблицу виртуальных методов (обычно называемую VMT или vtable, которая хранит указатели на функции. Когда вы вызываете виртуальный метод, адрес этого метода получен и вызывается. выглядит следующим образом

mov ecx, [this] 
mov ebx, vtable 
push [arg2] 
push [arg1] 
call [ebx + OFFSET_foo] ; this->foo(arg1, arg2); 

Обратите внимание, что в этом примере я показал, что this передается через ECX и арг передаются через стек в справа налево порядок. Это thiscall convention, используется в VC++ по умолчанию, например, Другие составители могут использовать другие соглашения, как показано в статье.

Для не виртуальных вызовов нет необходимости в поиске таблиц. Так выглядит код

mov ecx, [this] 
push [args] 
push [arg1] 
call bar ; this->bar(arg1, arg2) 

Поэтому, не виртуальные методы могут выполняться немного быстрее - его адрес хорошо известен, поэтому компилятор может начать декодирование своего кода до встречи call опкода.

В некоторых соглашениях о вызовах (например, fastcall) аргументы передаются через регистры, которые в некоторых случаях могут быть быстрее.

В большинстве соглашений о вызовах результат возвращается через регистр eax, если он соответствует этим регистрам через стек FPU, если это плавающая точка или через стек в противном случае.

Если вы хотите узнать больше о переводе C++ кода для сборки, я рекомендую

  • пытается сделать ваш компилятор генерировать ассемблерный листинг во время компиляции (обычно -S ключ, он может быть установлен в Настройки проекта VC++);

  • попытаться разобрать код, например. используя превосходный дизассемблер IDA. Там free version. Это помогает много, предоставляя символические имена для локальных переменных, распознавая библиотечные функции и т. Д.

Удачи!

+0

Спасибо! В этом есть смысл!! :) –