Материал: Основы программирования на Ассемблере

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

На таких машинах, как MIPS, Compaq Alpha, и нашей модели RISC есть команды сравнения, которые непосредственно вычисляют большинство отношений и помещают однобитовый результат 0/1 в регистр общего назначения.

3. ПРОГРАММИРОВАНИЕ С ИСПОЛЬЗОВАНИЕМ MASM

Компиляторы языка Assembler несколько отличаются друг от друга т.к не существует единого стандарта. Обычно для Intel совместимых процессоров используется синтаксис команд, указанный в документации от Intel и AMD (называемый Intel), сами же команды и их использование описаны в документации с официальных сайтов производителей процессоров.Но, кроме команд, в исходном коде программы также встречаются специальные символы и директивы, указывающие компилятору как нужно компилировать программу. Обычно, именно эти элементы программы отличаются для разных компиляторов. Сегментные регистры использовались для хранения адреса начала сегмента кода (CS - code segment), сегмента данных (DS - data segment) и сегмента стека (SS - stack segment). Регистры ES, FS и GS были добавлены позже. Существовало несколько моделей памяти, каждая из которых подразумевала выделение программе одного или нескольких сегментов кода и одного или нескольких сегментов данных: tiny, small, medium, compact, large и huge. Для команд языка ассемблера существовали определённые соглашения: адреса перехода сегментировались по регистру CS, обращения к данным сегментировались по регистру DS, а обращения к стеку - по регистру SS. Если программе выделялось несколько сегментов для кода или данных, то приходилось менять значения в регистрах CS и DS для обращения к другому сегменту. Существовали так называемые «ближние» и «дальние» переходы. Если команда, на которую надо совершить переход, находилась в том же сегменте, то для перехода достаточно было изменить только значение регистра IP.

Такой переход назывался ближним. Если же команда, на которую надо совершить переход, находилась в другом сегменте, то для перехода необходимо было изменить как значение регистра CS, так и значение регистра IP. Такой переход назывался дальним и осуществлялся дольше.

Флаги состояния (биты 0, 2, 4, 6, 7 и 11) отражают результат выполнения арифметических инструкций, таких как ADD, SUB, MUL, DIV.

Флаг переноса CF устанавливается при переносе из старшего значащего бита/заёме в старший значащий бит и показывает наличие переполнения в беззнаковой целочисленной арифметике. Также используется в длинной арифметике.

Флаг чётности PF устанавливается, если младший значащий байт результата содержит чётное число единичных битов. Изначально этот флаг был ориентирован на использование в коммуникационных программах:

при передаче данных по линиям связи для контроля мог также передаваться бит чётности и инструкции для проверки флага чётности облегчали проверку целостности данных.

Вспомогательный флаг переноса AF устанавливается при переносе из бита 3-го результата/заёме в 3-ий бит результата. Этот флаг ориентирован на использование в двоично-десятичной (binary coded decimal, BCD) арифметике.

Флаг нуля ZF устанавливается, если результат равен нулю.

Флаг знака SF равен значению старшего значащего бита результата, который является знаковым битом в знаковой арифметике.

Флаг переполнения OF устанавливается, если целочисленный результат слишком длинный для размещения в целевом операнде (регистре или ячейке памяти). Этот флаг показывает наличие переполнения в знаковой целочисленной арифметике.

.1 ПАКЕТ MASM. СТРУКТУРА ПРОГРАММЫ

В макроассемблер MASM включены директивы, упрощающие определение сегментов программы и, кроме того, предполагающие те же соглашения, которые используются в языках высокого уровня Microsoft. Упрощенные директивы определения сегментов генерируют необходимый код, указывая при этом атрибуты сегментов и порядок их расположения в памяти. Везде в этой книге мы будем использовать именно упрощенные директивы определения сегментов, наиболее важные из которых перечислены далее:

. DATA (. data) - определяет начало инициализированного сегмента данных с именем _DATA и при наличии предыдущего сегмента завершает его. Этой директиве должна предшествовать директива. MODEL.

Сегмент, определенный с атрибутом. DATA,

должен содержать только инициализированные данные, то есть имеющие начальные значения, например,

.dataDW 11DB "Text string"

byte1 DB?

. DATA? (. data?) - определяет сегмент данных, в котором располагаются неинициализированные данные. При наличии предыдущего сегмента новый сегмент завершает его. Неинициализированные данные могут объявляться в сегменте. DATA? при помощи оператора? Преимуществом директивы. DATA? является то, что при ее использовании уменьшается размер исполняемого файла и, кроме того,

обеспечивается лучшая совместимость с другими языками. Этой директиве должна предшествовать директива. MODEL. Вот пример использования директивы.DATA?

