Скачать 0.78 Mb.
|
Краткие теоретические и учебно-методические материалы по теме практической работы Процессор способен выполнять команды, находящиеся в памяти в виде двоичных кодов. В процессорах iх86 длина команды может составлять от 1 до 12 байт. Первый байт команды содержит код операции, а также некоторую дополнительную информацию (например, о длине обрабатываемых данных). Данные, подлежащие обработке, называются операндами. Каждый операнд может представлять собой байт или слово и находиться в регистре общего назначения или в памяти. Кроме того, существуют команды, использующие в качестве операндов последовательности байтов или слов (строки). Разрабатывать программу, записывая все команды непосредственно в двоичной кодировке, очень трудно. С другой стороны, языки программирования высокого уровня, такие, как Паскаль или Си, намного облегчают написание программ, но они не дают доступа ко всем ресурсам компьютера; размер получаемого кода оказывается значительным. «Золотой серединой» здесь оказывается язык Ассемблер. В этом языке каждой команде процессора соответствует мнемонический код (или мнемокод), т.е. код, удобный для запоминания. Кроме кодов команд, Ассемблер содержит директивы, т.е. служебные инструкции, определяющие формат программы, данных и т.п. Существуют как самостоятельные Ассемблер-системы, так и встроенные в языки высокого уровня (например, в системе Borland Pascal). Использование регистров процессора Регистр – специально отведенная память для временного хранения каких-то данных. Микропроцессоры i8086 имеют 14 регистров. Таблица 6.1 – Регистры данных (регистры общего назначения, РОН)
РОН могут использоваться программистом по своему усмотрению (за исключением некоторых случаев). В них можно хранить любые данные: числа, адреса и пр. В верхнем ряду таблицы 6.1 находятся шестнадцатиразрядные регистры, которые могут хранить числа от 0 до 65535 или от 0h до FFFFh в шестнадцатеричной системе счисления. В следующей строке расположен ряд восьмиразрядных регистров. В них можно загружать максимальное число 255 (FFh). Они представляют собой старшую (High) и младшую (Low) половинки шестнадцатиразрядных регистров. Таблица 6.2 – Регистры-указатели
Регистры SI и DI используются в строковых операциях. Таблица 6.3 – Сегментные регистры
Сегментные регистры необходимы для обращения к тому или иному сегменту памяти. Команды пересылки данных и загрузки Таблица 6.4 – Команды пересылки данных, загрузки адресов
Команда MOV (to move – передвигать, перемещать) осуществляет пересылку байта или слова из источника (это второй операнд, «op2») в место назначения (первый операнд, он же операнд-получатель, «op1»). В качестве источника и получателя могут служить РОН, индексный или сегментный регистр, ячейка памяти. Источником могут также являться данные (константа), непосредственно указанные в команде. Пример MOV AX, 5050 – записать число 5050 в регистр АХ. MOV AX, BX – переместить число из регистра ВХ в регистр АХ. Команда XCHG (to exchange – переставлять) осуществляет обмен байтами или словами между своими операндами (РОН, индексные регистры, память). Сегментные регистры не могут использоваться при обмене. В этих командах, как и многих других двухоперандных командах рассматриваемых МП, недопустимы сочетания операндов типа «память-память», что представляет определённые неудобства при программировании. Команда LEA (Load Executable Address) носит название «загрузить исполнительный адрес». По этой команде извлекается не сам операнд, а его исполнительный адрес. Действие команды состоит в передаче вычисленного 16-разрядного адреса (внутрисегментного смещения) операнда в 16-разрядный регистр. Арифметические команды В классической системе команд 8086-совместимых процессоров существуют все четыре арифметические действия – сложение, вычитание, умножение, деление над 8- и 16-разрядными данными, представляющими целые числа. Таблица 6.5 – Арифметические команды
Команда ADD (addition) выполняет сложение операнда-источника («op2») с операндом места назначения («op1»). Операндами могут быть регистры и ячейки памяти, причём в качестве источника может быть указано число (константа). Команда SUB (subtraction) выполняет вычитание операнда-источника из операнда-получателя (op1-op2), записывая результат на место первого операнда. Опять же могут быть использованы регистры, память; вычитаемое может быть константой. Операции «память-память» в этих командах недопустимы, то есть нельзя указывать ссылку на ячейку памяти одновременно и в первом и во втором операнде. Если это необходимо согласно алгоритму решения задачи, следует использовать операцию «регистр-память», а затем переслать (командой MOV) результат из указанного регистра в другую ячейку памяти. Команда инкремента INC увеличивает свой единственный операнд на единицу, команда декремента DEC – уменьшает. Эти команды удобно применять, например, в цикле при необходимости наращивания или уменьшения какого-либо счётчика, адреса и т.п. Команда MUL (multiplication), осуществляющая умножение, более сложна в использовании. Она имеет лишь один операнд – первый множитель. Где указывается второй и где окажется результат зависит от того, будет ли работать команда со словом или с байтом. Пусть в качестве единственного операнда указан регистр или ячейка размером в байт (например, MUL CL). Тогда второй множитель (тоже байт) берётся обязательно из регистра AL, а результат (16-разрядный, т.е. длиной в слово) окажется в регистре AX: AX ← AL*op. Если же операнд «op» взят 16-разрядным (например, MUL CX), то команда выполнит следующее действие: DXAX ← AX*op, то есть второй множитель, также 16-разрядный, будет автоматически взят из регистра AX, а результат размером в двойное слово, т.е. 32-разрядный, окажется в регистровой паре, состоящей из DX и AX. Команда деления DIV работает следующим образом. Как и в команде MUL, здесь указывается единственный операнд, который является делителем. Этот делитель опять же может быть словом или байтом. Если «op» – байт, то команда выполняется как ((AH-остаток) и (AL-частное)) ← AX/op, то есть делимое берётся из 16-разрядного регистра AX, 8-разрядное частное оказывается записанным в AL, остаток такой же размерности – в AH. Если же «op» – 16-разрядное слово, то МП выполнит команду как ((DX-остаток) и (AX-частное)) ← DXAX/op, то есть 32-разрядное делимое будет взято из регистровой пары DXAX, частное окажется в AX, остаток – в DX (оба – 16-разрядные). Примеры разработки программ Задание: записать во все РОН целое число 5050. Данное нам число – это константа. Для записи констант в какие-либо регистры в нашем распоряжении есть команда MOV (таблица 6.4). Число 5050 превосходит максимальное значение для байта (255), но меньше максимального значения для машинного слова (65535). Следовательно, будем использовать 16-разрядные регистры. Программа будет выглядеть так: MOV AX, 5050 MOV BX, AX MOV CX, AX MOV DX, AX Задание: вычислить выражение (25*7+137*5-60) и результат оставить в регистре AX. Из рассмотрения данного выражения следует, что нам понадобятся команды ADD (сложить), MUL (умножить), SUB (вычесть), приведённые в таблице 6.5, а также MOV (переслать). Получим сначала произведение 25*7 и сохраним его; затем получим произведение 137*5 и сложим оба частичных результата; вычтем 60 из того, что получилось. Приходим к программе: MOV AL, 25 ; записать в AL число 25 MOV DL, 7 ; записать в DL число 7 MUL DL ; теперь AX = 25*7 MOV BX, AX ; копировать из АХ в ВХ, теперь BX = 25*7 MOV AL, 137 MOV DL, 5 MUL DL ; AX = 137*5 ADD AX, BX ; AX = 25*7 + 137* 5 SUB AX, 60 ; AX уменьшен на 60 Задания для практической работы 1 Составить таблицу «Регистры процессора» с указанием названия регистра и его назначения. 2 Составить таблицу «Команды Ассемблера» с указанием названия команды, ее мнемокода и выполняемого действия. 3 Разработать программу на языке Ассемблер для вычисления арифметического выражения (таблица 6.6) и сохранения результата в указанном регистре. Таблица 6.6 – Таблица вариантов
Контрольные вопросы 1 Что называется операндом и мнемокодом? 2 Что такое регистры процессора? Для чего используются регистры общего назначения? 3 Чем отличаются команды ADD и INC? 4 Какое сочетание операндов недопустимо для большинства двухоперандных команд Ассемблера? Практическое занятие № 7 «Изучение системы команд Ассемблера. Команды обработки строк данных и команды организации циклов» Цель работы: изучить команды обработки строк данных и организации циклов. Студент должен уметь: составлять программы на языке Ассемблера для выполнения задач на обработку строк данных; знать: работу команд обработки строк данных и организации циклов. Краткие теоретические и учебно-методические материалы по теме практической работы Команды обработки строк данных Строка – это последовательность байтов или слов, размещаемых в смежных ячейках памяти. Таблица 7.1 – Команды обработки строк
Если обрабатываемая строка состоит из 16-разрядных машинных слов, то применяется мнемокоды команд без буквы “B” на конце (например, LODS); если строка состоит из байтов, то – мнемокоды команд с буквой “B” (например, LODSB). Операнды команд после из мнемокодов, как правило, не указываются; везде используется неявная адресация. Команда MOVS, MOVSB (move strings) – это пересылка элемента строки из одной области памяти в другую (в отличие от MOV, которая не может выполнять пересылки «память-память»). Строка-источник адресуется регистрами DS:SI (то есть находится в сегменте памяти, на который указывает DS, и имеет смещение, находящееся в SI), строка-получатель – регистрами ES:DI. Таким образом, строка-получатель размещается в дополнительном сегменте данных, если только значения DS и ES не равны. Содержимое индексных регистров SI и DI во время работы строковых команд не остаётся неизменным – оно также изменяется автоматически в соответствии с правилом SI←SI+delta, DI←DI+delta. Здесь delta=1 для байтовых строк и delta=2 для строк, состоящих из 16-разрядных машинных слов. В ряде случаев возникает необходимость в пересылке строки в обратном порядке, начиная не с первого, а с последнего элемента. Содержимое индексных регистров при этом должно не увеличиваться, а уменьшаться. Направление изменения содержимого задаётся с помощью флага DF в регистре FLAGS микропроцессора: при DF=0 используется «плюс», при DF=1 – «минус». Сам же флаг DF управляется специальными командами: CLD (сбросить флаг, это значение по умолчанию) и STD (установить флаг). Команда LODS, LODSB (load from string). Команда осуществляет загрузку элемента строки (слова или байта) в регистр AX или AL соответственно. Строка адресуется с помощью регистров DS:SI. Команда STOS, STOSB (store to string). С помощью этой команды производится заполнение строки словом (байтом) из регистра АХ или AL соответственно. Заполняемая строка адресуется с помощью регистров ES:DI. Команда SCAS, SCASB (scan string). Эта команда используется для так называемого «сканирования» одной строки в поисках нужного элемента (слова или байта). В процессе работы команды осуществляется сравнение элемента строки, расположенного по адресу ES:DI, со значением в регистре AX (или AL) путём вычитания; результат вычитания не фиксируется, но устанавливаются соответствующие флаги. Как и при выполнении прочих строковых команд, производится автоинкрементирование (либо автодекрементирование) регистра DI. Команда CMPS, CMPSB (compare strings). Команда осуществляет поэлементное сравнение элементов двух строк (слов или байтов), одна из которых, как и прежде, расположена в памяти по адресу в регистрах DS:SI, вторая – по адресу в ES:DI. При выполнении этой команды производится вычитание элемента строки с адресом в SI из элемента строки с адресом в DI; результат вычитания никуда не записывается, но зато устанавливаются соответствующие флаги. ZF – флаг нуля. Устанавливается в 1, если результат предыдущей команды – ноль. Команды организации циклов При работе на Ассемблере можно организовать циклы, используя команды условных переходов. Однако, кроме этого, 8086-совместимые МП предоставляют в распоряжение программиста специальные команды циклов LOOP, LOOPNZ, LOOPZ. Все эти команды используют метку, расположенную выше по программе. Часть программы между меткой и какой-либо из рассматриваемых команд и есть тело цикла. Перед входом в цикл следует записать в регистр CX число повторений цикла. Каждый раз при очередном повторении тела цикла процессор будет автоматически вычитать единицу их СХ. Цикл закончится, если: - СХ будет равен 0 (для команды LOOP); - СХ будет равен 0 или флаг ZF будет равен 1 (для команды LOOPNZ); - СХ будет равен 0 или флаг ZF будет равен 0 (для команды LOOPZ). Для организации циклов при работе со строковыми командами имеются специальные команды-префиксы REP (repeat), REPE, REPNE. Они записываются перед основной командой (например, REP MOVSB) и обеспечивают её выполнение не один, а несколько раз, организуя по сути дела аппаратный (очень быстрый) цикл. Число повторений предварительно записывается в CX и на каждом шаге содержимое CX автоматически уменьшается на 1. Префикс REP («повторять, пока не обнулится счётчик») анализирует только одно условие окончания повторений, а именно CX = 0. Префикс REPE («повторять, пока равно») анализирует следующее составное условие окончания повторений: (CX = 0) ИЛИ (ZF = 0). Префикс REPNE («повторять, пока не равно») в качестве условия окончания повторений использует следующее: (CX = 0) ИЛИ (ZF = 1). Примеры программ Пример 1: вычислить сумму 1+2+…+19+20 и записать результат в регистр SI. Удобно программировать вычисление этой суммы в обратном порядке, т.е. начиная с 20 – тогда можно воспользоваться регистром с убывающим содержимым. В данном случае нам подходит цикл LOOP со счетчиком в CX – ведь его содержимое как раз уменьшается на каждой итерации цикла. MOV AX, 0 ; будем накапливать сумму в АХ MOV CX, 20 ; подготовим счётчик цикла MET: ; этой меткой обозначено начало цикла ADD AX, CX ; прибавляем очередное слагаемое LOOP MET ; переход на начало цикла, если СХ не равно нулю MOV SI, AX ; выдадим результат. Пример 2: Дан массив из трех байтов. Получить другой массив, в котором каждый элемент первого массива увеличен на 5. Рассматривая массив как строку байтов, разместим исходные данные в сегменте данных (DS) с адреса 0000h, а результат – в дополнительном сегменте (ES) также с адреса 0000h. MOV SI, 0 ; начальное значение для LODS (источник данных) MOV DI, 0 ; начальное значение для STOS (приемник) MOV CX, 3 ; в нашем примере – три исходных элемента MET: LODSB ; загрузим очередной байт массива в AL ADD AL, 5 ; обработаем его, как указано в задаче STOSB ; запишем обработанный байт в массив результата LOOP MET |
Практическая работа №1 «Изучение организации бесперебойного питания пк» Практическая работа №3 «Изучение типов современных процессоров и их характеристик» |
Практическая работа №1 «Изучение организации бесперебойного питания пк» Практическая работа №3 «Изучение типов современных процессоров и их характеристик» |
||
Практическая работа №1 «Изучение методов конфигурирования сетей доступа» Практическая работа №2 «Изучение методов отбора, подготовки и контроля линии под технологию adsl» |
Лабораторная работа №10. Изучение принципа действия и функциональной... Лабораторная работа № Изучение принципов построения системы автоматической подстройки частоты (апч) радиолокационной станции |
||
Лабораторная работа Изучение принципов функционирования простейшей микроэвм и процессора Лабораторная работа Изучение принципов функционирования простейшей микроэвм и процессора I8085A при реализации программы |
Урок Практическая работа №4 «Получение аммиака и изучение его свойств» Цели урока Цели урока: получения аммиака изучение его свойства через проведение практической работы |
||
Методические указания к лабораторным работам Рязань 2013 ... |
Курсовая работа Целью работы является детальное изучение бережливого производства, его принципов, инструментов, их характеристик, а также возможностей... |
||
Практическая работа №1 «Работа с нормативными документами» ... |
Урок информатики по теме "Системы счисления. Позиционные и непозиционные... Формирование представлений об информации как одного из трех основополагающих понятий науки — вещества, энергии, информации, на основе... |
||
Описание практической работы №2 создание шаблона сайта Цель работы: изучение и освоение принципов работы с html тегами, их атрибутами и умение создавать базовые элементы web–страницы |
Методические указания к выполнению лабораторных работ по дисциплине радиолокационные системы Лабораторная работа №1 «Изучение принципов построения штатной радиолокационной киа» |
||
Практическая работа №1 «Изучение видов интерфейсов и их характеристик» Профессиональный модуль «Применение микропроцессорных систем, установка и настройка периферийного оборудования» |
Практическая работа №1 «Расчет срока окупаемости капитальных вложений... Практическая работа №2 «Задача выбора поставщика и ее решениена основе анализа полной стоимости» |
||
Практическая работа №5. Составление инструкции «Аккумуляторщик» ... |
Практическая работа №1 «Технология строительства воздушных линий связи» Практическая работа №9 «Технология ввода кабелей в здание атс. Оборудование шахт» |
Поиск |