Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Лістинг на Assembler





title Lab_4

.MODEL LARGE, C

LOCALS @@

.DATA

; ГЛОБАЛЬНЫЕ переменные

EXTRN C array:WORD, array_size:WORD, exist:BYTE

.CODE

EXTRN C RangeError: Far; ВНЕШНЯЯ процедура

PUBLIC C calc

arr EQU array[BX]

calc proc far

ARG L:WORD RETURNS res:WORD

mov exist,0; ok!

mov res,1; res = 1;

XOR SI,SI; j=0;

XOR BX,BX; регистр-индекс

; Подводим указатель BX к последнему элементу

mov DI,array_size

dec DI; array_size-1

mov cx, DI

JCXZ @@Exit

@@Begin1:

inc BX

inc BX

LOOP @@Begin1

;------------------- СОБСТВЕННО РЕШЕНИЕ ЗАДАЧИ:

mov cx, array_size

@@Begin:

mov DI,arr; array[i];

cmp DI,0; if (array[i]>0)

JLE @@Cont; НЕТ

;========== array[i]>0 ===========================

inc SI; j++;

; сохранение регистров перед вызовом внешней процедуры

push ax bx cx dx DI SI

; Визуализация вычислений на С++

call RangeError C, SI,DI

; восстановление регистров после отработки внешней процедуры

pop SI DI dx cx bx ax

;res *= array[i];

mov ax,res

MUL DI; <dx:ax>=<ax>*res

JC @@ERROR; ловим переполнение

mov res,ax; регистром DX ПРЕНЕБРЕГАЕМ!!!

;if (j==l) return res

cmp SI,L

JE @@Exit

@@Cont:

; i--;

dec BX

dec BX

LOOP @@Begin

cmp SI,0; нашли положительные элементы?

JG @@Exit; ДА

mov exist,-1; НЕТ положительных элементов!!!

@@Exit:

ret

@@ERROR:

mov exist,1; признак ошибки по переполнению умножения

JMP @@Exit

calc endp

end

 

Лістинг на С++

/* Lab4.cpp Borland C++ 5.02

Проект!!!!!! Application.exe === > DOS (standard)!!!!!!

Лабораторная работа # 4.

Найти произведение последних L положительных элементов массива

int array[array_size], 2<=array_size<=100

*/

 

#include <iomanip.h> // манипулятор setw(8)

#include <conio.h> //getch(); clrscr();

#include <fstream.h>

#include <stdlib.h> // void randomize(void); int random (int)

#include "convert.h" // Перекодировка КИРИЛЛИЦЫ Win--->DOS

 

const char* DATA_ERROR = TXT("Ошибка при вводе данных!!!\n");

const char* REPEAT = TXT("Повторите еще раз, пожалуйста...\n");

const char* VALUE = TXT("Значение должно быть от ");

const char* TO = TXT(" до ");

const char* VALUE_RANGE = TXT("Значение превысило допустимый диапазон\n");

const char* TITLE = TXT("Найти произведение последних L положительных элементов массива\n");

const char* ENTER_LEN = TXT("Введите длину массива или ");

const char* MEMORY = TXT("НЕВОЗМОЖНО распределить память для массива!!!\n");

const char* MULT = TXT("Введите количество умножаемых элементов\n");

const char* NO_ELEM = TXT("В данном массиве НЕТ положительных элементов!!!\n");

const char* RESULT_RANGE = TXT("Ошибка!!! Результат превышает допустимый диапазон: 65535\n");

const char* ASM_CALC = TXT("\nАссемблер: Произведение до конца вычислить НЕ удалось!!!\n");

//const char* RES_ASM = TXT("Произведение БЕЗ последнего элемента: ");

 

const int N=100;

 

//ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ

int array[N];

unsigned int array_size;

char exist=0;

 

extern "C"

{

unsigned int far calc(int L);

void RangeError(int i, int buf);

}

 

////////// Визуализация вычислений в С++ и на Ассемблере /////////////////

//

void RangeError(int j, int buf)

{

if (j==1) cout << buf;

else cout << "*" << buf;

}

 

//////////////////////// КОРРЕКТНЫЙ ВВОД /////////////////////////

//

template <class typData>

int input (typData& k)

{

ifstream my_inp ("CON");

my_inp >> k;

switch (my_inp.rdstate())

{ case ios::failbit:

case ios::badbit:

cout << DATA_ERROR << REPEAT;

cout.flush();

return 1;

default:

return 0; // ok!

}

}

 

/////////////////// ВВОД С КОНТРОЛЕМ ДИАПАЗОНА //////////////////////

//

template <class typData>

int InputNum(typData& z, const long MIN=2L, const long MAX=N)

