Организация программ

Ниже даны основные рекомендации для написания ассемблерных программ:

1. Четко представляйте себе задачу, которую должна решить программа.

2. Сделайте эскиз задачи в общих чертах и спланируйте общую логику программы.

Например, если необходимо проверить операции пеpесылки нескольких байт, начните c определения полей с пересылаемыми данными.

Затем спланируйте общую стратегию для инициализации, условного перехода и команды LOOP.

Приведем основную логику, которую используют многие программисты в таком случае:

инициализация стека и сегментных регистров

вызов подпрограммы цикла

возврат

Подпрограмма цикла может быть спланирована следующим образом:

инициализация регистров значениями адресов и числа циклов

Метка: пересылка одного байта увеличение адресов на 1 уменьшение счетчика на 1: если счетчик не ноль, то идти на метку если ноль, возврат

3. Представьте программу в виде логических блоков, следующих друг за другом. Процедуры не превышающие 25 строк (размер экрана) удобнее для отладки.

4. Пользуйтесь тестовыми примерами программ. Попытки запомнить все технические детали и программирование сложных программ «из головы» часто приводят к многочисленным ошибкам.

5. Используйте комментарии для описания того, что должна делать процедура, какие арифметические действия или операции сравнения будут выполняться и что делают редко используемые команды. (Например, команда XLAT, не имеющая операндов).

6. Для кодирования программы используйте заготовку программы, скопированной в файл с новым именем.

Важно:

uМетки процедур должны завершаться двоеточием для указания типа NEAR. Отсутствие двоеточия приводит к ассемблерной ошибке.

uМетки для команд условного перехода и LOOP должны лежать в границах -128 до +127 байт. Операнд таких команд генерирует один байт объектного кода. Шест. от 01 до 7F соответствует десятичным значениям от +1 до +127, а шест. от FF до 80 покрывает значения от -1 до +128. Так как длина машинной команды может быть от 1 до 4 байт, то соблюдать границы не просто. Практически можно ориентироваться на размер в два экрана исходного текста (примерно 50 строк).

uПри использовании команды LOOP, инициализируйте регистр CX положительным числом. Команда LOOP контролирует только нулевое значение, при отрицательном программа будет продолжать циклиться.

uВ случае, если некоторая команда устанавливает флаг, то данный флаг сохраняет это значение, пока другая команда его не изменит. Например, если за арифметической командой, которая устанавливает флаги, следуют команды MOV, то они не изменят флаги. Однако, для минимизации числа возможных ошибок, cледует кодировать команды условного перехода непосредственно после команд, устанавливающих проверяемые флаги.

uВыбирайте команды условного перехода соответственно операциям над знаковыми или беззнаковыми данными.

uДля вызова процедуры используйте команду CALL, а для возврата из процедуры — команду RET. Вызываемая процедура может, в свою очередь, вызвать другую процедуру, и если следовать существующим соглашениям, то команда RET всегда будет выбирать из стека правильный адрес возврата.

uБудьте внимательны при использовании индексных операндов. Сравните:
MOV AX,SI
MOV AX,[SI]
Первая команда MOV пересылает в регистр AX содержимое регистра SI. Вторая команда MOV для доступа к пересылаемому слову в памяти использует относительный адрес в регистре SI.

uИспользуйте команды сдвига для удваивания значений и для деления пополам, но при этом внимательно выбирайте соответствующие команды для знаковых и беззнаковых данных.