Ваш надуманный пример не включает в себя дальний переход, который может изменить режим, поэтому любая разборка действительна в зависимости от того, в каком режиме вы ожидаете, что ЦП ее расшифрует. Выполнение будет продолжаться через оба блока в одном режиме.
Например, в Определите версию вашего языка Я показываю все 3 способа разбора этого блока машинного кода; все 3 одинаково действительны и дают разные результаты намеренно. (Это машинный код полиглота, такой как x86-32 / x86-64 фрагмент машинного кода полиглота, который обнаруживает 64-битный режим во время выполнения? )
Если у вас есть разные блоки код в реальном случае, предположительно, вы захотите взглянуть на 16-битную разборку для 16-битных частей и 32-битную разборку для 32-битных частей. Или просто прочитайте источник. Или попросите вашего ассемблера сгенерировать листинг, например nasm -l /dev/stdout -fbin foo.asm
. Затем вы получите «машинный код» для каждой строки исходного кода в зависимости от того, для какого режима вы указали ассемблеру для сборки.
GAS также может составлять списки с помощью as -a
или gcc -c -Wa,-a
(-Wa передает дополнительные параметры непосредственно ассемблеру).
В список включены только машинный код с шестнадцатеричным кодом и исходный код строка (включая комментарии), а не dis сборка. Поэтому, если вы использовали такие приемы, как .byte
, для ручного кодирования инструкции, вы не увидите, как процессор будет ее интерпретировать. Для этого см. Ответ Росса или используйте отладчик.
$ as -a foo.s -o foo.o # still creates an output file as normal
GAS LISTING foo.s page 1
1 .code16
2 0000 89C3 mov %ax, %bx
3 0002 6689CA mov %ecx, %edx # comment
4
5 .code32
6 0005 89C3 mov %eax, %ebx # comment 1
7 0007 6689CA mov %cx, %dx # comment 2
GAS LISTING foo.s page 2
NO DEFINED SYMBOLS
NO UNDEFINED SYMBOLS
В левом столбце указан адрес.
(я изменил ваш источник, чтобы изменить интервал и добавить комментарии, чтобы дважды убедитесь, что это просто дамп исходной строки, а не дизассемблирование.)
Листинги GAS по умолчанию равны stdout, с -ahls
опциями листинга gas man page . Не существует -h
«источника высокого уровня» для рукописных asm-файлов, эта опция предназначена для составления списков из вывода компилятора, но это нормально. Есть опции опций для столбцов / нумерации страниц, такие как --listing-lhs-width=number
Вы также можете использовать эмулятор со встроенным отладчиком (например, BOCHS), чтобы показать разборку в режиме, в котором находится процессор в настоящее время в . BOCHS знает о режимах, сегментации реального режима и так далее. Это, вероятно, ваш лучший выбор, чтобы убедиться, что правильные инструкции действительно выполняются. (Вы можете захотеть источник в другом окне; IDK, если BOCHS может прочитать отладочную информацию / источник.)