МИНИСТЕРСТВО ВЫСШЕГО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное бюджетное образовательное учреждение высшего образования
УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Факультет информационных систем и технологий Кафедра «Измерительно-вычислительные комплексы»
Лабораторная работа №3
По дисциплине «Организация ЭВМ и систем»
Тема: «Команды арифметической обработки данных»
Выполнил: ст. гр. ИСТбд-22 Тагашев И.И.
Проверил: к.т.н., доцент ИВК Тамьяров А.В.
Ульяновск, 2021 г.
ЛАБОРАТОРНАЯ РАБОТА № 3
«Команды арифметической обработки данных»
Цель работы: Приобретение навыков работы с регистрами, как средствами обработки арифметической информации.
Порядок выполнения работы:
1. Команды сложения
Команда ADD выполняет сложение указанных операндов, представленных в двоичном дополнительном коде. Микропроцессор помещает результат на место первого операнда после того, как сложит оба операнда. Второй операнд не изменяется. Команда корректирует регистр флагов в соответствии с результатом сложения. Например, команда
ADD АХ,BХ
складывает содержимое регистра ВХ с содержимым регистра АХ, и оставляет результат в регистре АХ. Регистр флагов сообщает о том, был ли результат нулевым, отрицательным, имел ли четность, перенос или переполнение.
Формы команды ADD:
ADD dst, src - сложение типа память-регистр или регистр-память
ADD dst, data - сложение памяти или регистра с непосредственным операндом
ADD асе, data - сложение аккумулятора с непосредственным операндом.
Команда сложения с переносом ADC - это та же команда ADD, за исключением того, что в сумму включается флаг переноса. Для любой формы команды ADD существует аналогичная форма команды ADC.
Команда INC - увеличение операнда на единицу. После достижения максимального значения операнда, в нем устанавливается нулевое значение.
Формы команды INC:
INC dst - увеличение содержимого переменной в памяти на единицу,
INC reg - увеличение содержимого регистра на единицу.
2. Команды вычитания и сравнения.
Команды вычитания SUB и SBB идентичны командам сложения (ADD и ADC соответственно) за исключением того, что они выполняют вычитание, а не сложение. Вычитание устанавливает флаги состояния в соответствии с
результатом операции, причем флаг переноса теперь означает заем.
Например, команда
SUB AX, BX
вычитает значение регистра ВХ из значения регистра АХ, а затем помещает результат в регистр АХ. Флаги состояния изменяются так, чтобы отражать результат выполнения команды.
Команда DEC - уменьшение операнда на единицу. При использовании этой команды на операнд с нулевым значением в операнд запишется максимальное значение (в случае с байтовой переменной это будет 255, в словной переменной это будет 65535) .
Команда сравнения СМР сравнивает два операнда, вычитая один из другого. Она не записывает результат, но флаги состояния устанавливает в соответствии с результатом. Эта команда изменяет только флаги. Формы команды СМР:
СМР reg, reg - сравнение регистра с регистром
СМР dst, src - сравнение регистра с переменной в памяти или переменную в памяти с регистром
СМР dst, data - сравнение регистра или переменной в памяти с непосредственным операндом.
3. Команда смены знака
Команда NEG изменяет знак операнда, записанного в дополнительном коде. Команда выполняет две операции - инвертирование операнда и увеличение его на единицу.
Пример:
При байтовом операнде, равном 1, результат получится Offh Если операнд равен нулю, его значение не изменяется. Попытка изменить знак байта 80 или слова 8000 не модифицирует операнд, но устанавливает OF = 1.
Команда влияет на все флажки, причем CF всегда устанавливается в единицу, кроме случая, когда операнд = 0 , тогда CF = 0.
Форма команды NEG:
NEG dst - изменение знака значения регистра или переменной в памяти.
ПРИМЕЧАНИЯ: В командах вычитания (SUB, SBB, СМР) флаги CF и AF становятся флагами заема и равными 1, если уменьшаемое меньше вычитаемого. Команды икремента и декремента не влияют на состояние флажка C.
ЗАДАНИЕ №1
.8086
.model small
.stack 100h
.data
mas db 3,5,3,6,7,4,2,0 ;наш масив - ініціалізований i dw 0
maskk db 1 ; змінна для перевікрки бітів kst dw 0 ;кількість одиничок
.code
.startup
; тут можна зчитати масив, але він вже ініціалізований - тому зчитувати не будемо.
mov cx,8 ; 8 елементів масиву m2:
mov al,1 mov maskk,al push cx
mov cx,8 ;повторити 8 раз (ксть біт в байті)
m1: |
|
||||||
mov |
|
al |
,maskk |
; al=00000001b |
|||
and |
al |
,mas+i |
;результат в ал |
||||
cmp |
|
al |
,0 |
; |
|||
jn zero ; якщо одиничка
mov bx,kst add bx,1
mov kst,bx ; то додати 1 до кількості zero:
mov bx,maskk shl bx,1
mov maskk,bx ; змістити одничку вліво (в байті) після першого сзуву: 00000010,
;після другого: 00000100... і т. д. loop m1
pop cx mov ax,i
add ax,1 ;i++ mov i,ax
loop m2
;kst - кількість "одиничок"
.exit 0 End
ЗАДАНИЕ №2
MODEL SMALL
.STACK 256
.DATA a db 23h
d db 0A3h
b dw 0B45Ah
c dw 5678h
.CODE Start:
mov ax,@data mov ds,ax
mov cx,0A123h mov bh,98h
m2:
cmp cx,0 jz m1 cmp bh,0 jz m1
;преобразуем число в регистре cx ASCII-код ;преобразование старшего байта
mov al,ch push ax shr al,4 cmp al,10 sbb al,69h das
mov dl,al mov ah,02 int 21h
pop ax and al,0Fh cmp al,10 sbb al,69h das
mov dl,al mov ah,02 int 21h
;преобразование младшего байта
mov al,cl push ax shr al,4 cmp al,10 sbb al,69h das
mov dl,al mov ah,02