 
 
Почему оно так-хрен его знает. Параметры передаются корректно и возврат происходит тоже корректно.
Вот код:
- Код: Выделить всё
- #COMPILE EXE "PC.exe"
 #INCLUDE "Win32API.inc"
 FUNCTION PBMAIN
 DIM adr AS LONG, st(0) AS LONG
 adr=GetProcAddress(GetModuleHandle("user32.dll"),"MessageBoxA")
 st(0)=200
 adr=CODEPTR(SFunc)
 CALL PCall (Adr, VARPTR (st(0)),4)
 MSGBOX "Выполнено"
 END FUNCTION
 FUNCTION PCall(BYVAL Adr AS LONG,BYVAL pStack AS LONG, BYVAL SS AS LONG)EXPORT AS LONG
 DIM cma AS LONG, ret AS LONG
 cma=GetProcAddress(GetModuleHandle("kernel32.dll"),"RtlMoveMemory")
 DIM n AS LONG
 !mov eax,SS
 !sub esp,eax
 !mov n, esp
 !push eax
 !push pStack
 !push n
 !call cma
 !call Adr
 END FUNCTION
 FUNCTION SFunc(BYVAL Arg1 AS DWORD) AS LONG
 MSGBOX HEX$(arg1)'+ " "+HEX$(arg2)
 END FUNCTION
Другой вариант PCall(тот же результат):
- Код: Выделить всё
- FUNCTION PCall1(BYVAL Adr AS DWORD,BYVAL Stack AS DWORD,BYVAL StackSize AS DWORD) AS LONG
 !xor eax, eax
 !mov edi, Stack
 !mov ecx, StackSize
 !add ecx, edi
 !dec ecx
 stloop:
 !cmp ecx, edi
 !je eloop
 !mov al, [ecx]
 !mov [esp], al
 !dec ecx
 !dec esp
 !jmp stloop
 eloop:
 !call Adr
 END FUNCTION
Аналогичная тема: http://www.fire-lines.com/forum/viewtopic.php?p=542#542




