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

подготовка регистра AH в работе (улучшенный вариант)


С регистром DX мы разделываемся аналогичным образом (многократным вычитанием), а вот с "INT 21h" (CDh 21h) все обстоит значительно сложнее и без самомодифицирующегося код здесь просто никак. В нашем арсенале есть по меньшей мере две команды для работы с памятью: sub byte:[index_reg16],reg8 и sub byte:[BP+im8],reg8.

Естественно, для этого необходимо знать смещение команды "INT 21h" в машинном коде, а на данном этапе оно еще не известно, т. к. перед ним располагается самомодифицирующийся код, длину которого мы еще не готовы назвать. Хорошо, условимся считать, что "INT 21h" располагается по смещению 66h от начала файла, что соответствует 166h в памяти (базовый адрес загрузки для com-файлов равен 66h).

Начальное значение регистра SI равно 100h, что существенно упрощает нашу задачу. Остается разобраться с INT 21h (СDh 21h). Если закодировать эту команду как 23h 21, а затем отнять от нее 56h, мы добьемся того, что так долго искали. В машинном представлении это может выглядеть так:

 00000000: 56                           push      si

 00000001: 5D                           pop       bp

 00000002: 6A 56                        push      056

 00000004: 59                           pop       cx

 00000005: 28 4E 66                     sub       [bp][00066],cl

 00000066: 23 21



Содержание раздела