Моя сборка немного ржавая, но первая инструкция загружает что-то в EAX ... то, на что указывает содержимое регистра ECX ... но которое является словом (4 байта), смещенным оттуда. Следующая инструкция затем загружает (переписывает) EAX с тем, на что указывает EAX.
Это обозначение (квадратные скобки вокруг второго или «источник» операции этих варисторов) инструкции (нагрузки показывает, что косвенные режимы адресации используются.
Я предполагаю, что это просто способ реализовать тип двоичного указателя. Адрес в регистре ECX может указывать на фрейм стека или, возможно, на некоторый указатель атрибута C++ «this», на который вы ссылались. Этот адрес, в свою очередь, содержит адрес возвращаемого значения Таким образом, этот код вытаскивает адрес в регистр, а затем использует этот адрес в регистре, чтобы вытащить значение (со-попутно в тот же регистр). Этот подход хорош тем, что он сохраняет все остальные регистры.
(Кстати, большинство функций вызова функции x86 --- системные вызовы, вызовы функций DOS и т. Д. Оставляют коды возврата функций или системные ошибки ... errno в библиотеках stdlib C в регистре EAX).
О, но в этом классе ecx + 4 фактически является самой функцией в vftable. Так что это значит ...? –
Это ничего не меняет. Указатель * в vtable хранится в поле первого класса ('a' в моем примере). –
Как я могу найти, что такое ecx + 4? –