Как я могу преобразовать машинный код Intel 80386 в язык ассемблера? - PullRequest
3 голосов
/ 01 февраля 2010

Мне дали следующее задание:

Рассмотрим следующую последовательность шестнадцатеричных значений:

55 89 E5 83 EC 08 83 E4 F0 31 C9 BA 01 00 00 00 B8 0D 00 00 00 01 D1 01 CA 48 79 F9 31 C0 C9 C3

Эта последовательность байтов представляет подпрограмму на машинном языке Intel 80386 в 32-разрядном режиме.

  • Когда инструкции в этой подпрограмме выполняются, они оставляют значения в регистрах% ecx и% edx. Какие значения?

  • Что такое программа на C, которая выполняет вычисления, выполняемые этой подпрограммой, а затем печатает значения, вычисленные этой программой,% ecx и% edx, как они будут отображаться в конце выполнения подпрограммы.

Поскольку у меня нет запомненного набора команд 80386, я должен сначала преобразовать эти байты кода операции в их мнемонические эквиваленты на языке ассемблера. Итак, есть ли где-нибудь онлайн-ссылка, таблица, отображающая шестнадцатеричные значения в инструкции или тому подобное? Я проверил сайт Intel, но ничего не смог найти. Или есть лучший способ расшифровать это ...?

Ответы [ 6 ]

10 голосов
/ 01 февраля 2010

Хотя вы можете обмануть и использовать дизассемблер (дизассемблер не будет очень помочь в обучении), я бы порекомендовал на самом деле изучение что-то, прочитав соответствующие главы в руководстве по Intel 80386 . Начните с главы 17. Если / когда вы застряли, вернитесь в StackOverflow и опубликуйте вопрос, в котором точно указывается, как далеко вы продвинулись, а что нет.

2 голосов
/ 01 февраля 2010

Вы должны использовать дизассемблер, чтобы увидеть, каковы инструкции. Вы можете получить NDISASM из пакета NASM . Сохраните байты в файле и запустите:

ndisasm -b 32 file        # -b 32 specifies you're running in 32 bit mode
0 голосов
/ 04 ноября 2014
// hex.c
1   #include <sys/mman.h>
2   #include <string.h>
3   
4   int main () {
5     char code[] = {0xB8, 0x3C, 0x0, 0x0, 0x0, 0xBF, 0x2, 0x0, 0x0, 0x0, 0xBA, 0x7D, 0x0, 0x0, 0x0, 0xC3};
6     void *buf;
7     buf = mmap (0,sizeof(code),PROT_READ|PROT_WRITE|PROT_EXEC,MAP_PRIVATE|MAP_ANON,-1,0);
8     memcpy (buf, code, sizeof(code));
9     return 0;
10  }

// gcc -g hex.c -o hex
gdb hex;
b 9;
r;
x /10i buf

mov $0x3c,%eax
mov $0x2,%edi
mov $0x7d,%edx
ret
0 голосов
/ 04 февраля 2010

Используйте objdump -d, если вы используете Unix.

0 голосов
/ 02 февраля 2010

Существует гораздо более простой метод, чем предложенный, и я подозреваю, что именно этот метод имеет в виду учитель:

  1. Перейти к командной строке
  2. Запустите Debug
  3. команда "е"
  4. введите байтовые значения
  5. команда "u"
  6. читать результаты

Декодирование кодов операций с карты очень, очень утомительно, и я был бы удивлен, если бы это было то, что предполагалось.

0 голосов
/ 01 февраля 2010

Я бы не использовал дизассемблер, изучил инструкцию и выяснил, что может означать каждая группа битов. Это даст вам соответствующую инструкцию по сборке. Оттуда не должно быть слишком сложно передать это в C. Я согласен с другим постером, что он испортил это назначение в x86. Что-то вроде SPARC или MIPS будет намного проще (так как они имеют инструкции фиксированной ширины).

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