Коды операций x64 и масштабированный байтовый индекс

Я думаю, что сбрасываю байт Mod R / M, но меня все еще смущает эффективный адрес памяти / масштабированный байт индексации. Я смотрю эти сайты: http://www.sandpile.org/x86/opc_rm.htm, http://wiki.osdev.org/X86-64_Instruction_Encoding. Может ли кто-нибудь закодировать пример с адресом назначения, находящимся в регистре, где используется SIB? Скажем, например, добавление 8-битного регистра к адресу в 8-битном регистре с использованием SIB?

Также, когда я использую байт ModR / M 0x05, это (*) относительно текущего указателя инструкции? В 64-битном режиме это 32 или 64 бита? '

Всегда ли SIB используется с адресом отправителя или получателя?


person Ryan Brown    schedule 20.01.2015    source источник


Ответы (1)


Адрес памяти никогда не находится в 8-битном регистре, но вот пример использования SIB:

add byte [rax + rdx], 1

Это экземпляр add rm8, imm8, 80 /0 ib. /0 указывает, что поле r в байте ModR / M равно нулю. Здесь мы должны использовать SIB, но нам не нужно немедленное смещение, поэтому мы можем использовать 00b для мода и 100b для rm, чтобы сформировать 04h для байта ModR / M (44h и 84h также работают, но тратят пространство на кодирование нулевое смещение). Теперь, глядя в таблицу SIB, есть два регистра, оба с «масштабом 1», поэтому база и индекс в основном взаимозаменяемы (rsp не может быть индексом, но мы не используем его здесь). Таким образом, байт SIB может быть 10h или 02h.

Теперь просто поставим байты в ряд:

80 04 10 01
; or
80 04 02 01

Также, когда я использую байт ModR / M 0x05, это (*) относительно текущего указателя инструкции? В 64-битном режиме это 32 или 64 бита?

да. Вы видели записку, я уверен. Так что это может быть и то, и другое, в зависимости от того, использовали ли вы переопределение размера адреса или нет. В любом разумном случае это будет rip + sdword. Использование другой формы дает усеченный результат, я не могу сразу представить себе какие-либо обстоятельства, при которых это имеет смысл (конечно, для общей математики, но не для указателей). Вероятно (хотя это предположение) существует возможность только для того, чтобы переопределение размера адреса работало достаточно равномерно.

Всегда ли SIB используется с адресом отправителя или получателя?

Зависит от того, что вы имеете в виду. Конечно, если у вас есть SIB, он будет кодировать источник или место назначения (потому что что еще там есть?) (Вы можете возразить, что SIB, который может появиться в nop rm, не кодирует ничего, потому что nop не имеет ни источников, ни направления). Если вы имеете в виду «который кодирует», это может быть любой из них. Просматривая все инструкции, он чаще всего может появиться в исходном операнде. Но очевидно, что во многих случаях он может кодировать пункт назначения - пример: см. Выше. Если вы имеете в виду "используется ли он всегда", ну нет, посмотрите ту таблицу, на которую вы смотрели.

person harold    schedule 05.03.2015