Практическая работа №4
Тема: Программирование арифметических и логических команд.
Цель: Изучение приемов работы с простейшими операторами арифметических действий.
Время выполнения: 2 часа.
Теоретические сведения
Арифметические команды любого микропроцессора привлекают к себе наибольшее внимание. Каждый заинтересован в выполнении арифметических вычислений, и именно эти команды проделывают такую работу. Хотя их немного, они выполняют большинство преобразований данных, а микропроцессоре. В реальных же условиях арифметические команды занимают лишь малую часть всех исполняемых команд.
Сложение.
Команда ADD (Addition - сложение (гл. to add - сложить)) осуществляет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется.
В качестве первого операнда команды ADD можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команду ADD можно использовать для сложения, как обычных целых чисел, так и двоично-десятичных (с использованием регистра АХ для хранения результата).
Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.
Таблица 3
Синтаксическая запись команды ADD
Команда |
Назначение |
Процессор |
ADD приемник, источник |
Сложение |
8086 |
Пример 1:
mov al,10 - --> загружаем в регистр AL число 10
add al,15 - --> al = 25; al - приемник, 15 - источник
mov ax,25000 - --> загружаем в регистр AX число 25000
add ax,10000 - --> ax = 35000; ax - приемник, 10000 - источник
mov cx, 200 - --> загружаем в регистр CX число 200
mov bx,760 - --> а в регистр BX - 760
add cx,bx - --> cx = 960, bx = 760 (bx не меняется); cx - приемник, bx - источник
Вычитание.
Команда SUB (Subtraction - вычитание) вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется. Таким образом, если команду вычитания записать в общем виде
SUB операнд1, операнд2, то ее действие можно условно изобразить следующим образом:
операнд1 - операнд2 - > операнд1
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.
Таблица 4
Синтаксическая запись команды SUB
Команда |
Назначение |
Процессор |
SUB приемник, источник |
Вычитание |
8086 |
Пример 2:
mov al,10
sub al,7 - --> al = 3; al - приемник, 7 - источник
mov ax,25000
sub ax,10000 - --> ax = 15000; ax - приемник, 10000 - источник
mov cx,100
mov bx,15
sub cx,bx - --> cx = 85, bx = 15 (bx не меняется); cx - приемник, bx - источник
Инкремент (увеличение на 1).
Команда INC (Increment - инкремент) прибавляет 1 к операнду, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово.
Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака. Команда воздействует на флаги OF, SF, ZF, AF и PF. Команда не воздействует на флаг CF; если требуется воздействие на этот флаг, необходимо использовать команду Add Op,l.
Команда INC (Increment - инкремент) увеличивает на единицу регистр или значение операнда в памяти.
Она эквивалентна команде ADD источник, 1 только выполняется гораздо быстрее.
Таблица 5
Синтаксическая запись команды INC
Команда |
Назначение |
Процессор |
INC приемник |
Увеличение на единицу |
8086 |
Пример 3:
mov al,15
inc al - --> теперь AL = 16 (эквивалентна add al,1)
mov dh,39h
inc dh - --> DH = 3Ah (эквивалентна add dh,1)
mov cl,4Fh
inc cl - --> CL = 50h (эквивалентна add cl,1)
Декремент (уменьшение на 1).
Команда DEC (Decrement - декремент) вычитает 1 из операнда, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака. Команда воздействует на флаги OF, SF, ZF, AF и PF.
Она эквивалентна команде SUB источник, 1 только выполняется гораздо быстрее.
Таблица 6
Синтаксическая запись команды DEC
Команда |
Назначение |
Процессор |
INC приемник |
Уменьшение на единицу |
8086 |
Пример 4:
mov al,15
dec al - --> теперь AL = 14 (эквивалентна sub al,1)
mov dh,39h
dec dh - --> DH = 38h (эквивалентна sub dh,1)
mov cl,4Fh
dec cl - --> CL = 4Dh (эквивалентна sub cl,1)
Логические операции являются важным элементом в проектировании микросхем и имеют много общего в логике программирования. Команды AND, OR, XOR и TEST - являются командами логических операций. Эти команды используются для сброса и установки бит и для арифметических операций в коде ASCII. Все эти команды обрабатывают один байт или одно слово в регистре или в памяти, и устанавливают флаги CF, OF, PF, SF, ZF.
Команда AND.
Команда AND (Логическое И) осуществляет логическое (побитовое) умножение первого операнда на второй. Исходное значение первого операнда (приемника) теряется, замещаясь результатом умножения.
В качестве первого операнда команды and можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами. Команда воздействует на флаги SF, ZF и PF.
Таблица 7
Правила побитового умножения:
Первый операнд-бит 0101 |
Бит результата 0001 |
Второй операнд-бит 0011 |
Пример 5
mov AX,0FFEh
and AX,5555h; AX=0554h
Пример 6
mov ax,00101001b
add ax,11110111b ; ax=00100001b
Команда OR
Команда OR (Логическое ВКЛЮЧАЮЩЕЕ ИЛИ) выполняет операцию логического (побитового) сложения двух операндов. Результат замещает первый операнд (приемник); второй операнд (источник) не изменяется.
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды команды OR могут быть байтами или словами. Команда воздействует на флаги OF, SF, ZF, PF и CF, при этом флаги CF и OF всегда сбрасываются в 0.
Таблица 8
Правила побитового сложения:
Первый операнд-бит 0101 |
Бит результата 0111 |
Второй операнд-бит 0011 |
Пример 7
mov AX,000Fh
mov BX,00F0h
or AX,BX; AX=00FFh, BX=00F0h
Пример 8
mov AX,00101001b
mov BX,11110111b
or AX,BX ; mov dx,11111111b
Пример 9
mov AX,000Fh
or AX,8001h ; AX=800Fh
Команда XOR.
Команда ХОR (Логическое ИСКЛЮЧАЮЩЕЕ ИЛИ) выполняет операцию логического (побитового) ИСКЛЮЧАЮЩЕГО ИЛИ над своими двумя операндами. Результат операции замещает первый операнд; второй операнд не изменяется. Каждый бит результата устанавливается в 1, если соответствующие биты операндов различны, и сбрасывается в 0, если соответствующие биты операндов совпадают.
В качестве первого операнда команды ХОR можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами. Команда воздействует на флаги OF, SF, ZF, PF и CF, причем флаги OF и CF всегда сбрасываются, а остальные флаги устанавливаются в зависимости от результата.
Таблица 9
Правила побитового исключающего или:
Первый операнд-бит 0101 |
Бит результата 0110 |
Второй операнд-бит 0011 |
Пример 10
mov AX,0Fh
хог AX,0FFFFh; AX=FFF0h
Пример 11
mov AX,00101001b
mov BX,11110111b
xor ax,bx; 11011110b
Пример 12
mov SI,0AAAAh
mov BX,5555h
xor SI,BX ; SI=FFFFh,BX=5555h
Пример 13
хог ВХ, ВХ ; Обнуление ВХ
Команда TEST.
Команда TEST (Логическое сравнение) выполняет операцию логического умножения И над двумя операндами и, в зависимости от результата, устанавливает флаги SF, ZF и PF. Флаги OF и CF сбрасываются, a AF имеет неопределенное значение. Состояние флагов можно затем проанализировать командами условных переходов. Команда TEST не изменяет ни один из операндов.
В качестве первого операнда команды TEST можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.
Таблица 10
Правила побитового умножения:
Первый операнд-бит 0101 |
Бит результата 0001 |
Второй операнд-бит 0011 |
Флаг SF устанавливается в 1, если в результате выполнения команды образовалось число с установленным знаковым битом.
Флаг ZF устанавливается в 1, если в результате выполнения команды образовалось число, состоящее из одних двоичных нулей.
Флаг PF устанавливается в 1, если в результате выполнения команды образовалось число с четным количеством двоичных единиц в его битах.
Пример 14
test AX,1
jne label2: ; Переход, если бит 0 в АХ установлен
je label1: ; Переход, если бит 0 в АХ сброшен
Пример 15
. model tiny |
; модель памяти в которой сегменты кода, данных и стека объединены. |
. code |
; сегмент кода, который содержит данные. |
org 100h |
; начало СОМ-файла |
begin: |
; метка начала кода программы |
mov СX,<число1 > |
; загружаем в CX число1 <любое число1> |
mov BX,<число2> |
; загружаем в BX число2 <любое число2> |
test cx,bx |
; логически сравниваем числа в регистрах cx с bx |
jne label2 |
; если одно из значений не равно 0 то переходим на метку label2 |
je label1 |
; если одно из значений равно 0 то переходим на метку label1 |
ret |
; функция DOS "завершить программу" (не выполняется) |
label1: |
; начало блока метки Label1 |
mov ah,9 |
; помещаем номер функции DOS "вывод строки (9)" в регистр АН. |
mov dx,offset string |
помещает в регистр DX смещение метки String относительно начала сегмента данных |
int 21h |
; функция DOS "вывод строки" |
ret |
; функция DOS "завершить программу" |
String db 'одно из чисел равно 0$' |
; cтрока с содержащая выводимые данные. |
label2: |
; начало блока метки Label2 |
mov ah,9 |
; помещаем номер функции DOS "вывод строки (9)" в регистр АН. |
mov dx,offset string1 |
помещает в регистр DX смещение метки String1 относительно начала сегмента данных |
int 21h |
; функция DOS "вывод строки" |
ret |
; функция DOS "завершить программу" |
string1 db 'не равны 0$' |
; cтрока с содержащая выводимые данные. |
end begin |
; метка окончания кода программы |
Данный пример сравнивает два значения (строка (6)), если одно из двух значений равно нулю тогда переходим на метку label1 (строка (10)) далее выполняются команды, следующие после этой метки, в случае если одно из двух значений равно нулю тогда переходим на метку label2
Пример 16
test SI,8
jne bityes ; Переход, если бит 3 в SI установлен
je bitno ; Переход, если бит 0 в АХ сброшен
Пример 17
test DX,0FFFFh
jz null ; Переход, если DX=0
jnz smth; Переход, если DX не 0
Команда NOT.
Команда NOT (NOT Инверсия, дополнение до 1, логическое отрицание) выполняет инверсию битов указанного операнда, заменяя 0 на 1 и наоборот. В качестве операнда можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда не воздействует на флаги процессора.
Таблица 11
Правила побитовой инверсии:
Операнд-бит 0 1 |
Бит результата 1 0 |
Пример 18
mov AX,0FFFFh
not AX; AX=0000h
Пример 19
mov SI,5551h
not SI; SI=AAAEh
Характерные примеры работы команд логических операций.
Для следующих несвязанных примеров, предположим, что:
AL содержит 1100 0101
BH содержит 0101 1100:
1. AND AL,BH; Устанавливает в AL 0100 0100
2. OR BH,AL; Устанавливает в BH 1101 1101
3. XOR AL,AL; Устанавливает в AL 0000 0000
4. AND AL,00; Устанавливает в AL 0000 0000
5. AND AL,0FH; Устанавливает в AL 0000 0101
6. OR CL,CL; Устанавливает флаги SF и ZF
Примеры 3 и 4 демонстрируют способ очистки регистра. В примере 5 обнуляются левые четыре бита регистра AL.
Можно применить команду OR для следующих целей:
1. OR CX,CX; Проверка CX на нуль
JZ; Переход, если нуль
2. OR CX,CX; Проверка знака в CX
JS; Переход, если отрицательно
Задания к практической работе
Задание 1. Запустите эмулятор EMU8086 и наберите примеры арифметических и логических операций.
Задание 2. Получите задание у преподавателя (один из пяти вариантов табл. 12) и, пользуясь правилами оформления ассемблерных программ, напишите программы расчета значения A (два-три варианта).
Таблица 12
Расчетные данные для индивидуального задания
№ вар. |
Расчетная формула |
B |
C |
D |
1 |
A=B+C-D |
1 |
35 |
23 |
2 |
A=B+C+D |
65 |
1 |
1 |
3 |
A=C-D+B |
1 |
33 |
1 |
4 |
A=D+A-B |
18 |
1 |
88 |
5 |
A= B-C+D |
45 |
10 |
1 |
Контрольные вопросы и задания
1. Команда add основное назначение?
2. Команда sub основное назначение?
3. Команда inc основное назначение?
4. Команда dec основное назначение?
5. В чем преимущество использования команд inc и dec?
6. Назначение команд логических операций?
7. Команда and основное назначение?
8. Команда or основное назначение?
9. Команда xor основное назначение?
10. Команда test основное назначение?
11. Команда not основное назначение?
12. Альтернативная работа команд (test, xor, and)?
Скачано с www.znanio.ru
Материалы на данной страницы взяты из открытых источников либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.