Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MET_CP_2014.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
421 Кб
Скачать
☆
    1. Самостійна робота

Під час підготовки до роботи потрібно повторити і вивчити такі теми самостійно:

  • особливості використання команд умовного переходу після команд обробки рядків;

  • можливості використання команд обробки рядків з використанням портів.

  • особливості використання команд умовного переходу після команд обробки рядків;

  • оператори та маакродирективи мови Асемблер;

  • особливості використання макродиректив;

  • макробібліотеки, їх оформлення, збереження та підключення;

  • можливості відлагодження програм, що містять макрокоманди.

    1. Контрольні запитання і завдання

  1. Які переваги дає використання команд роботи з рядками?

  2. Яка різниця між дією префіксів rep та repe?

  3. Роль регістра СX та регістра DX при роботі з рядками.

  4. Засоби адресації рядків під час роботи з командами обробки рядків.

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

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