Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
часть 4 архитектура (ред)2.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
210.25 Кб
Скачать

Задания к практической работе

Задание 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