Про сборку - PullRequest
       8

Про сборку

0 голосов
/ 16 мая 2011
77f4bccd 741a            je      SHLWAPI!UrlIsW+0x3d (77f4bce9)

Согласно этой формуле:

7x xx                 RIP=RIP+8 bit displacement

Адрес dest должен быть 77f4bccd+1a=77F4BCE7, но на самом деле 77f4bce9.

Почему? ОБНОВЛЕНИЕ

77f4bce2 0f85a20a0000    jne     SHLWAPI!Ordinal152+0x101 (77f4c78a)

Адрес dest должен быть 77f4bce2+a20a0000=119FEBCE2, но это 77f4c78a, почему?

Ответы [ 3 ]

4 голосов
/ 16 мая 2011

Смещение идет после конца текущей инструкции.Поскольку в этом случае инструкция закодирована в два байта, вам необходимо добавить два к вашему вычислению.

Цитирование Руководство для программиста архитектуры AMD64 Том 3: Общие инструкции и системные инструкции раздел 1.7:

В 64-битном режиме для определенных инструкций реализована адресация относительно содержимого указателя 64-битных инструкций (счетчик программ), называемая RIP-относительной или PC-относительной адресацией.В таких случаях эффективный адрес формируется путем добавления смещения к 64-битному RIP следующей инструкции .

(выделение добавлено)

Длявторой, вы читаете смещение в неправильном порядке байтов (помните, что процессоры x86 имеют младший порядок байтов).Это на самом деле 0x00000aa2.Добавьте 6 байтов инструкции и переход вычисляется до:

0x77f4bce2 + 0x0aa2 + 0x06 = 0x77f4c78a
1 голос
/ 16 мая 2011

Поскольку RIP уже увеличено, чтобы указывать на следующую инструкцию к тому времени, когда конвейер получит добавить смещение.

0 голосов
/ 16 мая 2011

Видимо, адрес получателя рассчитывается на основе увеличенного указателя инструкций (адрес после je) и смещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...