Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АААААААААААА.docx
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
212 Кб
Скачать
☆

Практическое задание №9 Арифметические операции Битовые команды

Цель работы:

  • изучить арифметические операции языка ассемблера.

  • научить их использование при составлении программ.

  • дать понятие о битовых командах и их применение.

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

Арифметические операции на языке ассемблера

выполняются над целыми числами четырех типов:  Беззнаковыми двоичными, знаковыми двоичными, упакованными десятичными и неупакованными десятичными.

В данной лабораторной работе рассматриваются арифметические операции над безззнаковыми числами. 

Используются следующие команды:  ADD - сложить, SUB - вычесть. 

Описание команд: Работают с 8 и 16 битовыми операндами, инструкция ADD выполняет сложение операнда источника (правого операнда) с содержимым операнда приемника (левый операнд), результат помещается в операнд приемник. Инструкция SUB делает тоже самое, только она вычитает операнд источник из операнда приемника, результат помещается в операнд приемник.

MUL умножить.

Описание команд: инструкция MUL перемножает 8 и 16 битовые безнаковые множители, создавая 16 или 32 битовое произведение.

DIV - разделить. 

Описание команд: позволяет разделить 32 битовое значение на 16 битовое значение или 16 битовое на 8 битовое. При делении 16 битового значения делимое помещается в AX, 8 битовый делитель помещается в регистр или в переменную соответствующего размера, Результат (8 битовый) помещается в AL, остаток в AH.

БИТОВЫЕ КОМАНДЫ

Битовые команды рассматривают свои операнды не

в виде привычных уже байтов, слов и двойных слов, в виде последовательности битов. Эти команды реализуют логические операции и команды сдвигов. 

Логические операции (или булевы команды) - как,

следует из названия, выполняют логические операции - отрицание, конъюнкцию, дизъюнкцию и им присуще ряд черт.

Инвертировать

notopr

"И" (конъюнкция)

anddst,src

Логическое сравнение

test opr1,opr2

"ИЛИ" (дизъюнкция)

ordst,src

"Исключающее ИЛИ"

xordst,src

Команды сдвига - эти команды перемещают

содержимое ячейки влево или вправо. Одним из операндов этих команд является количество сдвигов cnt. Оно либо равно 1, либо определяется содержимым регистра CL (при этом CL сохраняет своё содержимое после операции). 

Логические сдвиги - команды сдвига, где

участвуют все биты первого операнда, при этом бит, уходящий за пределы ячейки, заносится в флаг CF, а с другого конца в операнд добавляется ноль. 

Логический сдвиг влево (shift left): SHL  Логический сдвиг вправо (shift right): SHR  Арифметический сдвиг влево (shift arithmetic left): SAL  Арифметический сдвиг вправо (shift arithmetic right): SAR

Циклические сдвиги. Особенность циклических сдвигов в том, что "уходящий" бит не теряется, а возвращается в

операнд, но с другого конца. Циклический сдвиг влево (shift arithmetic left): ROL  Циклический сдвиг вправо (shift arithmetic right): ROR Задание

Задача заключается в вычислении результата выполнения арифметического выражения, в котором некоторые числа постоянны, а другие переменные.

Формула вычислений: X = (A * 2 + B * C ) / (D - 3)

Приведенная программа сначала резервирует ячейки памяти под переменные, затем выполняет умножение однобайтовых чисел (A * 2), результат умножения - двухбайтовое число в регистре AX, сохраняется в регистре СХ, далее выполняется умножение однобайтовых чисел (В * С), результат - двухбайтовое число хранится в аккумуляторе AX. После сложения двух сомножителей и вычисления знаменателя (D-3) выполняется деление. Результат присваивается переменной Х.

  1. Наберите приведенную программу, запишите исходный файл с расширением *.ASM, получите файл с расширением *.EXE.

2. Загрузите программу в отладчик TURBODEBUG (команда TURBODEBUG *.exe). Выполните программу по шагам, команда F7(F8), посмотрите, как она работает, получите результат. 

3. Выполните программу в соответствии с вариантом значения переменных A,B,C,D по шагам (см. таблицу) и запишите результат выполнения в таблицу (в регистре AL - частное, AH - остаток). Переведите результат в десятичную систему. 

Таблица  

Вариант

1

2

3

4

5

Значения

A

3

0AH

20

60

20H

B

4

5H

4

16

9H

C

2

8H

15

5

4H

D

5

9H

6

18

1CH

Частное AL

Остаток AH

Фрагмент программы: x =(a*2+b*c)/(d-3) 

.ModelSmall

.Stack 100h

.data

A db ?

Bdb ?

Cdb ? ; Резервируем память для переменных

D db ? ; A,B,C,D

X dw ?

.code

Start:

Mov ax,@data

Mov ds,ax

Mov a,3

Mov b,4

Mov c,2

Mov d,5

Mov al,2

Mul a

Mov cx,ax

Mov al,b

Mul c

Mov al,b

Mul c

Add ax,cx

Mov cl.d

Sub cl,3

Div cl

Mov x,ax

Mov ah,4ch

Int 21h

End start

Контрольные вопросы:

  1. Чем отличается выполнение арифметических операций на языке ассемблера от языков высокого уровня?

  2. По какому биту регистра флагов можно установить, что предшествующее вычитание привело к отрицательному результату? 

  3. По какому биту регистра флагов можно установить, что в результат арифметической операции превысил разрядную сетку?

  4. В чем особенность выполнения арифметических операций с знаковыми и безнаковыми числами?

  5. Назначение команды IMUL и ее основное отличие от команды MUL?

  6. В чем особенность битовых команд от других команд языка ассемблера?

  7. Как отражается на регистре флагов выполнение логических команд?

  8. Опишите схематически работу одну из команд сдвигов?

  9. В каком регистре необходимо указывать величину сдвига в команда сдвига?

59