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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2013, 16:39   #1
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию Ассемблер. Ret, Call

подскажите пожалуйста как вернуть значение функции через ассемблер? пишу в студии, то есть через ассемблерную вставку, делаю так:

Код:
__declspec(naked)
int Function()
{
__asm
{
...
ret
}
}
ret возвращает из функции, но как задать то что она возвращает? она вообще что то возвращает? ну в смысле число

Последний раз редактировалось NewLamer&Programer; 23.05.2013 в 16:54.
NewLamer&Programer вне форума Ответить с цитированием
Старый 23.05.2013, 18:52   #2
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

или даже ладно, возможно прокатит без __declspec(naked), сделал так:

Код:
#define _CRT_NONSTDC_NO_WARNINGS
#include <stdio.h>
#include <conio.h>

int _add(int a, int b)
{
	int result;
	__asm
	{
		push eax
		push ebx

		mov eax, a
		mov ebx, b

		add eax, ebx
		
		mov result, eax

		pop ebx
		pop eax
	}
	return result;
}

int _sub(int a, int b)
{
	int result;
	__asm
	{
		push eax
		push ebx

		mov eax, a
		mov ebx, b

		sub eax, ebx
		
		mov result, eax

		pop ebx
		pop eax
	}
	return result;
}

int _imul(int a, int b)
{
	int result;
	__asm
	{
		push eax
		push ebx

		mov eax, a
		mov ebx, b

		imul eax, ebx
		
		mov result, eax

		pop ebx
		pop eax
	}
	return result;
}

int _idiv(int a, int b)
{
	int result;
	__asm
	{
		push eax
		push ebx
		push edx

		mov eax, a
		mov ebx, b
		mov edx, 0

		idiv ebx
		
		mov result, eax

		pop edx
		pop ebx
		pop eax
	}
	return result;
}

int Function(int a, int b, int c, int d, int e) //y = a - b + c * d / e
{
	int result;
	__asm
	{
		call _idiv(d,e)
		mov result, eax
		call _imul(c,result)
		mov result, eax
		call _add(b,result)
		mov result, eax
		call _sub(a,result)
		mov result, eax
	}
	return result;
}

void main()
{
	int a, b, c, d, e, f;

	printf("y = a - b + c * d / e\n\n");
	printf("a = ");
	scanf("%d",&a);
	printf("b = ");
	scanf("%d",&b);
	printf("c = ");
	scanf("%d",&c);
	printf("d = ");
	scanf("%d",&d);
	printf("e = ");
	scanf("%d",&e);
	f = Function(a,b,c,d,e);
	printf("\nf(a,b,c,d,e) = %d", f);
	getch();
}
только вот ошибки

error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в 'второй операнд'; обнаружено '('
error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в 'код операции'; обнаружено '('
warning C4405: mov: идентификатор является зарезервированным словом
error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в 'второй операнд'; обнаружено '('
error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в 'код операции'; обнаружено '('
warning C4405: mov: идентификатор является зарезервированным словом
error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в 'второй операнд'; обнаружено '('
error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в 'код операции'; обнаружено '('
warning C4405: mov: идентификатор является зарезервированным словом
error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в 'второй операнд'; обнаружено '('
error C2400: синтаксическая ошибка во встроенном коде на языке ассемблера в 'код операции'; обнаружено '('
warning C4405: mov: идентификатор является зарезервированным словом
NewLamer&Programer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CALL и RET (иерархия вызовов процедур) Livores Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 11.07.2013 15:59
call of nonfunction d1g1 Общие вопросы C/C++ 4 05.02.2011 00:36
invoke = push+call \ ddinvoke = ?+push+call blinkapec Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 03.02.2011 01:52
Call of nonfunction balalay12 Общие вопросы C/C++ 2 27.09.2010 09:34