Добавил:
vanya.tagaschev@ya.ru Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
5
Добавлен:
21.03.2021
Размер:
597.63 Кб
Скачать

МИНИСТЕРСТВО ВЫСШЕГО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное бюджетное образовательное учреждение высшего образования

УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

Факультет информационных систем и технологий Кафедра «Измерительно-вычислительные комплексы»

Лабораторная работа №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

int 21h

pop ax and al,0Fh cmp al,10 sbb al,69h das

mov dl,al mov ah,02 int 21h

; преобразуем число в bh в ASCII-код

mov al,bh 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 ah,02 mov dl,al int 21h jmp m3

m1:

;здесь оказываемся, если число в bh ИЛИ сx равно 0 ;настраиваем es на сегмент кода и начинаем считывать коды

команд ;заменяя нулевой элемент в регистре на не нулевой

push cs pop es cmp cx,0 jnz m01

mov cx, word ptr es:[si] m01:

cmp bh,0 jnz m02

mov bh, byte ptr es:[si] m02:

inc si jmp m2

;вычисляем выражение m3:

mov al,a cbw sub ax,c

mov si,ax

mov al, d cbw

xor ax,b

or si, ax; результат вычисления выражения будет в регистре si

Exit:

mov ax,4C00h int 21h

END Start

ЗАДАНИЕ №3

.386

.model flat,stdcall option casemap:none

include ..\INCLUDE\kernel32.inc include ..\INCLUDE\user32.inc includelib ..\LIB\kernel32.lib includelib ..\LIB\user32.lib BSIZE equ 15

.data

ifmt db "%d", 0 ;строка формата stdout dd ?

cWritten dd ?

CRLF WORD ?

.data?

buf db BSIZE dup(?) ;буфер

.code start:

invoke GetStdHandle, -11 mov stdout,eax

mov CRLF, 0d0ah

;-------------------------умножение mov bx, 4

mov ax, 3 mul bx

invoke wsprintf, ADDR buf, ADDR ifmt, eax

invoke WriteConsoleA, stdout, ADDR buf, BSIZE, ADDR cWritten, 0

invoke ExitProcess,0 end start

ЗАДАНИЕ №4

.386

.model flat,stdcall option casemap:none

include ..\INCLUDE\kernel32.inc include ..\INCLUDE\user32.inc includelib ..\LIB\kernel32.lib includelib ..\LIB\user32.lib BSIZE equ 15

.data

ifmt db "%d", 0 ;строка формата stdout dd ?

cWritten dd ?

CRLF WORD ?

.data?

buf db BSIZE dup(?) ;буфер

.code start:

invoke GetStdHandle, -11 mov stdout,eax

mov CRLF, 0d0ah

;

-------------------------деление

mov eax, 99 mov edx, 0 mov ebx, 3 div ebx

invoke wsprintf, ADDR buf, ADDR ifmt, eax

invoke WriteConsoleA, stdout, ADDR buf, BSIZE, ADDR cWritten, 0

invoke WriteConsoleA, stdout, ADDR CRLF, 2, ADDR cWritten,0

ЗАДАНИЕ №5

0000

CODE

SEGMENT

 

ASSUME

CS

:CODE,

DS

:CODE

0000

???? X

 

DW

? ; Память для переменных

0002

???? A

 

DW

?

 

0004

???? B

 

DW

?

 

0006

???? C

 

DW

?

 

0008

???? D

 

DW

?

 

000A

FIG4_16 PROC

 

 

NEAR

 

 

 

000A B8 0002MOV

 

AX

, 2

 

 

 

 

 

 

 

 

 

 

 

 

; Загрузка константы

000D F7 2E 0002 R

IMUL

 

 

 

 

A

; DX:AX = A * 2

0011

8B DA

 

MOV

 

BX

,

 

 

DX

 

 

 

 

0013

8B C8

MOV

CX

,

AX

 

 

 

 

 

; BX:CX = A * 2

0015

A1 0004 R

MOV

 

AX

, B

 

0018

F7 2E 0006 R

IMUL

 

 

C

; DX:AX = B * C

001C 03 C1

ADD

 

 

 

AX

,

CX

 

 

 

 

 

001E 13 D3

ADC

 

 

 

DX

,

BX

 

 

 

 

; DX:AX = A * 2 + B * C

0020

8B 0E 0008 R

MOV

 

 

 

CX

, D

 

0024

83 E9 03

 

SUB

 

 

 

CX

, 3

 

 

; CX = D - 3

0027

F7 F9

IDIV

 

 

CX

 

 

; AX = (A*2 + B*C) / (D-3)

0029

A3 0000 R

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X,

 

 

 

; Сохранение

 

MOV

 

 

AX

 

результата

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

002C C3 RET

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

002D

FIG4_16 ENDP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

002D

CODE

ENDS

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

END

ЗАДАНИЕ №6

.MODEL tiny

.STACK 100h

.CODE

mov ah,01101010b mov bl,10101100b mov ch,01011001b

or ah,bl not ch

xor ch,0F2h and ah,ch mov al,ah mov ah,4ch int 21h END

;Загрузка в регистр ah значения 6АН ;Загрузка в регистр bl значения ACH ;Загрузка в регистр ch значения 59Н

ЗАДАНИЕ №7

.MODEL SMALL

.STACK 100h

.DATA a db ? b db ? c db ? d db ? x dw ?

.CODE start:

mov ax, @data mov ds,ax mov a, 26 mov b, 63 mov c, 144 mov d, 48

end start

ЗАДАНИЕ №8

.MODEL tiny

.STACK l00h

.CODE

xor ax,ax ;Заносим в регистр АХ нулевое значение

mov es,ax ;Передаем это значение в сегментный регистр test byte ptr es:[417h],4 ;проверяем байт состояния клавиатуры если светодиод caps

;lock на клавиатуре светится (бит 2=1), то флаг Z будет равен 0 mov ah,0101b ;занесем в АН чередующуюся последовательность бит

test ah,l ;проследите изменение значение флага Z

Соседние файлы в папке Тамьяров А. В.