Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab6 / report_lr6

.doc
Скачиваний:
10
Добавлен:
10.02.2019
Размер:
113.15 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра МОЭВМ

отчет

по лабораторной работе №6

по дисциплине «Организация ЭВМ и систем»

Тема: «Организация связи Ассемблера с ЯВУ на примере программы построения частотного распределение попаданий псевдослучайных целых чисел в заданные интервалы»

Студент гр. 3303

Преподаватель

Санкт-Петербург

2018

Цель работы.

Ознакомиться с организацией связи Ассемблера с ЯВУ, а затем разработать программу построения частотного распределение попаданий псевдослучайных целых чисел в заданные интервалы.

Постановка задачи.

На языке высокого уровня запрограммировать ввод с клавиатуры и контроль исходных данных, а также генерацию массива псевдослучайных целых чисел. Далее написать ассемблерную процедуры для формирования распределения количества попаданий псевдослучайных целых чисел в заданные интервалы. Результирующий массив частотного распределения чисел по интервалам, сформированный на ассемблерном уровне, возвратить в программу, реализованную на ЯВУ, и затем вывести на экран и в файл средствами ЯВУ.

Исходные данные:

1. Длина массива псевдослучайных целых чисел (<= 16K)

2. Диапазон изменения массива псевдослучайных целых чисел [Xmin, Xmax].

3. Массив псевдослучайных целых чисел.

4. Количество интервалов, на которые разбивается диапазон изменения массива псевдослучайных целых чисел (<=24)

5. Массив левых границ интервалов разбиения должны принадлежать интервалу [Xmin, Xmax].

Ход работы.

Была написана требуемая программа. Считывание, генерирование массива и вывод данных осуществлялся с помощью языка СИ, поиск количества вхождений целых чисел в заданные интервалы, осуществляется с помощью независимо скомпилированного модуля ассемблерной процедуры. Код программы представлен в приложении A.

Программа была успешно протестирована согласно рис.1.

Рисунок 1 – Тестирование программы.

Вывод:

В ходе выполнения лабораторной работы произошло ознакомление с организацией связи Ассемблера с ЯВУ, разработана программа построения частотного распределение попаданий псевдослучайных целых чисел в заданные интервалы. Построенная программа была протестирована.

Приложение А

Код программы labpp

#include "pch.h"

#include <iostream>

#include <time.h>

#include <windows.h>

#include <cstdio>

#include <fstream>

using namespace std;

extern "C" int FunC(int*, int, int*, int, int*);

int comp(const void * p1, const void * p2) {

return *(int *)p1 - *(int *)p2;

}

typedef struct Node{

int N, Left, Right, numG;

int* mas;

int* masL;

int* Answer;

}node;

void out(ostream& streamOut, node date){

streamOut << "Массив:" << endl;

for (int i = 0; i < date.N; i++)

streamOut << date.mas[i] << " ";

streamOut << endl << "Границы:" << endl;

if (date.numG == 0) streamOut << "Дополнительных границ нет!" << endl;

for (int i = 0; i < date.numG; i++)

streamOut << date.masL[i] << " ";

streamOut << endl;

streamOut << "Распределение случайных чисел по заданным интервалам:\n";

streamOut << "№0 [" << date.Left << ";" << date.masL[0] << ") Количество попаданий:" << date.Answer[0] << endl;

for (int i = 0; i < date.numG - 1; i++)

streamOut << "№" << i + 1 << " [" << date.masL[i] << ";" << date.masL[i + 1] << ") Количество попаданий:" << date.Answer[i + 1] << endl;

streamOut << "№" << date.numG << " [" << date.masL[date.numG - 1] << ";" << date.Right << ") Количество попаданий:" << date.Answer[date.numG] << endl;

}

int main() {

srand(time(NULL));

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int N = 0, Left = 0, Right = 0, numG = -1, i = 0;

while (N <= 0 || N > 16000) {

cout << "Введите длину массива псевдослучайных чисел (0<N<=16000): ";

cin >> N;

}

while ((Left == 0 && Right == 0) || Left >= Right) {

cout << endl << "Введите левую границу массива: ";

cin >> Left;

cout << endl << "Введите правую границу массива: ";

cin >> Right;

}

while (numG < 0 || numG>24) {

cout << endl << "Введите количество левых границ (0 <= N <= 24): ";

cin >> numG;

}

int *masL = new int[numG];

for (i = 0; i < numG; i++) {

cout << endl << "Введите левую границу № " << i + 1 << ": ";

cin >> masL[i];

while (masL[i] <= Left || masL[i] >= Right) {

cout << "Введите левую границу № " << i + 1 << ": ";

cin >> masL[i];

}

}

int *mas = new int[N];

for (i = 0; i < N; i++)

mas[i] = rand() % (Right - Left + 1) + Left;

qsort(mas, N, sizeof(int), comp);

qsort(masL, numG, sizeof(int), comp);

int* Answer = (int*)calloc(numG + 1, sizeof(int));

FunC(mas, N, masL, numG, Answer);

node date = { N, Left, Right, numG,mas, masL, Answer};

ofstream fout;

fout.open("file.txt");

out(fout,date);

out(cout,date);

fout.close();

system("pause");

return 0;

}

Код программы FunC.asm

.586

.model flat, C

data_seg SEGMENT

index dword 0

data_seg ENDS

.CODE

FunC proc C public

push ebp

mov ebp,esp

mov esi, [ebp+8] ;массив

mov ebx, [ebp+12] ;длина массива

mov edx, [ebp+16] ;левые границы

mov ecx, [ebp+20] ;длина массива левых границ

mov edi, [ebp+24] ;массив ответов

M0:

test ebx, ebx

je end0

mov eax, [esi]

;заполнение регистров и переменных для следующего шага

dec ebx

add esi,4

mov edi,[ebp+24]

mov edx,[ebp+16]

mov ecx,[ebp+20]

mov index,0

;поиск количества цифр для данного отрезка

M2:

test ecx, ecx

je M3

cmp eax, [edx]

jl M3

add edx,4

add index,4

dec ecx

jmp M2

;запись числа в массив ответов

M3:

add edi,index

mov eax,[edi]

add eax,1

mov [edi],eax

jmp M0

end0:

pop ebp

ret

FunC ENDP

END

6

Соседние файлы в папке lab6