Главная /
Ассемблер /
Для чайников /
Быстрый старт /
Шестнадцатеричный редактор
ПРИМЕЧАНИЕ
Рисунки на этой странице не отображаются, но вы можете найти их в книге.
То, что мы сделаем сейчас, с моей точки зрения весьма интересно. Это будет ваша первая
программа в машинных кодах (и, скорее всего, единственная))).
Ассемблер – это язык низкого уровня, но все ж таки язык. А пробовали вы написать
программу в машинных кодах? Сейчас попробуем.
Написать программу можно и не имея никаких ассемблеров-компиляторов и прочих инструментов –
с помощью какого-либо шестнадцатеричного редактора (или hex-редактор или hex editor).
ВНИМАНИЕ!
Написание программ с использованием шестнадцатеричного редактора – это не только
утомительно, но и НЕБЕЗОПАСНО ДЛЯ КОМПЬЮТЕРА! Так как ошибки в процессе создания
программы неизбежны. Но если TASM со товарищи проверяют текст программы на наличие ошибок,
то в шестнадцатеричном редакторе проверяющий только один – вы сами. Поэтому, если ошибка
останется незамеченной, файл все равно будет создан. И если вы попытаетесь этот
«неправильный» файл запустить, то в лучшем случае получите зависание компьютера,
а в худшем этот файл может такое натворить – вирусы отдыхают.
|
И все-таки разбор программ в шестнадцатеричном редакторе весьма полезен. Особенно тем,
кто собирается работать с электроникой – ведь микропроцессоры не понимают ни Паскаль ни С++.
Хотя и существуют специальные устройства и программы, которые им эти языки «объясняют».
Для начала вам потребуется шестнадцатеричный редактор. Вы можете использовать любой,
имеющийся у вас под рукой. Однако я буду использовать уже упоминавшийся
McAfee FileInsight v2.1.
Этот hex-редактор можно скачать бесплатно. Все описанные ниже действия справедливы именно для этого редактора.
Итак, шестнадцатеричный редактор у вас установлен. Запускаем его. Щелкаем по кнопке ОТКРЫТЬ,
находим один из созданных нами СОМ-файлов, например, debug_1.com, и загружаем его в редактор.
Когда файл загружен, в редакторе вы увидите следующее (см. также рис. 1.12):
00000000 B4 02 B2 41 CD 21 CD 20 ...A.!.
Можете открыть два других созданных нами файла: mycode.com (созданный в emu8086) или
ATEST.COM (который мы создали в разделе
MASM, TASM и WASM). Увидите то же самое.
Это значит, что все ассемблеры создают одинаковый машинный код. То есть отличия в тексте
программ не являются принципиальными – они обусловлены только отличиями самих ассемблеров.
ПРИМЕЧАНИЕ
Если в вашем случае вы видите другую картину, то либо вы открыли другой файл, либо
просматриваете его в текстовом режиме. В последнем случае нажмите кнопку View as Hex
на панели инструментов (см. рис. 1.12).
Что же означают эти числа?
С нулями все понятно – это первая ячейка памяти, в которую записано число В4. Это число
потом будет записано в адрес 0100h (для СОМ-файла). В строке должно быть 16 чисел, каждое
из которых состоит из двух цифр. Числа записываются в шестнадцатеричной форме. Но у нас
программа маленькая – всего 8 байт, поэтому и чисел у нас 8.
Ну а что же такое B4? Это команда – «Ввести значение в регистр АН». А какое значение вводим?
Правильно: 02 (следующее в строке число).
Идем дальше. Команда B2 – «ввести значение в регистр DL». Какое значение? Конечно 41.
А теперь вспомним, что мы увидели в программе Debug, введя команду t:
AX=0200 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B72 ES=0B72 SS=0B72 CS=0B72 IP=0102 NV UP EI PL NZ NA PO NC
0B72:0102 B241 MOV DL,41
Видите в последней строке B241? Знакомое сочетание? Это код команды MOV DL, 41.
Идем дальше. CD – код вызова прерывания. Какого? Смотрим следующее число. Итак,
CD 21 – это код команды INT 21. Аналогично для CD 20.
Осталось разобраться с загадочными символами в конце строки. А здесь все просто: каждая
цифра в числе соответствует коду символа таблицы ASCII, и эти символы выводятся в той же
последовательности, что и шестнадцатеричные цифры. В этом тексте вместо некоторых символов
стоят точки (.) – это просто коды не буквенных символов.
Ну а теперь напишем и создадим нашу изученную вдоль и поперек программу без ассемблеров
и компоновщиков. Открываем редактор, создаём новый файл (для этого щёлкаем кнопку NEW
на панели инструментов), затем щёлкаем кнопку View as Hex и вводим данные:
00000000 B4 02 B2 41 CD 21 CD 20
Сохраняем файл под именем, например, hex_1.com. Все. Программа готова. Теперь ее можно
запустить и в очередной раз полюбоваться своим творением. Результат будет тот же, что
и во всех предыдущих случаях.
И ещё один приятный сюрприз от редактора McAfee FileInsight v2.1 – он имеет свой дизассемблер!
Если вы загрузите в редактор исполняемый файл, а в левом нижнем углу выберите вкладку
DISASSEMBLY, то сможете посмотреть исходный код загруженной программы на языке ассемблера
(рис. 1.12).
Зачем вообще нужны шестнадцатеричные редакторы и дизассемблеры? Ведь это так сложно.
Да, это непросто. Однако хакеры так не думают. Именно с помощью шестнадцатеричных
редакторов и дизассемблеров они ломают программы. Находят в коде нужные им места и
исправляют их в соответствии со своими хакерскими капризами.
Конечно, мы не хакеры. Ломать программы не будем. Однако дизассемблеры и шестнадцатеричные
редакторы весьма полезны и законопослушными программистам. Они используются, например,
для отладки, для изучения машинных кодов и т.п. Например, вы знаете, как выглядит
команда на языке ассемблера, но хотите узнать её машинный код. Если нет документации,
то выход только один – шестнадцатеричный редактор и/или дизассемблер. Следует,
однако, учесть, что не все команды умещаются в машинный код из двух чисел.
Некоторые команды довольно сложные и требуют большего количества чисел для представления
в машинных кодах.