dark_rain, старт переименуй во что-нибуть, например myfunc
далее, т.к. эту функцию могут вызывать другие значит парметры тебе переданны через стек, результат отдашь через eax
всё что тебе нужно вполнить стандартные манипуляции по выборки данных из стека, сохранению текущего состояния стека(для последующего востановления) и вернуть результат вычислений через eax
в с++(для меня он роднее чем C)
коде пишешь
extern "C"{
extern long myfunc(long x, long a, long b, long c);
}
int main()
{
long x = 0;
long a = 0;
long b = 0;
long c = 0;
std::cout << "Enter x: ";
std::cin >> x;
std::cout << "Enter a: ";
std::cin >> a;
std::cout << "Enter b: ";
std::cin >> b;
std::cout << "Enter c: ";
std::cin >> c;
std::cout << "Result: " << myfunc(x,a,b,c) << std::endl;
}
после компиляции asm и C++ делаешь линковку
ld -o test asm.obj c.obj -lstdc++
усё
вот кусок из доку по nasm о том как создать функцию в C стиле
Thus, you would define a function in C style in the following way:
global _myfunc
_myfunc:
push ebp
mov ebp,esp
sub esp,0x40 ; 64 bytes of local stack space
mov ebx,[ebp+8] ; first parameter to function
; some more code
leave ; mov esp,ebp / pop ebp
ret
вот кусок о том как вызывать функции в C стиле
At the other end of the process, to call a C function from your assembly code, you would do something like this:
extern _printf
; and then, further down...
push dword [myint] ; one of my integer variables
push dword mystring ; pointer into my data segment
call _printf
add esp,byte 8 ; `byte' saves space
; then those data items...
segment _DATA
myint dd 1234
mystring db 'This number -> %d <- should be 1234',10,0
This piece of code is the assembly equivalent of the C code
int myint = 1234;
printf("This number -> %d <- should be 1234\n", myint);
рекомендую обрать внимание на примеры
http://flatassembler.net/examples.phpособенно на пример "Mixing assembly with MS Visual C"
не знаю под какую ось ты пишешь, если винда, то примера тебе хватит, если Linux, то придётся немного адаптировать код