.data?

. CONST (. const) - определяет начало сегмента данных, в котором определены константы. При наличии предыдущего сегмента новый сегмент завершает его. В целях совместимости с другими языками данные должны быть в формате, совместимом с принятыми в языках высокого уровня соглашениями. Сегмент, определенный директивой. CONST, имеет атрибут “только для чтения”. Этой директиве должна предшествовать директива. MODEL.

. STACK (. stack) [размер] - определяет начало сегмента стека с указанным размером памяти, который должен быть выделен под область стека. Если параметр не указан, размер стека предполагается равным 1 Кбайт. При наличии предыдущего сегмента новый сегмент завершает его. Этой директиве должна предшествовать директива. MODEL.

. CODE (. code) [имя] - определяет сегмент программного кода и заканчивает предыдущий сегмент, если таковой имеется. Необязательный параметр имя замещает имя _TEXT, заданное по умолчанию. Если имя не определено, ассемблер создает сегмент с именем _TEXT для моделей памяти tiny, small, compact и flat или сегмент с именем имя модуля TEXT для моделей памяти medium, large и huge. Этой директиве должна предшествовать директива. MODEL, указывающая модель памяти, используемую программой.

Если разрабатывается процедура для включения в программу,

написанную на языке высокого уровня, то должна быть указана та модель памяти, которая используется компилятором языка высокого уровня. Кроме того, модель памяти должна соответствовать режиму работы (типу) процессора. Это имеет значение для плоской модели памяти, которую можно применять только в режимах .386, .486, .586, .686. Модель памяти определяет, какой тип адресации данных и команд поддерживает программа (near или far). Это имеет смысл для команд перехода, вызовов и возврата из процедур.

3.2 СОВМЕСТНОЕ ИСПОЛЬЗОВАНИЕ ЯЗЫКА АССЕМБЛЕР С ДРУГИМИ ЯЗЫКАМИ ПРОГРАММИРОВАНИЯ

Языком программирования первого поколения считается машинный код. Машинный код состоит из инструкций, которые компьютер (процессор) может выполнить (а также данных, которые принадлежат этим инструкциям). Программируя на машинном коде, программист должен был писать свою программу в двоичном коде, так что бы процессор мог это понять и исполнить. В сущности, такое программирование требует хорошего знания и понимания аппаратного обеспечения, потому что в процессе программирования необходимо знать, что процессор может сделать, где находятся устройства ввода-вывода (англ. I/O- Input-Output), а также как с ними необходимо общаться и сколько времени будет потрачено на ту или иную операцию. Таким образом, машинный код очень крепко связан с аппаратным обеспечением, на котором соответствующая программа будет работать. На сегодняшний день машинный код из компьютеров никуда не исчез, все действия на низком уровне (уровне аппаратного обеспечения) происходят до сих пор в машинном коде, т.е. на каком бы языке программирования не была написана программа в, конечном итоге она преобразуется в понятный аппаратному обеспечению машинный код.

Языками второго поколения считаются языки Ассемблера. В случае машинного кода всё программирование происходило в двоичном коде, и в связи с этим его чтение и отладка были очень трудоёмкими. При программировании на языке Ассемблера же инструкции представлены человеку в понятной форме.

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

В объектно-ориентированных языках программирования решение проблемы производится при помощи функций и структур данных, описанных в классах (англ. Class). Из каждого класса можно создать объект, у которого будет набор свойств и/или методов.

Свойства - это значения, которые объект может содержать, и которые могут влиять на поведение объекта. Например, на основе класса «консольное окно» можно создать объект «консоль1», который будет виден пользователю, как одно консольное окно. У этого объекта присутствуют некоторые свойства (показано, скрыто, ширина, высота, цвет текста в консольном окне, цвет фона и т.д.), изменяя эти свойства можно в данном конкретном случае менять внешний вид объекта.

.3 КОМАНДЫ УПРАВЛЕНИЯ ЦИКЛАМИ. КОМАНДЫ РАБОТЫ СО СТРОКАМИ. ВЫВОД НА ЭКРАН В ТЕКСТОВОМ РЕЖИМЕ

Нормальное завершение цикла связано с удовлетворением в процессе его выполнения некоторого условия: в циклах while и for - с ложностью, а в цикле until, наоборот, с истинностью выражения-условия, тогда как в цикле foreach - с завершением перебора всех элементов списка. Иногда возникает необходимость либо завершить выполнение всего цикла, либо прервать выполнение операторов цикла на каком-то шаге и перейти на очередную итерацию, либо повторить выполнение операторов блока цикла, не переходя на выполнение очередной итерации. Для подобных целей в языке Perl предусмотрены три команды: last, next и redo, которые называются командами управления циклом.

