Ассемблерные головоломки или может ли машина понимать естественный язык


Поиск текстовых строк, интерпретируемых как


Поиск текстовых строк, интерпретируемых как осмысленный код, — очень древнее увлечение, которым "болели" еще во времена "динозавров". В зависимости от структуры машинной команды, сложность решения задачи варьируются в очень широких пределах. Некоторые платформы вообще не позволяют написать ничего осмысленного, некоторые делают это настолько тривиальным, что пропадает весь интерес.
x86-процессоры занимают промежуточное положение. Гибкая система команд и множество способов адресации покрывают практически всю таблицу ASCII, однако, на поиск нужной комбинации могут уйди годы.
Никаких "официальных" правил в этой игре нет. Каждый волен назначать их сам. Код может быть как 16, так и 32-разрядным. Главное, чтобы он не вешал систему и не возбуждал никаких исключений. Теперь поговорим о прочих соглашениях. В 16-разрядном режиме обычно используется com-обрамление. При этом ASCII-строка помешается в текстовой файл, который затем переименовывается в com и передается на выполнение MS-DOS. Задача: вывести что-то на экран, причем, использовать прямой доступ к портам ввода/вывода и видеопамяти нежелательно, т. к. при прогоне программы под Windows NT это приводит к проблемам. Состояние регистров на момент запуска com-файла можно найти в таблице 1.
А вот другой вариант — текстовая строка оформляется в виде массива (например, char x[]="xxxxxx"), которому передается управление. Задача — прочитать входные аргументы и возвратить в регистре EAX результат вычислений.
Кодировка может быть любой — MS-DOS, WIN, KOI-8, но MS-DOS намного более популярна, хотя использование неанглийский символов алфавита в общем-то не приветствуется.
Для экспериментов нам понадобится: документация на ассемблер (предпочтительнее всего TECH HELP), отладчик (лучше avputil ничего не видел), HEX-редактор (например, HTE), пиво, вобла и некоторое количество свободного времени, а так же творческий настрой.

регистр
значение


AX
== 00FFh, если 1-й аргумент командной строки начинается символами X:, где X соответствует букве несуществующего дисковода;
== FF00h, если 2-й аргумент командной строки начинается символами X:, где X соответствует букве несуществующего дисковода;
== FFFFh, если 1-й и 2-й аргументы командной строки ссылаются на несуществующие дисководы;
== 0000h, если 1-й и 2-й аргументы командной строки не ссылаются на несуществующие дисководы.
BX
0000
DX
==DS
CX
00FF
SI
0100
IP
0100
BP
0000
DI
FFFE
SP
FFFE
CS
текущий сегмент
DS
текущий сегмент
SS
текущий сегмент
флаги
ODITSZAPC
001000000 == 7202
Содержание раздела