- •Практическое задание №1 Представление данных в эвм. Кодирование данных в эвм
- •Практическое задание №2 Принцип представления чисел в позиционных системах счисления
- •Практическое задание №3 Перевод из двоичной системы счисления в шестнадцатеричную (восьмеричную) и из шестнадцатеричной (восьмеричной) в двоичную. Умножение и деление двоичных чисел
- •Практическое задание № 4 Контрольная работа
- •Примечание: Таблицы asciIпредставлены в предыдущей практической работе. Практическое задание №5 Аппаратные средства персональных компьютеров
- •Практическое задание №6 Подключение оборудования к системному блоку и изучение компонентов системного блока
- •Практическое задание №7 Начало работы на языке ассемблера Цель работы:
- •Практическое задание №8 Директивы языка ассемблера
- •Практическое задание №9 Арифметические операции Битовые команды
Практическое задание №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) выполняется деление. Результат присваивается переменной Х.
Наберите приведенную программу, запишите исходный файл с расширением *.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
Контрольные вопросы:
Чем отличается выполнение арифметических операций на языке ассемблера от языков высокого уровня?
По какому биту регистра флагов можно установить, что предшествующее вычитание привело к отрицательному результату?
По какому биту регистра флагов можно установить, что в результат арифметической операции превысил разрядную сетку?
В чем особенность выполнения арифметических операций с знаковыми и безнаковыми числами?
Назначение команды IMUL и ее основное отличие от команды MUL?
В чем особенность битовых команд от других команд языка ассемблера?
Как отражается на регистре флагов выполнение логических команд?
Опишите схематически работу одну из команд сдвигов?
В каком регистре необходимо указывать величину сдвига в команда сдвига?
