Что будет содержать этот регистр после - PullRequest
1 голос
/ 19 июля 2010

Я не могу понять, что eax содержит после этой части сборки:

mov     edi, [edi+4]
lea     eax, [edi+88h]

с edi, указывающим на класс

Ответы [ 4 ]

2 голосов
/ 19 июля 2010

Load Effective Address получает фактический адрес ссылки. По какой-то непонятной причине символическая сборка написана так, как будто она ссылается на содержимое edi + 88h, но на самом деле инструкция загружает значение регистра edi плюс константу 088h (эквивалентную mov eax, edi; add eax, 088h). Я сомневаюсь, что edi + 4 - это указатель на функцию: скорее всего, это указатель vtbl или массив.

0 голосов
/ 20 июля 2010
mov     edi, [edi+4]
lea     eax, [edi+88h]

    edi points here after 'mov'
    .
    xxxx....................
    |                      ^
xxxx....                   eax points here after 'lea'
^
edi pointed here before 'mov'

char* edi;
void* eax;

edi = *(char**)(edi+4);
eax = edi+0x88;

Похоже, к какой-то записи там только что обращаются.

0 голосов
/ 20 июля 2010

Основываясь на использовании edi, он, вероятно, в конечном итоге указывает на область памяти, но lea не всегда используется так: http://en.wikipedia.org/wiki/Addressing_mode#Useful_side_effect.

0 голосов
/ 19 июля 2010

Долгий выстрел, так как я ничего не знаю о вашем классе, но здесь все равно.

У вас есть множественное наследование?Возможно, edi+4 - это вторая виртуальная таблица, а [edi+4]+88h - указатель на функцию, которую вы хотите вызвать?Или, в зависимости от вашего компилятора, может быть, что виртуальная таблица расположена в +4, в любом случае eax содержит адрес виртуальной функции для вызова.

...