{

long int temp; //!!!!!!!!!!

int exit_func=0;

while (exit_func==0)

{

cout << VALUE << MIN << TO << MAX << " ===> ";

cout.flush();

while (input(temp));

if ((temp>=MIN)&&(temp<=MAX)) exit_func = 1;

else

{

textcolor(LIGHTRED);

clreol();

cout << VALUE_RANGE;

textcolor(GREEN);

clreol();

cout.flush();

}

}

z=(typData)temp;

return exit_func;

}

 

///////////////////////// ВВОД ЭЛЕМЕНТОВ МАССИВА ///////////////

//

void inputArray(int A[], int array_size)

{

randomize(); int j=1;

for (int i=0; i<array_size; i++)

if (array_size<11)

{

cout << "Enter A[" << i << "]"<< endl;

InputNum(A[i],-32768L, 32767L);

}

else

{ j = -j;

array[i]= j*random (130);

}

}

 

///////////////////////// ВЫВОД ЭЛЕМЕНТОВ МАССИВА ////////////////////

//

void outputArray(const int A[], int n)

{ cout << "\n================================================================\n"

<< " Array: \n";

for (int i=0; i<n; i++)

cout << setw(8) << A[i];

cout << endl;

}

 

//////////////////////// ОСНОВНАЯ ЗАДАЧА ////////////////////////////

//

double calc_c(const int array[], const int l, const int array_size)

{

double res = 1; //!!!!!!!!!!!!!!!!!

exist=0;

int i=array_size-1;

int j=0; // счетчик положительных элементов

while (i>=0)

{

if (array[i]>0)

{

j++;

RangeError(j, array[i]); // Визуализация вычислений

res *= array[i];

exist=1;

if (j==l) return res;

}

i--;

}

return res;

}

 

/////////////////////////////////////////////////////////////////

// main program

void main()

{

int l,t=1;

for(;;)

{

textcolor(WHITE);

clrscr();

cout << "\n========= test #" << t++ << "===============\n"

<< TITLE << "int array[array_size], 2<=array_size<=" << N << endl;

cout << ENTER_LEN << " Ctrl-C (exit)" << endl;

// Ввод числа элементов массива

InputNum(array_size);

// Ввод элементов массива

inputArray(array, array_size);

outputArray(array, array_size);

cout << MULT;

cout.flush();

// Ввод числа перемножаемых элементов массива

InputNum(l, 1, array_size);

textcolor(WHITE);

// Вычисления на С++

cout << "\nC++ function calculation\n";

double res = calc_c(array, l, array_size);

if (exist == 0) cout << "C++: " << NO_ELEM << endl;

else

{

cout << " = " << res << endl;

if (res > 65535L) cout << RESULT_RANGE;

}

// Вычисления на Ассемблере

cout << "\nAsm function calculation\n";

unsigned resAsm = calc(l);

if (!exist) cout << " = " << resAsm << endl;

else if (exist == -1) cout << "ASM: " << NO_ELEM << endl;

else if (exist == 1)cout << ASM_CALC << endl;

cout.flush();

getch();

}

}







Дата добавления: 2015-09-19; просмотров: 394. Нарушение авторских прав; Мы поможем в написании вашей работы!




Аальтернативная стоимость. Кривая производственных возможностей В экономике Буридании есть 100 ед. труда с производительностью 4 м ткани или 2 кг мяса...


Вычисление основной дактилоскопической формулы Вычислением основной дактоформулы обычно занимается следователь. Для этого все десять пальцев разбиваются на пять пар...


Расчетные и графические задания Равновесный объем - это объем, определяемый равенством спроса и предложения...


Кардиналистский и ординалистский подходы Кардиналистский (количественный подход) к анализу полезности основан на представлении о возможности измерения различных благ в условных единицах полезности...

Алгоритм выполнения манипуляции Приемы наружного акушерского исследования. Приемы Леопольда – Левицкого. Цель...

ИГРЫ НА ТАКТИЛЬНОЕ ВЗАИМОДЕЙСТВИЕ Методические рекомендации по проведению игр на тактильное взаимодействие...

Реформы П.А.Столыпина Сегодня уже никто не сомневается в том, что экономическая политика П...

Прием и регистрация больных Пути госпитализации больных в стационар могут быть различны. В цен­тральное приемное отделение больные могут быть доставлены: 1) машиной скорой медицинской помощи в случае возникновения остро­го или обострения хронического заболевания...

ПУНКЦИЯ И КАТЕТЕРИЗАЦИЯ ПОДКЛЮЧИЧНОЙ ВЕНЫ   Пункцию и катетеризацию подключичной вены обычно производит хирург или анестезиолог, иногда — специально обученный терапевт...

Ситуация 26. ПРОВЕРЕНО МИНЗДРАВОМ   Станислав Свердлов закончил российско-американский факультет менеджмента Томского государственного университета...

Studopedia.info - Студопедия - 2014-2026 год . (0.009 сек.) русская версия | украинская версия