Автор работы: Пользователь скрыл имя, 07 Января 2015 в 09:57, отчет по практике
Цели практики по программированию:
1.Закрепление и углубление знаний полученных при теоретическом обучении.
2.Подготовка к изучению последующих специальных дисциплин и прохождению производственной практики.
3.Знакомство с особенностями программирования.
О языке программирования
Введение 2
1.Цифровые узлы комбинационного и последовательностного типа 3
1.1 Моделирование цифровых узлов комбинационного и последовательностного типа electronic work bench 4
2.Основы программирования на Ассемблере 7
2.1 Арифметические команды. Команды передачи 9
2.2 Манипуляции над битами. Строковые операции 10
3.Программирование с использованием MASM 12
3.1 Пакет MASM. Структура программы 13
3.2 Совместное использование языка Ассемблер с другими языками программирования 15
3.3 Команды управления циклами. Команды работы со строками. 16
Заключение 17
Литература 19
К средствам логического преобразования данных относятся логические команды и логические операции. Операнд команды ассемблера в общем случае может представлять собой выражение, которое, в свою очередь, является комбинаций операторов и операндов. Среди этих операторов могут быть и операторы, реализующие логические операции над объектами выражения.
Перед подробным рассмотрением этих средств рассмотрим, что же представляют собой сами логические данные и какие операции над ними производятся.
Теоретической базой для логической обработки данных является формальная логика. Существует несколько систем логики. Одна из наиболее известных – это исчисление высказываний. Высказывание – это любое утверждение, о котором можно сказать, что оно либо истинно, либо ложно.
Исчисление высказываний представляет собой совокупность правил, используемых для определения истинности или ложности некоторой
комбинации высказываний.
Исчисление высказываний очень гармонично сочетается с принципами работы компьютера и основными методами его программирования. Все аппаратные компоненты компьютера построены на логических микросхемах. Система представления информации в компьютере на самом нижнем уровне основана на понятии бита. Бит, имея всего два состояния (0 (ложно) и 1 (истинно)), естественным образом вписывается в исчисление высказываний.
2.2 МАНИПУЛЯЦИИ НАД БИТАМИ. СТРОКОВЫЕ ОПЕРАЦИИ
Строковые операции называют цепочечными или операциями над цепочками байтов.
Строка-это цепочка байтов, для которой известен алгоритм определения ее длины. В языках программирования прописывают процедуру определения длины строки, а также вводят ограничение на то, какие байты могут содержаться в строке, а также в какой кодировке должны интерпретироваться строки- сколько байтов кодирует символ, и какая таблица будет использоваться для сопоставления байтов и символов. В языке Си под строкой понимается последовательность байтов, заканчивающаяся байтом со значением 0.
Строковые операции работают с одним элементом строки: байтом, словом, двойным словом. Для того чтобы команда манипулировала последовательностью таких элементов, используются команды-префиксы:
REP-повторять, пока содержимое ECX не обратится в 0
REPE/REPZ-повторять
пока равно/нуль. Данный префикс
заставляет выполнять
REPNE/REPZ-повторять пока не равно/не нуль. Данный префикс заставляет выполнять строковую команду до тех пор, пока содержимое ECX не обратится в 0
Строковые команды считают, что строка -источник находится по адресу DS: ESI (для нас это просто ESI), а строка-приемникпо адреса ES: EDI (для нас просто EDI). Все строковые команды можно разделить на шесть групп:
1. Команды пересылки
MOVSB - копирование строки байтов.
MOVSW - копирование строки слов.
MOVSD - копирование строки двойных слов
Возможен также формат MOVS приемник, источник-в этом случае
ассемблер по типу операндов сам определяет, какую из трех форм команд следует выбрать. Команда копирует элемент строки из адреса, определяемого ESI, в адрес, определяемый EDI. После выполнения такой команды содержимое ESI и EDI увеличивается (флаг DF=0) или уменьшается (флаг DF=1) на размерах элемента строки
2. Команды сравнения
CMPSB - сравнение строк байтов.
CMPSW - сравнение строк слов.
CMPSD - сравнение строк двойных слов
3. Команды поиска(сканирования)
SCASB - сканирование строки байтов.
SCASW - сканирование строки слов
SCASD - сканирование строки двойных слов
4. Команды чтения из строки
LODSB - чтение байта из строки.
LODSW - чтение слова из строки.
LODSD - чтение двойного слова из строки.
Возможен также формат LODS источник-в этом случае ассемблер по типу операндов сам определяет, какую из трех форм команд следует выбрать. Команда осуществляет копирование из памяти, которая адресуется ESI, элемента в AL, AX или EAX. После выполнения такой команды содержимое EDI увеличивается на размер элемента строки
5. Команда записи в строку
STOSB - запись байта в строку.
Возможен также формат STOS приемник, источник-в этом случае ассемблер по типу операндов сам определяет, какую из трех форм команд следует выбрать. Команда осуществляет копирование в память, которая адресуется EDI, элемента из AL, AX или EAX. После выполнения такой команды содержимое EDI увеличивается на размер элемента строки.
Предикаты сравнения представляют собой функции, которые сравнивают две величины и возвращают однобитовый результат, равный 1, если проверяемое отношение истинно, и 0, если ложно. В этом разделе приводится несколько методов вычисления результата сравнения с размещением его в бите знака (эти методы не используют команд ветвления). Чтобы получить значение 1 или 0, используемое в некоторых языках (например, в C), после вычисления следует использовать команду сдвига вправо на 31 бит. Для
получения результата –1/0, используемого в некоторых других языках (например, Basic),
выполняется команда знакового сдвига вправо на 31 бит.
На таких машинах, как 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 устанавливается, если целочисленный результат слишком длинный для размещения в целевом операнде (регистре или ячейке памяти). Этот флаг показывает наличие переполнения в знаковой целочисленной арифметике.
3.1 ПАКЕТ MASM. СТРУКТУРА ПРОГРАММЫ
В макроассемблер MASM включены директивы, упрощающие определение сегментов программы и, кроме того, предполагающие те же соглашения, которые используются в языках высокого уровня Microsoft. Упрощенные директивы определения сегментов генерируют необходимый код, указывая при этом атрибуты сегментов и порядок их расположения в памяти. Везде в этой книге мы будем использовать именно упрощенные директивы определения сегментов, наиболее важные из которых перечислены далее:
. DATA (. data) — определяет начало инициализированного сегмента данных с именем _DATA и при наличии предыдущего сегмента завершает его. Этой директиве должна предшествовать директива. MODEL.
Сегмент, определенный с атрибутом. DATA,
должен содержать только инициализированные данные, то есть имеющие начальные значения, например,
.data
Val1 DW 11
String1 DB "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, указывающая модель памяти, используемую программой.
. MODEL (. model) модель_памяти [,соглашение_о_вызовах] [,тип_ОС] [,параметр стека] — определяет модель памяти, используемую программой. Директива должна находиться перед любой из директив объявления сегментов. Она связывает определенным образом различные сегменты программы, определяемые ее параметрами tiny, small, compact, medium, large, huge или flat. Параметр модель памяти является обязательным.
Если разрабатывается процедура для включения в программу,
написанную на языке высокого уровня, то должна быть указана та модель памяти, которая используется компилятором языка высокого уровня. Кроме того, модель памяти должна соответствовать режиму работы (типу) процессора. Это имеет значение для плоской модели памяти, которую можно применять только в режимах .386, .486, .586, .686. Модель памяти определяет, какой тип адресации данных и команд поддерживает программа (near или far). Это имеет смысл для команд перехода, вызовов и возврата из процедур.
3.2 СОВМЕСТНОЕ
ИСПОЛЬЗОВАНИЕ ЯЗЫКА АССЕМБЛЕР
С ДРУГИМИ ЯЗЫКАМИ
Языком программирования первого поколения считается машинный код. Машинный код состоит из инструкций, которые компьютер (процессор) может выполнить (а также данных, которые принадлежат этим инструкциям). Программируя на машинном коде, программист должен был писать свою программу в двоичном коде, так что бы процессор мог это понять и исполнить. В сущности, такое программирование требует хорошего знания и понимания аппаратного обеспечения, потому что в процессе программирования необходимо знать, что процессор может сделать, где находятся устройства ввода-вывода (англ. I/O- Input-Output), а также как с ними необходимо общаться и сколько времени будет потрачено на ту или иную операцию. Таким образом, машинный код очень крепко связан с аппаратным обеспечением, на котором соответствующая программа будет работать. На сегодняшний день машинный код из компьютеров никуда не исчез, все действия на низком уровне (уровне аппаратного обеспечения) происходят до сих пор в машинном коде, т.е. на каком бы языке программирования не была написана программа в, конечном итоге она преобразуется в понятный аппаратному обеспечению машинный код.
Информация о работе Отчёт по практике на базе ЧУ ТМК «Мирас»