Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2012, 13:24   #1
Arnezami
Форумчанин
 
Регистрация: 04.10.2009
Сообщений: 147
Восклицание C + Assembler: Поиск наибольшего числа в массиве

Доброго времени суток! Народ, кто шарит в ассемблере, прошу вашей помощи. Задача следующая:

Необходимо связать assembler и язык высокого уровня С. Код на ассемблере должен быть отдельным файлом и с С я могу вызывать метод. Метод на ассемблере должен принимать указатель массива чисел и возвращать максимальное число.

IDE: Visual Studio 2010, MASM

Заранее спасибо!
Ув. Форумчане! Если мои советы были Вам полезны, не забывайте благодарить в виде повышение рейтинга!!!
http://vkontakte.ru/id6715558
Arnezami вне форума Ответить с цитированием
Старый 05.02.2012, 10:10   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Вот пример явной динамической линковки.

Код:
#include <windows.h>
typedef void (__stdcall *PROC2)(HANDLE,LPCSTR);	//объявление типа функции
typedef void (__stdcall *PROC1)(HANDLE,LPCSTR,DWORD);	//объявление типа функции
//Соглашение stdcall, как и в dll
int main()
{
HINSTANCE lib=LoadLibrary("kurs.dll");	//загрузка библиотеки
HANDLE in=GetStdHandle(STD_INPUT_HANDLE);	//получение хэндлов консоли
HANDLE out=GetStdHandle(STD_OUTPUT_HANDLE);	
if(lib)		//Если бибилиотека загрузилась
{
	char msg[256];	//вводимое сообщение
	//Получение адресов функций из dll
	PROC1 gets=(PROC1)GetProcAddress(lib,"gets");	
	PROC2 puts=(PROC2)GetProcAddress(lib,"puts");
	//Тестирование функций	
	puts(out,"Input Message: ");
	gets(in,msg,256);
	puts(out,"You are enter: ");
	puts(out,msg);
	puts(out,"To exit press Enter.");
	gets(in,msg,256);
	
	FreeLibrary(lib);//Выгрузить библиотеку
}
return 0;
}
Код:
;maket_dll.asm - каркас DLL-бiблiотеки.
;Мiстить двi функцiї - puts и gets
.486
locals
;модель пам'ятi flat,
;STDCALL - передача параметрiв у стилi С
;процедура, що викликається чистить за собою стек
.model flat,STDCALL
;заборонить вивiд тексту файлiв, що пiдключаються
%NOINCL
include WindowConA.inc
;об'явлення процедур puts gets загальнодоступ.
publicdll gets
publicdll puts
;оголошення зовнiшнiми використовуваних в данiй
;програмi функцiй Win32 (ASCII)
extrn	ReadConsoleA:PROC
extrn	WriteConsoleA:PROC
extrn	lstrlenA:PROC

.data
	dd 0	;Если не будет секции данных, линкер глючит и не создает секцию импорта
.code
;код iнiцiювання бiблiотеки
dllEntry proc
arg hlnstDLL:dword, event:dword,fImpLoad:dword
cmp [event],DLL_PROCESS_ATTACH
jne m ;виконуємо дiї для DLL_PROCESS_ATTACH
cmp [event],DLL_THREAD_ATTACH
jne m ; виконуємо дiї для DLL_THREAD_ATTACH
cmp [event], DLL_THREAD_DETACH
jne m ; виконуємо дiї для DLL_THREAD_DETACH
cmp [event],DLL_PROCESS_DETACH
jne m ; виконуємо дiї для DLL_PROCESS_DETACH
m:
mov eax,1
ret
dllEntry endp
;ввод строки с консоли
;h-хэндл консоли
;lp - указатель на буфер приема строки
;num - максимальное количество символов
gets proc h:DWORD,lp:DWORD,num:DWORD
	LOCAL tmp:DWORD	;временная переменная
	mov eax,lp	;адрес буфера
	mov ecx,num	;размер буфера
;очистка буфера
g1:	mov [eax],byte ptr 0	;записать 0 в очередной байт буфера
	inc eax		;следующий адрес
	dec ecx		;уменьшить количество оставшихся байт в буфере
	jnz g1		;продолжить пока не 0
	lea edx,tmp	;кол-во прочитанных символов
	push 0		;lpReserved
	push edx        ;кол-во прочитанных символов
	push num	;размер буфера
	push lp		;адрес буфера
	push h		;хэндл консоли
	call ReadConsoleA	;ввод строки с консоли
	ret			;выход из подпрограммы
gets endp

;Вывод строки в консоль
;h-хэндл консоли
;lp - указатель на строку
puts proc h:DWORD,lp:DWORD
	LOCAL tmp:DWORD ;временная переменная
	push lp		;адрес строки
	call lstrlenA	;получаем ее длину
	lea ecx,tmp	;кол-во прочитанных символов
	push 0		;lpReserved
	push ecx	;кол-во прочитанных символов
	push eax	;длина выводимой строки
	push lp		;адрес строки
	push h		;хэндл консоли
	call WriteConsoleA	;вывод на консоль
	ret	;выход из подпрограммы
puts endp

end dllEntry
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск максимального по модулю числа в массиве ( Assembler ) Forversc Помощь студентам 3 30.01.2012 15:05
4. Дан одномерный массив. Найдите разность наибольшего и наименьшего чисел в этом массиве. Иван_lk Помощь студентам 0 31.05.2011 20:46
Поиск элемента в двухмерном массиве (Assembler 86) bookkc Помощь студентам 1 26.11.2010 18:14
поиск определенного числа, в отсортированном массиве (с++) askerpro Общие вопросы C/C++ 7 29.04.2010 23:26
Нахождение наибольшего числа из промежутка BaronVik Паскаль, Turbo Pascal, PascalABC.NET 4 21.04.2010 16:36