Они изменяют естественный порядок выполнения циклов, принятый по умолчанию в языке, и передают управление в определенное место программы, завершая выполнение цикла (last), переходя на следующую итерацию цикла (next) или повторяя выполнение операторов тела цикла при тех же значениях переменных цикла (redo). Место перехода задается меткой, которая определена в языке как идентификатор, завершающийся символом двоеточие (:). Если мы посмотрим на синтаксис каждого из операторов цикла, то обратим внимание, что все они могут быть помечены. В командах управления выполнением цикла задаются не сами метки, а их идентификаторы.

С точки зрения основных понятий языка Perl, команды управления циклом не являются ни операциями, ни операторами - они не выполняют никаких действий над данными программы и в то же время не определены как операторы.

Но если каждую из них завершить точкой с запятой, то интерпретатор Perl такую конструкцию будет рассматривать как простой оператор.

Поэтому их можно мыслить, как некие «унарные операции», результатом вычисления которых является изменение последовательности выполнения операторов, (Мы специально написали «унарные операции» в кавычках, так как операция осуществляет некоторое действие над данными, но никак не над метками.) Более того, команды управления циклом можно использовать в любом выражении Perl. Заметим, однако, что использовать их следует в таких выражениях, где это имеет смысл, например, в выражениях с операцией «запятая»:

Open (INPUT FILE, $file), warn ("Невозможно открыть $file: $! \n"), next FILE;

Приведенный оператор может являться частью программы, которая в цикле последовательно открывает и обрабатывает файлы. Команда next инициирует очередную итерацию цикла с меткой FILE, если не удалось открыть файл в текущей итерации. Обратите внимание, что она используется в качестве операнда операции «запятая». В таком контексте эта команда имеет смысл. Следующий оператор является синтаксически правильным, но использование в нем команды redo не имеет никакого смысла:

Print "qu-qu", 5 * redo OUT, "hi-hi\n";

Результатом выполнения этого оператора будет повторение вычислений операторов цикла с меткой OUT, то есть простое выполнение команды redo OUT.

Относительно команд управления циклом следует сказать, что к ним можно применять модификаторы простых операторов, так как употребленные самостоятельно с завершающей точкой с запятой они рассматриваются как простые операторыif $a == 2;

ЗАКЛЮЧЕНИЕ

Актуальность прохождения данной технологической практики заключается в закреплении и усовершенствовании навыков по профессии программиста.

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

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

В период прохождения практике студенты ведут дневники, в которые они ежедневно вносят записи о проделанной работе свои наблюдения и результаты изучения технологического процесса.

Трудно найти какую-либо сферу жизнедеятельности человека, в которой не применяется цифровая и вычислительная техника. По значимости для прогресса науки и техники появление ЭВМ настолько велико, что это явление можно поставить в один ряд с началом освоения космоса и практическим применением атомной энергии. Подготовка специалистов в области цифровой и микропроцессорной техники является важной задачей. Изучение материала можно вести шагая от общего к частному - от микропроцессорной системы к ее компонентам (базовым логическим элементам), либо от частного к общему

При работе с компонентами была создана программа, на которой расположили все выполненные задачи.

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

На практике, было много трудностей, но успешно их преодолевали.

ЛИТЕРАТУРA

1. Алексенко, А. Г. Основы микросхемотехники / Алексенко А. Г. - 3-е изд., перераб. и доп. - М. : БИНОМ. Лаборатория знаний, 2009. - 448 с.

. Бабич, Н.П. Основы цифровой схемотехники: Учебное пособие. - М.: Изд. Дом «Додэка-XXI», К.: «МК-Пресс», 2007. - 480 с., ил.

. Калабеков, Б.А. Цифровые устройства и микропроцессорные системы / Б.А. Калабеков. - М.: Горячая линия - Телеком. 2007. - 336 с.

. Келим, Ю.М. Вычислительная техника: учеб. пособие для студентов сред. проф. образования / Ю.М. Келим. - 4-е изд., перераб. и доп. - М.: Изд. Центр «Академия», 2008. - 368 с.

. Коваленко, А.А. Основы микроэлектроники: учеб пособие для студентов высш. учеб. заведений / А.А. Коваленко, М.Д. Петропавловский. - 3-е изд., стер. - М.: Изд. центр «Академия», 2010. - 240 с.

. Кузин, А.В. Микропроцессорная техника / А.В. Кузин, М.А. Жаворонков. - 2-е изд. - М.: Изд центр «Академия», 2006. - 304 с.

. Мышляева, И.М. Цифровая схемотехника: Учебник для сред. проф. Образования / И.М. Мышляева. - М.: Изд. цент «Академия», 2005. - 400 с