Завдання №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
