Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчет.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.61 Mб
Скачать

Завдання №1,2

Тема: Операції складання, віднімання, множення та ділення у Assembler

Мета роботи: Вивчити команди складання та відіймання мови асемблер. Навчитися програмувати на асемблері із використовуванням команд складання. Вивчити команди множення та ділення мови

Обладнання: ПЕОМ, OC Windows

Хід виконання роботи

Завдання. Обчислити віднімання і складання двох чисел : а=45 b=4

Обчислити множення та ділення двох чисел : а=1000 b=-2

Скласти два числа a і b:

Текст програми:

#include "stdafx.h"

#include <windows.h>

#include <conio.h>

#include <stdio.h>

#include <iostream>

using namespace std;

int vvod(){//функція вводу нових чисел по бажанню

int a,b,d;

cout<<"if you need other numbers input 1=";

cin>>d;

if(d==1){

cout<<"input numbers=";

cin>>a>>b;

return a,b;}

else return 0;}

int main ()

{

int a,b,c,d,e;

char ch;

//создаемо цикл для вибора дій

do{

//cоздаемо оператор вибора для виконання різних задань(+-/*)

cout<<"\n input 1=a+b 2=a-b 3=a*b 4=a/b 0=exit:";

cin>>ch;

switch(ch){

case '1':{//заносимо значения в перемінну, але пропонуемо

//користувачу ввести свої

a=45; b=4; d=0;

d=vvod();

cout<<"a+b=";

__asm{//присвоюемо значення регістру із змінної а

MOV EAX, a

//додаемо значення змінної b до регістра

ADD EAX, b

//заносимо в змінну значення регістра

MOV c, EAX

}

printf("%d", c);break;}

case '2':{//заносимо значения в перемінну, але пропонуемо

//користувачу ввести свої

a=45; b=4; d=0;

d=vvod();

cout<<"a-b=";

__asm{//присвоюемо значення регістру із змінної а

MOV EAX, a

//віднімаемо значення змінної b від регістра

SUB EAX, b

//заносимо в змінну значення регістра

MOV c, EAX

}

printf("%d", c);break;}

case '3':{

a=100; b=-4;

d=vvod();

cout<<"a*b=";

__asm {

MOV EAX, a //Заносимо змінну a в регістр

MUL b //множимо на b

MOV c,EAX //заносимо результат змінну с

MOV c+4, EDX

}

printf("%d" ,c); //вивід відповіді

break;

}

case '4':{

a=100; b=-4;

d=vvod();

cout<<"a/b=";

__asm{

//знакове ділення додатне а ділим

//на відемне b

MOV EAX, a

MOV EDX, 0

MOV EBX, b

IDIV EBX

MOV c, EAX; //ціла частина

MOV e, EDX; //остаток

}

printf("%d %d ",c,e);

break;

}}

}while(ch!='0');

return 0;}

Результат на Рис.1,2.1.

Висновок: У цьому завданні були здобуті навички складання та віднімання, множення та ділення мови асемблер.

Рис. 1,2.1

Рис 1.1

Завдання №3

Тема:Адресація та команди пересилки даних у Assembler

Мета роботи: Вивчити команди адресації та пересилки даних. Навчитися програмувати на асемблері із використовуванням команд адресації та пересилки даних.

Обладнання: ПЕОМ, OCWindows,C++ Builder

Хід виконання роботи

Завдання. Застосовуючи непряму адресацію здійснити обмін даних між регістрами EDI та ЕАХ.

Текст програми:

#include "stdafx.h"

#include <windows.h>

#include <conio.h>

#include <stdio.h>

#include <iostream>

using namespace std;

int a,b,c,e;

int _tmain(int argc, _TCHAR* argv[])

{

//инициализируем переменные a,b,c

a=2400;

b=-4;

c=0;

e=0;

// выводим начальные значения регистров

cout<<"EDX a=2400 ";

cout<<"EAX b=-4 ";

// ассемблерный код

__asm

{

MOV EDX,a // заносимо значення а в регістр EDX

LEA EAX,c // адресса змінної с вносимо у регістр ЕАХ

MOV DWORD PTR [EAX],EDX // заносмо значення з регістра EDX по адрессі із регістра ЕАХ

MOV EAX,b // заносимо значення змінної b в ЕАХ

LEA EDX, e //вносимо адрес змінної е в регістр EDX

MOV DWORD PTR [EDX],EAX // вносимо значення із регістра ЕАХ по адрессі з регістра EDX

MOV EAX, c //вносимо значення з змінної с в регістр ЕАХ

MOV EDX, e //вносимо змінну е в EDX

}

cout<<"EAX: "<<c<<" EDX: "<<e; //виводимо змінні с і е

getch ();

return 0;}

Результат на Рис. 3.1.

Висновок: У цьому завданні були здобуті навички адресації та команд пересилки даних у Assembler.

Рис. 3.1

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]