Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты по данной тематике | Номер выпуска: | 1489 | | Дата выхода: | 17.11.2011, 12:00 | | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | | Подписчиков / экспертов: | 189 / 61 | | Вопросов / ответов: | 1 / 1 | Консультация # 184425: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: В массиве А[1..28] определить максимальное значение. Все элементы, лежащие до максимального, увеличить на первое значение массива, а все числа, после максимального, рассортировать по убыванию. Программу реализовать в виде четырех связок:... Консультация # 184425: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: В массиве А[1..28] определить максимальное значение. Все элементы, лежащие до максимального, увеличить на первое значение массива, а все числа, после максимального, рассортировать по убыванию. Программу реализовать в виде четырех связок: 1. Ввод-вывод на языке высокого уровня, обработка на языке высокого уровня 2. Ввод-вывод на языке высокого уровня, обработка на языке низкого уровня 3. Ввод-вывод на языке низкого уровня, обработка на языке высокого уровня 4. Ввод-вывод на языке низкого уровня, обработка на языке низкого уровня Т. е. требуется написать четыре программных модуля: 1. Ввод-вывод на языке высокого уровня 2. Обработка на языке высокого уровня 3. Ввод-вывод на языке низкого уровня 4. Обработка на языке низкого уровня
желательно побольше коментариев, можно делать C++ asm или Pas asm
Дата отправки: 12.11.2011, 11:40 Вопрос задал: Посетитель - 385274 (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, Посетитель - 385274! "Обработка на языке низкого уровня" - doAsm.asm
Код : .386 .model flat, stdcall option casemap :none .code ;самое маленькое целое число (для поиска максимума) LONG_MIN equ -2147483648 ;модуль на Ассемблере ;параметры - адрес массива dword-ов и их количество public doAsm doAsm proc uses esi edi ebx, pInt:dword, count:dword ;ищем максимум mov ebx, pInt ;адрес масива mov ecx, count ;количество jcxz doRet ;=0 - ничего не делаем xor esi, esi ;индекс в массиве mov edx, LONG_MIN ;max maxLoop: mov eax, [ebx+esi*4];очередной элемент cmp eax, edx ;сравниваем jle maxNext ;сохраняем, если больше максимального mov edi, esi ;индекс mov edx, eax ;значение maxNext: inc esi ;индекс следующего loop maxLoop ;по всем ;прибавим к элементам до максимального значение первого mov ecx, edi ;индекс максимального jcxz sortAfter ;если первый, то ничего не делаем mov eax, [ebx] ;первый xor esi, esi ;индекс addBefore: add [ebx+esi*4],eax ;добавляем inc esi ;на следующий loop addBefore ;сортируем "пузырьком" по убыванию элементы за максимальным sortAfter: lea esi, [edi+1] ;начальный индекс области сортировки mov ecx, count ;общее количество sub ecx, esi ;ecx - число сортируемых элементов cmp ecx, 2 ;0 и 1 нет смысла сортировать jb doRet dec ecx ;число сравнений sortLoop: ;цикл по поиску очередного минимального lea edi, [esi+1] ;начинаем со следующего push ecx ;сохраним счетчик mov eax, [ebx+esi*4];текущий минимальный по индексу esi searchMinLoop: ;цикл по всем последующим ;сравниваем текущий со всеми последующими cmp eax, [ebx+edi*4];если текущий минимальный >= последующего, jge sortNext ; то обходим обмен ;меняем местами элементы xchg eax, [ebx+edi*4];меняем местами mov [ebx+esi*4], eax;по индексу esi и в eax новый минимальный sortNext: inc edi ;на следующий последующий loop searchMinLoop inc esi ;на следующий текущий pop ecx ;восстановим счетчик сравнений loop sortLoop doRet: ret doAsm endp end "Обработка на языке высокого уровня" - doC.cpp
Код : #define LONG_MIN -2147483647 //то же самое, что и в модуле на Ассемблере extern "C" void _stdcall doC(int * pInt, int count) { int max = LONG_MIN; int i,j,k,idxMax; if (count) { //ищем максимальный for (i=0; i<count; i++) { if (pInt[i] > max) { idxMax = i; //индекс максимального max = pInt[i]; //значение } } j = pInt[0]; //первый for (i=0 ; i<idxMax; i++) pInt[i] += j; //добавляем первого до элементов слева //сортируем "пузырьком" элементы справа for (i=idxMax+1; i<count-1; i++) { for (j=i+1; j<count; j++) { if (pInt[i] < pInt[j]) { k = pInt[i]; pInt[i] = pInt[j]; pInt[j] = k; } } } } } "Ввод-вывод на языке низкого уровня" - main.asm c вызовом модуля на Асм (вызов модуля на С задается заменой вызова doAsm на doC)
Код : .386 model flat, stdcall option casemap :none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib StdOut PROTO :DWORD doAsm PROTO :DWORD, :DWORD .data ;данные A dd 123, -23, -567, 0, 234, 345, 34, 2, 1, 23, 9, 70, 91, 101 dd 400, 76, -4, -45, 38, 55, 100, 0, 39, 12, 5, 8, 150, 17 lenA equ ($-A)/4 sA db 'A = ',0 format db '%d ',0 sEOL db 0dh,0ah,0 .code main proc local buffer[64]:byte ;буфер для преобразования числа в строку invoke doAsm, addr A, lenA ;вызываем модуль на Asm invoke StdOut, addr sA ;выводим "А = " ;выводим все элементы массива mov ecx, lenA ;длина массива xor esi, esi ;индекс printLoop: push ecx ;преобразуем один элемент в строку invoke wsprintf, addr buffer, addr format, dword ptr A[esi*4] ;выведем invoke StdOut, addr buffer inc esi ;индекс слкдующего pop ecx loop printLoop ;по всем invoke StdOut, addr sEOL ;перевод строки invoke ExitProcess, NULL main endp StdOut proc lpszText:DWORD ;вывод строки на стандартное выходное устройство LOCAL hOutPut :DWORD, bWritten:DWORD, len:DWORD ;получаем handle устройства invoke GetStdHandle,STD_OUTPUT_HANDLE mov hOutPut, eax ;получаем длину строки invoke lstrlen,lpszText mov len, eax ;выводим invoke WriteFile,hOutPut,lpszText,len,ADDR bWritten,NULL mov eax, bWritten ret StdOut endp end main "Ввод-вывод на языке высокого уровня" - main.cpp c вызовом модуля на C (вызов модуля на Asm задается заменой вызова doC на doAsm)
Код : #include <stdio.h> extern "C" void _stdcall doC(int *, int); //массив int A[28] = {123, -23, -567, 0, 234, 345, 34, 2, 1, 23, 9, 70, 91, 101, 400, 76, -4, -45, 38, 55, 100, 0, 39, 12, 5, 8, 150, 17}; int main() { int count = sizeof(A)/sizeof(int); //число элементов doC(A, count); //вызываем модуль на С printf ("A = "); //выводим "А = " for(int i=0; i<count; i++) { printf("%d ",A[i]); //выводим все элементы через пробел } printf("\n"); return 0; }
Все четыре проекта - Asm_Cpp.rar (11.3 кб)  | Консультировал: Лысков Игорь Витальевич (Старший модератор) Дата отправки: 14.11.2011, 18:19 5 нет комментария ----- Дата оценки: 17.11.2011, 10:54 | Рейтинг ответа: 0 |
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка | восстановить логин/пароль Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий