Структура программы на языке ассемблера и ее описание
Программа, написанная на языке ассемблера, может состоять из нескольких частей, называемых модулями. В каждом модуле могут быть определены один или несколько сегментов данных, стека и кода. Любая законченная программа на ассемблере должна включать один главный, или основной, модуль, с которого начинается ее выполнение. Модуль может содержать сегменты кода, сегменты данных и стека, объявленные при помощи соответствующих директив. Перед объявлением сегментов нужно указать модель памяти при помощи директивы .MODEL.
Пример "ничего не делающей" программы на языке ассемблера:
.686P
.MODEL FLAT, STDCALL
.DATA
.CODE
START:
RET
END START
В данной программе представлена всего одна команда микропроцессора. Эта команда RET. Она обеспечивает правильное окончание работы программы. В общем случае эта команда используется для выхода из процедуры.
Остальная часть программы относится к работе транслятора.
.686P - разрешены команды защищенного режима Pentium 6 (Pentium II). Данная директива выбирает поддерживаемый набор команд ассемблера, указывая модель процессора. Буква P, указанная в конце директивы, сообщает транслятору о работе процессора в защищенном режиме.
.MODEL FLAT, stdcall - плоская модель памяти. Эта модель памяти используется в операционной системе Windows. stdcall
.DATA - сегмент программы, содержащий данные.
.CODE - блок программы, содержащей код.
START - метка. В ассемблере метки играют большую роль, что не скажешь о современных языках высокого уровня.
END START - конец программы и сообщение транслятору, что начинать выполнение программы надо с метки START.
Каждый модуль должен содержать директиву END, отмечающую конец исходного кода программы. Все строки, которые следуют за директивой END, игнорируются. Если опустить директиву END, то генерируется ошибка.
Метка, указанная после директивы END, сообщает транслятору имя главного модуля, с которого начинается выполнение программы. Если программа содержит один модуль, метку после директивы END можно не указывать.
Организация цикла с помощью loop
Для организации циклов со счетчиком: loop / loope / loopne . Эти команды используют в качестве счетчика регистр cx, они сами уменьшают его значение после каждой итерации цикла и сравнивают после уменьшения с нулём.
Команда loop <метка перехода> выполняет следующие действия:
• уменьшает регистр cx ;
• сравнивает cx с нулем, если cx >0, то управление передается на метку перехода (продолжаем цикл).
Команды loope/loopne позволяют выйти из цикла по дополнительному условию.
Примечание: при написании вложенных циклов loop , необходимо помнить, что все они используют для счетчика один и тот же регистр – cx . Для правильной работы необходимо сохранить счетчик внешнего цикла ( push cx ) до инициализации внутреннего и восстановить его ( pop cx ) после команды loop внутреннего цикла.
Инкремент и декремент
Инкремент – операция во многих языках программирования, увеличивающая переменную. Обратную операцию называют декремент. Чаще всего унарная операция приводит переменную к следующему элементу базового типа (то есть для целых чисел – увеличивает на 1, для символьного типа даёт следующий символ в некоторой таблице символов и т.п.)
inc операнд — операция инкремента, то есть увеличения значения операнда на 1;
операнд = операнд +1
66. Раздельная трансляция: назначение, варианты компоновки
В соответствии с принципами модульного программирования большие программы надо разрывать на модули, из которых потом создается единая программа.
Существует 4 варианта компоновки программ.
Вариант 1. Основная программа Pr1 имеет сегменты:
• стека
• данных
• кода.
Результаты возвращаются через регистры. Дополнительная программа имеет только сегмент кода. При компоновке получаем 2 разных сегмента кода. Для этого используется модель памяти medium.
Вариант 2
Аналогичен первому варианту, но в результате компоновки необходимо получить один объединенный кодовый сегмент. Для этого нужно использовать модель памяти small.
Вариант 3
Дополнительная программа использует данные из основной программы, записанные в сегменте данных. В основной программе они имеют вид PUBLIC. В дополнительной extra и word.
Вариант 4. Обмен данными через стек
67. !Высказывания, виды высказываний. Логические переменные и функции
Высказывание - это повествовательное предложение, про которое можно определенно сказать истинно оно или ложно (истина (логическая 1), ложь (логический 0)).