mov a, e).Ассемблерныекодыввидекомандассемблеравставляютсявax mov b, e).Ассемблерныекодыввидекомандассемблеравставляютсявdx mov c, e).Ассемблерныекодыввидекомандассемблеравставляютсявcx mov d, [e).Ассемблерныекодыввидекомандассемблеравставляютсявbp+8] mov e).Ассемблерныекодыввидекомандассемблеравставляютсяв, [e).Ассемблерныекодыввидекомандассемблеравставляютсявbp+12] mov f, [e).Ассемблерныекодыввидекомандассемблеравставляютсявbp+16]
Вслучае если стек был задействован, освобождение его возлагается на вызываемую процедуру.
Вслучае быстрого вызова транслятор Си добавляет к имени значок @ спереди, что искажает имена при обращении к ним в ассемблерном модуле.
Возврат результата из процедуры Чтобы возвратить результат в программу на С из процедуры на ассемблере,
перед возвратом управления в вызываемой процедуре (на языке ассемблера) необходимо поместить результат в соответствующий регистр
Задание
На языке высокого уровня (Pascal или С) генерируется массив псевдослучайных целых чисел, изменяющихся в заданном диапазоне и
имеющих |
равномерное |
распределение. |
Необходимые |
датчики |
псевдослучайных чисел |
находятся в каталоге |
Tasks\RAND_GEN |
(пpи его |
|
отсутствии программу датчика получить у пpеподавателя).
Далее должен вызываться ассемблерный модуль(модули) для формирования
распределения количества попаданий псевдослучайных целых |
чисел в |
заданные интервалы. В общем случае интервалы разбиения |
диапазона |
изменения псевдослучайных чисел могут иметь различную длину. Результирующий массив частотного распределения чисел по интервалам, сформированный на ассемблерном уровне, возвращается в программу, реализованную на ЯВУ, и затем сохраняется в файле и выводится на экран средствами ЯВУ.
6
Исходные данные.
1.Длина массива псевдослучайных целыхчисел - NumRanDat (<= 16K, К=1024)
2.Диапазон изменения массива псевдослучайных целых чисел [Xmin, Xmax] , значения могут быть биполярные;
3.Количество интервалов, на которые разбивается диапазон изменения массива псевдослучайных целых чисел - NInt ( <=24 )
4.Массив левых границ интервалов разбиения LGrInt (должны принадлежать интервалу [Xmin, Xmax]).
Результаты:
1.Текстовый файл, строка которого содержит:
-номер интервала,
-левую границу интервала,
-количество псевдослучайных чисел, попавших в интервал. Количество строк равно числу интервалов разбиения.
2.График, отражающий распределение чисел по интервалам. (необязательный результат)
Взависимости от номера бригады формирование частотного распределения должно производиться по одному из двух вариантов:
1.Для бригад с нечетным номером: подпрограмма формирования распределения количества попаданий псевдослучайных целых чисел в заданные интервалы реализуется в виде одного ассемблерного модуля, сразу формирующего требуемое распределение и возвращающего его в головную программу, написанную на ЯВУ;
2.Для бригад с четным номером: подпрограмма формирования распределения количества попаданий псевдослучайных целых чисел в заданные интервалы реализуется в виде двух ассемблерных модулей, первый из которых формирует распределение исходных чисел по интервалам единичной
7
длины и возвращает его в вызывающую программу на ЯВУ как промежуточный результат. Это распределение должно выводиться в текстовом виде для контроля. Затем вызывается второй ассемблерный модуль, который по этому промежуточному распределению формирует окончательное распределение псевдослучайных целых чисел по интервалам произвольной длины (с заданными границами). Это распределение возвращается в головную программу и выдается как основной результат в виде текстового файла и, возможно, графика.
Выполнение
Программа реализована с использованием ЯВУ С++. Функционал ЯВУ используется для объявления переменных, инициализации массивов ввода/вывода информации из стандартного потока.
Программа начинается со считывания данных из потока ввода. Далее производится заполнение массива чисел случайными числами, сгенерированными функцией dnk_normal. Имеющиеся данные передаются в функцию, реализованную на языке ассемблера.
void MAS_FUNC(int n, int ni, int xmi, int xma, int* nums, int* lB, int* re).Ассемблерныекодыввидекомандассемблеравставляютсявs); Функция на вссемблере пробегает массив чисел, проверяя их на принадлежность интервалу. При назождении числа в интервале соответствующая ячейка результирующего массива увеличивается на 1. После прохода всего массива программы возвращает управление в программу на ЯВУ. Там происходит форматный вывод данных в виде таблицы
Тестирование.
1.
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr amount of e).Ассемблерныекодыввидекомандассемблеравставляютсявle).Ассемблерныекодыввидекомандассемблеравставляютсявme).Ассемблерныекодыввидекомандассемблеравставляютсявnts: 5
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr amount of inte).Ассемблерныекодыввидекомандассемблеравставляютсявrvals: 2
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr lowe).Ассемблерныекодыввидекомандассемблеравставляютсявr borde).Ассемблерныекодыввидекомандассемблеравставляютсявr:
8
-5
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr uppe).Ассемблерныекодыввидекомандассемблеравставляютсявr borde).Ассемблерныекодыввидекомандассемблеравставляютсявr: 5
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr 1 le).Ассемблерныекодыввидекомандассемблеравставляютсявft borde).Ассемблерныекодыввидекомандассемблеравставляютсявrs: 1
NInt |
lGrInt Num |
|
0 |
-5 |
4 |
1 |
1 |
1 |
2.
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr amount of e).Ассемблерныекодыввидекомандассемблеравставляютсявle).Ассемблерныекодыввидекомандассемблеравставляютсявme).Ассемблерныекодыввидекомандассемблеравставляютсявnts: 10000
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr amount of inte).Ассемблерныекодыввидекомандассемблеравставляютсявrvals: 10
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr lowe).Ассемблерныекодыввидекомандассемблеравставляютсявr borde).Ассемблерныекодыввидекомандассемблеравставляютсявr: -10
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr uppe).Ассемблерныекодыввидекомандассемблеравставляютсявr borde).Ассемблерныекодыввидекомандассемблеравставляютсявr: 10
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr 9 le).Ассемблерныекодыввидекомандассемблеравставляютсявft borde).Ассемблерныекодыввидекомандассемблеравставляютсявrs: -8 -6 -4 -2 0 2 4 6 8
NInt |
lGrInt Num |
|
0 |
-10 |
2247 |
1 |
-8 |
656 |
2 |
-6 |
740 |
3 |
-4 |
776 |
4 |
-2 |
791 |
5 |
0 |
771 |
6 |
2 |
753 |
7 |
4 |
690 |
9
8 |
6 |
589 |
9 |
8 |
1987 |
3.
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr amount of e).Ассемблерныекодыввидекомандассемблеравставляютсявle).Ассемблерныекодыввидекомандассемблеравставляютсявme).Ассемблерныекодыввидекомандассемблеравставляютсявnts: 10000
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr amount of inte).Ассемблерныекодыввидекомандассемблеравставляютсявrvals: 10
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr lowe).Ассемблерныекодыввидекомандассемблеравставляютсявr borde).Ассемблерныекодыввидекомандассемблеравставляютсявr: -50
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr uppe).Ассемблерныекодыввидекомандассемблеравставляютсявr borde).Ассемблерныекодыввидекомандассемблеравставляютсявr: -30
Ente).Ассемблерныекодыввидекомандассемблеравставляютсявr 9 le).Ассемблерныекодыввидекомандассемблеравставляютсявft borde).Ассемблерныекодыввидекомандассемблеравставляютсявrs:
-48 -46 -44 -42 -40 -38 -36 -34 -32
NInt |
lGrInt Num |
|
0 |
-50 |
2247 |
1 |
-48 |
656 |
2 |
-46 |
740 |
3 |
-44 |
776 |
4 |
-42 |
791 |
5 |
-40 |
771 |
6 |
-38 |
753 |
7 |
-36 |
690 |
8 |
-34 |
589 |
9-32 1987
Выводы.
В результате работы были разобраны некоторые концепции совмещения языка ассемблера с ЯВУ. Были изучены Способу передачи аргументов в функцию и возвращение значений. Была написана рабочая программа для исследования распределения псевдослучайных величин.
10