Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Архитектура ЭВМ и систем. Лабораторная работа. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
Команды логических операций
Все операции, кроме NOT, влияют на состояние регистра флагов.
NOT. Унарная операция «отрицание». Инвертирует значения
разрядов операнда.
mov al,01010101B not al ;al = 10101010B
AND. Бинарная операция «конъюнкция», или «логическое ум­ножение». Выполняет поразрядное умножение первого операнда на второй. Результат помещается в первый.
mov al,01010101B and al,00001111B ;al = 00000101B
OR. Бинарная операция «дизъюнкция». Данный разряд
в ре-
зультате устанавливается равным 1, если соответствующий разряд хотя бы одного из операндов ненулевой. Вычисленное значение по­мещается в первый операнд.
mov al,01010101B mov bl,00001111B or al,bl ;al = 01011111B
XOR. Бинарная операция «исключающее или». Складывает операнды поразрядно по модулю два (b бит результата, b
1
– i-ый бит первого операнда, b
i
r
= (b
i
1
2
+b
) mod 2, где b
i
i
2
– i-ый бит второго
i
r
– i-ый
i
операнда). Данный разряд в результате устанавливается равным 1, если соответствующий разряд хотя бы одного из операндов ненуле­вой. Вычисленное значение помещается в первый операнд.
mov al,01010101B mov bl,00001111B xor al,bl ;al = 01011010B
31
TEST. Бинарная операция «неразрушающая конъюнкция». Дей­ствует аналогично операции AND, но не изменяет значение операн­дов, влияя лишь на состояние регистра флагов. Применяется часто для проверки состояния битов значений.
mov al,01010101B test al,1 ;проверим бит 0 jz label1 ;ZF = 0, перехода не будет test al,2 ;проверим бит 1 jz label2 ;ZF = 1, будет переход
CMP. Бинарная операция сравнения. Сравнивает значение пер­вого
операнда со значением второго. Используется для организации
логических конструкций.
mov al,-1 cmp al,-2 ;-1 больше, чем –2 ? jg label1 ;да, переход
Команды передачи управления
Наличие сегментной организации памяти определяет два типа команд передачи управления: внутрисегментные, или ближнего пе­рехода, и межсегментные, или дальнего перехода. Первый вид изме­няет только значение регистра-указателя команд IP/EIP,
второго – также и сегментного регистра кода CS. Пара CS:IP/EIP задает адрес выбираемой из памяти очередной команды. При изменении после­довательного порядка выполнения содержимое конвейера команд процессора сбрасывается и выборка начинается с нового адреса, на который произошел переход.
Команды безусловного перехода
Имеют общую мнемонику JMP. Существует пять типов такой
команды, которые отличаются дальностью и
расположением точки
перехода.
32
JMP rel8. Команда внутрисегментного перехода. Параметр оп­ределяет смещение, задаваемое относительно адреса текущей точки выполнения программы. Его размер равен одному байту и может принимать значения от –128 до +127. Если значение положительное, то переход осуществляется вперед, если отрицательное – то назад. При вычислении адреса rel8 расширяется до 16 или 32 бит. Для ука­зания такого типа команды используется
модификатор SHORT. Ас­семблер сам вычисляет смещение до метки, заданной в качестве па­раметра команды.
jmp short label1 ;перейти на метку label1 jmp short $+10 ;перейти на команду, отстоящую
;от начала команды перехода на ;10 байт
JMP rel16/32. Команда внутрисегментного перехода. Позволяет адресовать любую точку внутри сегмента. Смещение является отно­сительной величиной размером 16 или 32 бита
. Адрес перехода вы­числяется путем сложения смещения с адресом текущей команды. Для задания такого типа перехода употребляется модификатор
NEAR.
jmp near label2 ;ближний переход на метку label2 jmp near $-100 ;перейти на команду, отстоящую
;от начала команды перехода на ;100 байт назад
JMP reg/mem. Команда косвенного внутрисегментного перехо-
да загружает в регистр IP/EIP содержимое регистра или памяти, ука
-
занной в качестве параметра.
jmp ax ;ближний переход по адресу
из ax
jmp word ptr [bx] ;перейти по адресу в ячейке
;памяти, указываемой bx
JMP ptr. Команда прямого межсегментного перехода имеет в
качестве параметра дальний указатель на назначенную точку. Даль-
33
ний указатель состоит из значения сегмента и смещения. Изменяет регистры CS и IP/EIP.
jmp far fl ;переход на метку в другом
;сегменте
jmp dword ptr [bx] ;перейти по дальнему
;адресу в ячейке памяти, ;указываемой bx
Команды перехода по условию
Команды условного перехода позволяют осуществлять провер­ку всех соотношений между знаковыми (больше – меньше) и без­знаковыми значениями (
выше – ниже), а также проверять значение всех арифметических флажков регистра состояния, кроме AF. Неко­торые команды имеют две мнемоники, облегчающие программисту выбор нужной команды по ситуации. В процессоре 8086 размер смещения перехода был равен 8 битам. Для i486 он может состав­лять 16 и 32 бита.
ja/jnbe ;выше/не ниже или равно jae/jnbe ;выше или равно/не
ниже jb/jnae ;ниже/не выше или равно jbe/jna ;ниже или равно/не выше jc ;есть перенос je/jz ;равно/нуль jg/jnle ;больше/не меньше или равно jge/jnl ;больше или равно/не меньше jnc ;нет переноса jne/jnz ;не равно/не нуль jno ;нет переполнения jnp/jpo ;нет паритета/паритет нечетный jns ;нет знака jo ;есть переполнение jp/jpe ;есть паритет/паритет
нечетный js ;есть знак (отрицательный) jcxz ;cx равен нулю jecxz ;ecx равен нулю
34
Команды организации циклов
Команды организации цикла используют в качестве счетчика регистр cx/ecx. Каждый раз перед новой итерацией проверяется его значение. Если оно равно нулю, тогда цикл больше не повторяется и выполняется следующая за ним команда. Если не так, то его значе­ние уменьшается на 1 и осуществляется переход в начало цикла, за­даваемое меткой-параметром. Команда LOOP осуществляет безус­ловный переход, проверяя только содержимое cx. Команда LOOPE/LOOPZ дополнительно проверяет, не равен ли флаг ZF еди­нице. Если да, тогда выполнение цикла продолжается. Команда LOOPNE/LOOPNZ также проверяет флаг нуля. Цикл продолжается, если он не установлен.
mov cx,10 ;десять повторов mov al,0 ;будем заполнять нулем lea bx,[array] ;адрес массива
while1:
mov [bx],al ;записать
очередной элемент inc bx ;следующий элемент массива loop while1 ;переход к началу цикла
десять
;раз
Команды вызова и возврата из подпрограмм
При вызове подпрограммы командой CALL адрес команды, следующей за командой вызова, сохраняется в стеке. При возврате из подпрограммы по команде RET он выбирается и помещается в
IP/EIP (CS:IP/EIP). Команда CALL имеет те же разновидности (
ближний и дальний, прямой и косвенный переходы), что и команда
JMP. Отсутствует только короткий переход SHORT.
Команда RET для возврата из дальней процедуры имеет мнемо­нику RETF и выбирает из стека сегмент и смещение. В ближней процедуре используется RETN, которая выбирает только смещение из стека. RET указывает использовать тип возврата по умолчанию.
call near ptr sum ;вызвать ближнюю
;подпрограмму вычисления
35
;суммы sum
call far ptr cos ;вызвать дальнюю
;подпрограмму вычисления ;косинуса cos
call word ptr [bx] ;вызвать ближнюю процедуру,
;на адрес которой ;указывает bx
call word ptr [si] ;вызвать ближнюю процедуру,
;на адрес которой ;указывает si
call ax ;вызвать ближнюю процедуру,
;адрес которой находится в ax
ret ;вернуться из подпрограммы
Команды прерываний
Для вызова прерываний процессор i486 использует три коман­ды: INT n (вызов
прерывания с заданным номером) и INTO (вызов прерывания, если есть переполнение). Когда происходит прерыва­ние, в стеке сохраняется дальний указатель на адрес возврата и реги­стра флагов. Команда IRET (возврат из прерывания) восстанавлива­ет из стека состояние флажков и выбирает адрес возврата.
mov ah,9 ;номер функции вывода на экран lea dx,msg ;dx = адрес сообщения int 21H ;вызвать
прерывание 21H – функция
;вывода строки на экран
Задания для выполнения
Задание № 1. Написать программу, содержащую процедуру,
выполняющую следующие действия (по вариантам).
1. Копирование массива, указываемого регистром bx в массив, адрес
которого содержится в dx. Количество элементов задается регистром cx.
36
2. Копирование строки, оканчивающейся нулем с адресом в регист-
ре ax в буфер, адрес которого задается регистром dx.
3. Перевод содержимого строки английского текста из нижнего ре-
гистра в верхний. Строка оканчивается символом «$". Адрес зада­ется в регистре si. Большие и малые английские буквы отличают­ся только битом 5. Код буквы "a" равен 61H, а символа "A" – 41H.
4.
Заполнение массива слов. Адрес массива передается через di, ко-
личество элементов – через cx, записываемое значение через ax.
5. Вычисление суммы элементов массива. Адрес массива передается
через di, количество элементов – через cx. Сумма возвращается в ax.
6. Поиск максимального элемента в массиве. Адрес массива переда-
ется через di, количество элементов – через cx. Значение макси­мального элемента возвращается в ax.
7.
Поиск минимального элемента в массиве. Адрес массива переда­ется через bx, количество элементов – через cx. Значение мини­мального элемента возвращается в ax.
8. Вычисление среднего значения элементов массива. Адрес массива
передается через bx, количество элементов – через cx. Значение – в ax.
9. Вычисление произведения элементов массива. Адрес массива пе-
редается через si, количество элементов – через cx. Значение – в ax.
10. Вычисление
отношения максимального элемента массива к ми-
нимальному. Адрес массива передается через si, количество эле­ментов – через cx. Значение – в ax.
11. Копирование всех заглавных букв английского текста в отдель-
ный буфер. Адрес строки задается через si, адрес буфера – через
di. Строка оканчивается нулем.
12. Копирование всех строчных букв английского текста в отдель-
ный буфер. Адрес
строки задается через si, адрес буферачерез
di. Строка оканчивается нулем.
13. Подсчет заданного символа в строке. Символ задается в регистре
al. Адрес строки, заканчивающейся нулем, – в регистре bx. Ко­личество символов возвращается в ax.
14. Подсчет элементов массива, меньших заданного значения. Адрес
массива передается через dx, количество элементов – через cx. Подсчитанное количество возвращается в ax.
37
15. Подсчет элементов массива, больших заданного значения или
равных ему. Адрес массива передается через dx, количество эле­ментов – через cx. Подсчитанное количество возвращается в ax.
16. Вычислить сумму квадратов элементов массива. Адрес массива
передается через dx, количество элементов – через cx. Рассчи­танное значение возвращается в ax.
17. Определить модуль разности максимального и минимального
элементов массива. Адрес массива
передается через si, количе-
ство элементов – через cx. Значение возвращается в ax.
18. Определить, сколько минимальных элементов содержит массив
байтов. Адрес массива передается через si, количество элементов – через cx. Значение возвращается в ax.
19. Определить, сколько положительных элементов содержит мас-
сив. Адрес массива передается через si, количество элементов – через cx. Значение возвращается в ax.
20. Определить, сколько максимальных элементов
содержит массив. Адрес массива передается через si, количество элементов – через cx. Значение максимального элемента возвращается в ax. Коли­чество – в cx.
Контрольные вопросы
1. Что такое неявная адресация? Приведите примеры.
2. Что такое регистровая адресация? Приведите примеры.
3. Что такое непосредственная адресация? Приведите примеры.
4. Какие команды используются для работы с портами? Каким
обра-
зом адресуются порты. Приведите примеры.
5. Что такое прямая адресация? Приведите примеры.
6. Что такое базовая адресация? Приведите примеры.
7. Что такое базовая адресация со смещением? Приведите примеры.
8. Что такое индексная адресация со смещением? Приведите
примеры.
9. Что такое базовая индексная адресация со смещением? Приведите
примеры.
10. Какие регистры
могут использоваться в качестве базы и в каче-
стве индекса?
11. Что такое масштабирование? При каком виде адресации оно
может использоваться? Приведите примеры.
38
12. При использовании каких регистров в качестве базы какой сег-
мент считается текущим?
13. Какие директивы используются для указания ассемблеру разме-
ра операнда в памяти?
14. Что такое стек? Каким образом он организован в процессоре
i486?
15. Каким образом осуществляется адресация стека? Приведите
примеры различных способов доступа к нему.
16. Какие
команды (логические операции) выполняет процессор i486? Приведите примеры использования соответствующих ко­манд. Опишите их действие.
17. Какие регистры определяют адрес текущей исполняемой коман-
ды?
18. Какие существуют виды передачи управления?
19. Какие есть типы команд безусловного перехода?
20. На основании чего осуществляется условный переход?
21. Что происходит при вызове процедуры и
возврате из нее? При-
ведите примеры. Опишите используемые команды и их формат.
22. Какие команды используются для генерации прерываний?
23. Какие есть виды процедур?
24. Опишите назначение флагов процессора i486, описывающих ре-
зультат выполнения логических и арифметических команд.
25. Приведите фрагмент программы вызова подпрограммы по ин-
дексу в массиве адресов процедур.
ЛАБОРАТОРНАЯ РАБОТА № 5
ВЫПОЛНЕНИЕ ОПЕРАЦИЙ В АЛУ
Цель: изучить способы выполнения целочисленных арифмети-
ческих операций в процессорах архитектуры i80x86.
Назначение: познакомить учащихся с набором арифметиче-
ских команд и методами их использования.
Представление числовых данных
Машина оперирует числовыми данными в двоичном формате. Максимальная величина данных, с которыми может работать про­цессор
, определяется размерностью системного слова. В процессоре
i8086 она составляет 16 бит, т.е. в одном регистре может храниться
39
беззнаковое значение от 0 до 65535, а знаковое – от –32768 до 32767. Для некоторых регистров возможно использование либо их старшей, либо младшей части. Тогда диапазон значений составляет 0…255 для беззнаковых и –128…127 – для знаковых значений. Старший бит для знакового значения определяет, является ли оно положительным (0) или отрицательным.
Шестнадцатеричное Знаковое Беззнаковое
0E7H –25 231 45H 69 69
Для того чтобы изменить знак
на противоположный, нужно ин-
вертировать биты значения и прибавить к нему 1.
Исходное значение Инвертированное значение Прибавили 1
0FFH (–1) 00H (0) 01H (1) 88H (–120) 77H (119) 78H (120)
Для преобразования знаковых значений размером один байт в двухбайтовое используется команда CBW, которая распространяет значение AL на весь регистр AH, размножая старший бит. Анало­гичная команда CWD преобразует число со знаком в AX в число размером четыре байта
в DX:AX.
Команды сложения и вычитания
Мнемоника команды сложения – ADD, вычитания – SUB. Их формат:
ADD/SUB регистррегистр; ADD/SUB памятьрегистр; ADD/SUB регистрпамять; ADD/SUB регистрнепосредственное значение; ADD/SUB памятьнепосредственное значение.
Значение второго операнда вычитается из или складывается со значением левого и помещается в левый операнд.
40
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]