lab6 / report_lr6
.doc
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра МОЭВМ
отчет
по лабораторной работе №6
по дисциплине «Организация ЭВМ и систем»
Тема: «Организация связи Ассемблера с ЯВУ на примере программы построения частотного распределение попаданий псевдослучайных целых чисел в заданные интервалы»
Студент гр. 3303 |
|
|
Преподаватель |
|
|
Санкт-Петербург
2018
Цель работы.
Ознакомиться с организацией связи Ассемблера с ЯВУ, а затем разработать программу построения частотного распределение попаданий псевдослучайных целых чисел в заданные интервалы.
Постановка задачи.
На языке высокого уровня запрограммировать ввод с клавиатуры и контроль исходных данных, а также генерацию массива псевдослучайных целых чисел. Далее написать ассемблерную процедуры для формирования распределения количества попаданий псевдослучайных целых чисел в заданные интервалы. Результирующий массив частотного распределения чисел по интервалам, сформированный на ассемблерном уровне, возвратить в программу, реализованную на ЯВУ, и затем вывести на экран и в файл средствами ЯВУ.
Исходные данные:
1. Длина массива псевдослучайных целых чисел (<= 16K)
2. Диапазон изменения массива псевдослучайных целых чисел [Xmin, Xmax].
3. Массив псевдослучайных целых чисел.
4. Количество интервалов, на которые разбивается диапазон изменения массива псевдослучайных целых чисел (<=24)
5. Массив левых границ интервалов разбиения должны принадлежать интервалу [Xmin, Xmax].
Ход работы.
Была написана требуемая программа. Считывание, генерирование массива и вывод данных осуществлялся с помощью языка СИ, поиск количества вхождений целых чисел в заданные интервалы, осуществляется с помощью независимо скомпилированного модуля ассемблерной процедуры. Код программы представлен в приложении A.
Программа была успешно протестирована согласно рис.1.
Рисунок 1 – Тестирование программы.
Вывод:
В ходе выполнения лабораторной работы произошло ознакомление с организацией связи Ассемблера с ЯВУ, разработана программа построения частотного распределение попаданий псевдослучайных целых чисел в заданные интервалы. Построенная программа была протестирована.
Приложение А
Код программы lab.сpp
#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