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


проверка работоспособности фрагменты программы под отладчиком


Ура! Получилось! Регистр AH послушно обратился в 09h и ни одного ASCII символа при этом не пострадало. Впрочем, это не единственный, и, к тому же не самый короткий, вариант. Можно, например, "подтянуть" регистр AL к 09h (в этом нам помогут команды INC AX), а затем переслать AL в AH. Стоп! Ведь команд пересылки у нас нет! Ни MOV, ни XCHG не работают! Но… зато в нашем распоряжении есть стек! А стек это могучая вещь! Команда PUSH reg16 забрасывает 16-разрядный регистр на верхушку, а POP reg16 стаскивает его оттуда. Команд для работы с 8-разярдными регистрами нет, а это, значит, что AL и AH мы никак не обменяем, во всяком случае если действовать в лобовую. Нет, тут нужен совсем другой подход! Что такое машинное слово? Совокупность двух байт, так? Причем, младший байт лежит по меньшему адресу, а за ним следует старший.

Немного медитации и… Постойте, но ведь если заслать в стек регистр AX, затем уменьшить указатель верхушки стека на единицу и извлечь регистр AX, то в AL попадет мусор, а в AH — младший байт оригинального регистра AX, в результате чего наша задача будет решена! Весь код угадывается в 0Bh байт, что на 0Ah байт короче, чем в прошлый раз. Это надо обмыть!

00000000: 40                           inc       ax

00000001: 40                           inc       ax

00000002: 40                           inc       ax

00000003: 40                           inc       ax

00000004: 40                           inc       ax

00000005: 40                           inc       ax

00000006: 40                           inc       ax

00000007: 40                           inc       ax

00000008: 40                           inc       ax

00000009: 50                           push      ax

0000000A: 4C                           dec       sp

0000000B: 58                           pop       ax



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