МИНИСТЕРСТВО ВЫСШЕГО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
федеральное государственное бюджетное образовательное учреждение высшего образования
УЛЬЯНОВСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Факультет информационных систем и технологий Кафедра «Измерительно-вычислительные комплексы»
Лабораторная работа №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