Программирование арифметических и логических команд

  • doc
  • 29.04.2020
Публикация на сайте для учителей

Публикация педагогических разработок

Бесплатное участие. Свидетельство автора сразу.
Мгновенные 10 документов в портфолио.

Иконка файла материала 9. Практическая работа по теме Программирование арифметических и логических команд.doc

Практическая работа №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