- •«Тюменский государственный нефтегазовый университет» Институт кибернетики информатики и связи
- •Архитектура компьютерных систем
- •230115 Программирование в компьютерных системах
- •Аннотация
- •Содержание
- •Пояснительная записка
- •Критерии оценки практических работ
- •Задания к практической работе
- •Контрольные вопросы и задания
- •Практическая работа №12
- •Теоретические сведения
- •Задания к практической работе
- •Контрольные вопросы и задания
- •Практическая работа №13
- •Теоретические сведения
- •Задания к практической работе
- •Контрольные вопросы:
- •Список литературы
- •Учебное издание архитектура компьютерных систем
- •Библиотечно-издательский комплекс
- •625000, Тюмень, ул. Володарского, 38. Типография библиотечно-издательского комплекса.
- •625039, Тюмень, ул. Киевская, 52.
Задания к практической работе
Задание 1: Запустите эмулятор EMU8086.
Задание 2: Пользуясь правилами оформления ассемблерных программ, наберите код, приведенный в данном задании.
CSEG segment
Org 100h
Begin
Mov ah,9
Mov dx, offset msg
Int 21h
Int 20h
Msg db ‘Привет $’
Int 20h
CSEG ends
End Begin
Запустите программу на выполнение (кнопка Run).
Задание 3: Вернитесь в главное окно формы, предварительно закрыв все открытые окна, далее нажмите кнопку “Compile”.
Задание 4: Создайте на языке Pascal программу, выводящую на экран слово “Привет” и сравните размеры получаемых файлов (Pascal и Assembler). Напишите в тетради вывод о размерах полученных файлов и причине разницы (если она есть).
Задание 5: Напишите программу, выводящую вашу фамилию (по аналогии с предыдущим заданием).
Задание 6: Исходя из примеров, приведённых в теоретическом материале, самостоятельно напишите программы, выполняющие следующие операции:
Вариант 1: 1) 127+8-30; 2)10102-710+816
Вариант 2: 1) 21-4+16; 2)1112-210+1416
Вариант 3: 1) 40-11+6; 2)2116-1210+11012
Вариант 4: 1) 12+48-34; 2)4210-А116+11112
Вариант 5: 1) 60-18+4; 2)5D16+1012-310
Вариант 6: 1) 119+14-6; 2)110102+310-616
Вариант 7: 1) 31+33-60; 2)B216-310+1012
Вариант 8: 1) 21-6+4; 2)1010012-816+4610
Вариант 9: 1) 1+84-23; 2)1310-1316+10101012
Вариант 10: 1) 93-28+2; 2)11816-1610+111012
Запишите полученные листинги программ в тетрадь.
Контрольные вопросы и задания
1) Какова структура ассемблерной программы?
2) С какой целью в код программы на ассемблере для DOS вводится строка ORG 100h?
3) Каково назначение команды MOV?
4) Каковы основные отличия ассемблерных программ от языков высокого уровня?
5) Каковы правила оформления программ на языке ассемблера?
6) Опишите основные моменты создания исполняемого файла и эмуляции работы программы.
7) Каковы основные возможности эмулятора EMU8086?
8) Опишите функции add, sub, inc, dec и их применение.
9) Опишите методы борьбы с зависаниями.
Рекомендуемая литература: 1[361-408], 2[148-175],3[18-207].
Практическая работа №13
Тема: Логические операторы и циклы на языке Assembler
Цель работы:
- формирование практических навыков работы со структурой и реализации циклов в программе.
- закрепление знаний об условиях организации циклических переходов на языке Ассемблера.
- формирование практических навыков работы с командами логических операций: and, or, xor, not.
Вид работы: индивидуальный.
Время выполнения: 4 часа
Теоретические сведения
Циклы, позволяющие выполнить некоторый участок программы многократно, в любом языке являются одной из наиболее употребительных конструкций. В системе команд МП 86 циклы реализуются, главным образом, с помощью команды loop (петля), хотя имеются и другие способы организации циклов. В большинстве случаях число шагов в цикле определяется содержимым регистра СХ, поэтому максимальное число шагов составляет 64 К.
Организация циклических переходов, как на языках высокого уровня, так и на языке assembler представляет собой замечательное средство, позволяющее значительно снизить код исполняемой программы.
В общем виде любой цикл записывается в ассемблере как условный переход.
Команда loop (анг. петля) выполняет декремент содержимого регистра СХ (счетчик), и если оно не равно 0, осуществляет переход на указанную метку вперед или назад в том же программном сегменте в диапазоне -128... + 127 байт. Обычно метка помещается перед первым предложением тела цикла, а команда loop является последней командой цикла. Содержимое регистра СХ рассматривается как целое число без знака, поэтому максимальное число повторений группы включенных в цикл команд составляет 65536 (если перед входом в цикл СХ=0). Команда не воздействует на флаги процессора.
Команда jmp передает управление в указанную точку того же или другого программного сегмента. Адрес возврата не сохраняется. Команда не воздействует на флаги процессора.
Команда jmp имеет пять разновидностей:
1) переход прямой короткий (в пределах -128... + 127 байтов);
2) переход прямой ближний (в пределах текущего программного сегмента);
3) переход прямой дальний (в другой программный сегмент);
4) переход косвенный ближний;
5) переход косвенный дальний.
Все разновидности переходов имеют одну и ту же мнемонику jmp, хотя и различающиеся коды операций. Во многих случаях транслятор может определить вид перехода по контексту, в тех же случаях, когда это невозможно, следует использовать атрибутные операторы (short - прямой короткий переход; near ptr - прямой ближний переход; far ptr - прямой дальний переход; word ptr - косвенный ближний переход; dword ptr - косвенный дальний переход).
.model tiny ;модель памяти, в которой сегменты кода, данных и стека объединены.
.code ;сегмент кода, который содержит данные.
org 100h ; начало СОМ-файла
begin: ;метка начала кода программы
label1: ;создаем метку
mov ah,9 ;помещаем номер функции DOS «вывод строки» в регистр АН.
mov dx,offset String ;помещает в регистр DX смещение метки String относительно начала сегмента данных
int 21h ;функция DOS "вывод строки"
jmp Label1 ; переход на строку с меткой Label1
add cx,12 ;прибавить к значению регистра cx число 12
(данная команда не выполняется)
dec cx ;уменьшить значение регистра cx на 1
(данная команда не выполняется)
ret ;функция DOS "завершить программу"
string db "PRIVET",13,10,'$' ;cтрока с содержащая выводимые данные.
end begin ; метка окончания кода программы
В результате работы программы будет зациклен блок строк между Label1 и jmp Label1.
Комбинированная работа команд dec и jnz уменьшает содержимое регистра cx на 1 и выполняет переход на метку, если в cx не равен нулю. Команда dec, кроме того, устанавливает флаг нуля во флаговом регистре в состояние 0 или 1. Команда jnz затем проверяет эту установку.
Аналогично командам jmp и loop операнд в команде jnz содержит значение расстояния между концом команды jnz и адресом перехода (label1), которое прибавляется к командному указателю. Это расстояние должно быть в пределах от -128 до +127 байт.
Следующий пример будет работать так же, как и предыдущая программа, только быстрее.
.model tiny ; модель памяти, в которой сегменты кода, данных и стека объединены.
.code ; сегмент кода, который содержит данные.
org 100h ; начало СОМ-файла
begin: ; метка начала кода программы
mov cx,10 ; загружаем в (регистр-счетчик) CX количество повторов (отсчет будет идти от 10 до 0)
Label1: ; создаем метку (Label - метка).
mov ah,9 ; помещаем номер функции DOS «вывод строки» в регистр АН.
mov dx,offset String ;помещает в регистр DX смещение метки String относительно начала сегмента данных
int 21h ; функция DOS "вывод строки"
dec cx ; оператор DEC уменьшает на единицу CX и, если он не равен нулю, переходит на метку Label1
jnz Label1 ; условный переход на строку с меткой Label1
ret ; функция DOS "завершить программу"
string db 'privet ',13,10, '$' ; cтрока с содержащая выводимые данные
end begin ; метка окончания кода программы
Логические операции являются важным элементом в проектировании микросхем и имеют много общего в логике программирования. Команды AND, OR, XOR и TEST - являются командами логических операций. Эти команды используются для сброса и установки бит и для арифметических операций в коде ASCII.
Команда AND (Логическое И) осуществляет логическое (побитовое) умножение первого операнда на второй. Исходное значение первого операнда (приемника) теряется, замещаясь результатом умножения. В качестве первого операнда команды and можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Пример написания:
And ax, bx ; ax=ax˄bx
Команда OR (логическое «включающее или») выполняет операцию логического (побитового) сложения двух операндов. Результат замещает первый операнд (приемник); второй операнд (источник) не изменяется. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды команды OR могут быть байтами или словами. Пример написания:
Or al, dl ; al= al˅dl
Команда ХОR (логическое «исключающее или») выполняет операцию логического (побитового) «исключающее или» над своими двумя операндами. Результат операции замещает первый операнд; второй операнд не изменяется. Каждый бит результата устанавливается в 1, если соответствующие биты операндов различны, и сбрасывается в 0, если соответствующие биты операндов совпадают. Проще говоря, совпадающие биты обнуляются, а несовпадающие остаются без изменений. Пример написания:
Xor si, di ; si = ¬(si˅di)
В качестве первого операнда команды ХОR можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами.
Команда NOT (NOT Инверсия, дополнение до 1, логическое отрицание) выполняет инверсию битов указанного операнда, заменяя 0 на 1 и наоборот. В качестве операнда можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда не воздействует на флаги процессора. Пример написания:
Not al ; al= ¬al
