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

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

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

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

Факультет информационных систем и технологий

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

Лабораторная работа №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 MOV X, AX ; Сохранение результата

002C C3 RET

002D FIG4_16 ENDP

002D CODE ENDS

END

ЗАДАНИЕ №6

.MODEL tiny

.STACK 100h

.CODE

mov ah,01101010b ;Загрузка в регистр ah значения 6АН

mov bl,10101100b ;Загрузка в регистр bl значения ACH

mov ch,01011001b ;Загрузка в регистр ch значения 59Н

or ah,bl

not ch

xor ch,0F2h

and ah,ch

mov al,ah

mov ah,4ch

int 21h

END

ЗАДАНИЕ №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

test ah,2 ;и объясните значение флага Z после

test ah,4 ;каждой команды test

test ah,8

mov ah,4ch

int 21h

END

Вывод: Получено навыков работы с регистрами, как средствами обработки арифметической информации

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