- •Затверджено
- •Протокол №6 від 05.11.2013
- •Загальні положення
- •1 Програмування арифметичних дій та обробка одновимірних масивів
- •Мета роботи
- •1.2 Підготовка до роботи
- •1.3 Вказівки до виконання роботи
- •2 Бітові операції та обробка матриць
- •2.1 Мета роботи
- •2.2 Підготовка до роботи
- •2.3 Вказівки до виконання роботи
- •1.5 Самостійна робота
- •1.6 Контрольні запитання і завдання
- •2.4.1 Варіанти завдань до лабораторної роботи «бітові операції»
- •3 Команди обробки рядків. Макрозасоби мови асемблер
- •3.3 Вказівки до виконання роботи
- •3.4 Варіанти завдань до лабораторної роботи
- •Самостійна робота
- •Контрольні запитання і завдання
- •4 Організація міжмодульного інтерфейсу між програмами мовами високого рівня та мовою асемблер
- •4.1 Мета роботи
- •4.2 Підготовка до роботи
- •4.3 Вказівки до виконання роботи
- •4.4 Варіанти завдань до лабораторної роботи
- •4.5 Самостійна робота
- •4.6 Контрольні завдання
- •5.4. Задание на лабораторную работу
- •5.5. Контрольные вопросы и задания
- •6 Средства ввода информации
- •6.1. Цель работы
- •6.2. Указания по подготовке к выполнению лабораторной работы
- •6.3. Обзор темы работы
- •6.4. Задание на лабораторную работу
- •6.5. Контрольные вопросы и задания
- •7. Многооконный интерфейс
- •7.1. Цель работы
- •7.2. Указания по подготовке к выполнению лабораторной работы
- •7.3. Обзор темы работы
- •7.4. Задание на лабораторную работу
- •7.5. Контрольные вопросы и задания
- •Перелік посилань
Самостійна робота
Під час підготовки до роботи потрібно повторити і вивчити такі теми самостійно:
особливості використання команд умовного переходу після команд обробки рядків;
можливості використання команд обробки рядків з використанням портів.
особливості використання команд умовного переходу після команд обробки рядків;
оператори та маакродирективи мови Асемблер;
особливості використання макродиректив;
макробібліотеки, їх оформлення, збереження та підключення;
можливості відлагодження програм, що містять макрокоманди.
Контрольні запитання і завдання
Які переваги дає використання команд роботи з рядками?
Яка різниця між дією префіксів rep та repe?
Роль регістра СX та регістра DX при роботі з рядками.
Засоби адресації рядків під час роботи з командами обробки рядків.
5. Структура макроса, засоби використання їх в програмі мовою Асемблера.
6. Псевдооператори та особливості їх використання.
7. Типи макродиректив і використання їх в програмі.
4 Організація міжмодульного інтерфейсу між програмами мовами високого рівня та мовою асемблер
4.1 Мета роботи
Вивчити особливості організації міжмодульного інтерфейсу програм мовами високого рівня (Паскаль, С++) та Асемблер. Придбати навички відлагодження і виконання програм, що об'єднують модулі написані різними мовами.
4.2 Підготовка до роботи
Підготовка до роботи здійснюється згідно з підрозділом 1.2. Як відомо, поширені такі варіанти звернутися з програми мовою високого рівня до фрагменту на Асемблері:
вставки у головну програму фрагментів мовою Асемблер;
виклики з головної програми процедур на Асемблері з заголовком мовою високого рівня, тільки в кінці заголовка використовується слово Assembler;
виклик з головної програми відтрансльованої підпрограми мовою асемблер.
Найчастіше використовуються виклики процедур. У цілому передача параметрів при цьому виконується за допомогою стека, до якого послідовно записуються адреси або значення. При викликові функщй параметр, що повертається, поміщається в акумулятор або до пари регістрів dх,ах.
4.3 Вказівки до виконання роботи
Порядок виконання роботи відповідає підрозділу 1.3.
Програму до лабораторної роботи оформіть у відповідності з такими вимогами: головна програма мовою високого рівня(С++) забезпечує введення початкових даних і передачу їх в асемблерну процедуру; процедура мовою Асемблер забезпечує необхідні дії для розв’язання задачі і повернення результатів в головну програму; головна програма забезпечує виведення на дисплей.
Додатково необхідно в програмі мовою С++ створити такіж функції мовою С++, просто в програмі мовою С++(без функції), асемблерну вставку, яка виконує тіж самі дії. Порівняти час виконання роботи різними засобами. Час вимірюється за допомогою функції __rdtsc().
Приклад програми, яка знаходить найбільший дільник двох чисел.
Текст головної програми на С++
// cpp_asm.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <intrin.h>
#include <Windows.h>
using namespace std;
int NOD(int r, int g)
{
while(g!=0 )
{
r=r%g;
if (r==0)
break;
g=g%r;
}
if(r==0)
return g;
else
return r;
}
int NOD1(int k1, int k2)
{
int r=k1;
int g=k2;
while(g!=0 )
{
r=r%g;
if (r==0)
break;
g=g%r;
}
if(r==0)
return g;
else
return r;
}
extern "C" int NOD_(int k1, int k2);
int main()
{
int k1,k2,n2, r,g;
do
{
cout<<"\n VVedite 2 chisla";
cin>>k1>>k2;
if (k1==0) break;
__int64 t1,t2;
t1 =__rdtsc();
//C
r=k1;
g=k2;
while(g!=0 )
{
r=r%g;
if (r==0)
break;
g=g%r;
}
if(r==0)
n2=g;
else
n2=r;
t2=__rdtsc();
cout<<"\n p "<<n2<<'\t'<<t2-t1;
//fun C
t1=__rdtsc();
n2=NOD(k1,k2);
t2=__rdtsc();
cout<<"\n fbp " <<n2<<'\t'<<t2-t1;
t1=__rdtsc();
n2=NOD1(k1,k2);
t2=__rdtsc();
cout<<"\n fcp "<<n2<<'\t'<<t2-t1;
//asm vstavka
t1=__rdtsc();
_asm
{
push eax;
push ecx;
push ebx;
push edx;
mov ecx, k1;
mov ebx,k2
m2:
cmp ebx,0;
je exit1;
mov eax, ecx;
cdq
idiv ebx
cmp edx,0
mov ecx,edx
je exit1
mov eax,ebx
cdq
idiv ecx
mov ebx, edx;
jmp m2;
exit1:
cmp ebx,0
je exit2
mov n2,ebx;
jmp exit_;
exit2:
mov n2,ecx;
exit_:
pop edx;
pop ebx;
pop ecx;
pop eax;
}
t2=__rdtsc();
cout<<"\n asm "<<n2<<'\t'<<t2-t1;
t1=__rdtsc();
_asm
{
push eax;
push ecx;
push ebx;
push edx;
mov ecx, k1;
mov ebx,k2
m21:
cmp ecx,0;
je exit11;
cmp ecx,ebx
jge ex
mov eax,ecx
mov ecx,ebx
mov ebx,eax
ex:
sub ecx,ebx
jmp m21;
exit11:
mov n2,ebx;
pop edx;
pop ebx;
pop ecx;
pop eax;
}
t2=__rdtsc();
cout<<"\n asm ev"<<n2<<'\t'<<t2-t1;
//funasm
t1=__rdtsc();
n2=NOD_(k1, k2);
t2=__rdtsc();
cout<<"\n funasm \n"<<n2<<'\t'<<t2-t1;
}while(true);
cin.get();
return 0;
}
Текст підпрограми на Асемблері.
;p586
;ideal
.586
.model flat
.code
_NOD_ proc
public _NOD_
push ebp;
mov ebp,esp;
;push eax;
push ecx;
push esi;
push edx;
mov esi,[ebp+8];
mov ecx,[ebp+12];
mov eax, esi;
cdq;
idiv ecx;
cmp edx,0;
je exit3;
mov ebx,edx;
mov eax,ecx;
cdq;
idiv ebx;
m2:
cmp ebx,0;
jne m;
m:
cmp edx,0;
jne m1;
jmp ex;
m1:
mov eax,ebx;
mov ebx, edx;
cdq;
idiv ebx;
ex:
cmp edx,0;
je exit1;
cmp ebx,0;
je exit2;
mov eax, ebx;
mov ebx, edx;
cdq;
idiv ebx;
jmp m2;
exit1:
mov eax,ebx;
jmp exit_;
exit2:
mov eax,edx;
jmp exit_;
exit3:
mov ebx,ecx;
mov eax,ebx;
jmp exit_;
exit_:
pop edx;
pop esi;
pop ecx;
;pop eax;
pop ebp
ret
_NOD_ endp
end
