درود به همه
مدتی هست دارم توی دلفی اسمبلی کار میکنم ، یه چیز منو اذیت میکرد اونم استفاده از توابع API توی اسمبلی بود (ارسال دونه به دونه پارامترها و ...)که با تابع زیر مشکلم حل شد
خدا کنه برای شما هم مفید باشه.
اول یه مثال از انجام کار بدون تابعی که نوشتم و بعد هم یک مثال با استفاده از تابعی که نوشتم :
function ASM_MessageBox(const AText, ACaption: AnsiString): DWORD;
const
user32 = 'user32.dll';
Var
pASM_MessageBox: Pointer;
begin
pASM_MessageBox := GetProcAddress(LoadLibrary(user32), 'MessageBoxA');
if pASM_MessageBox <> nil then
begin
asm
{ ;push parameter N
;push parameter2
;push parameter1
;call procedure
}
PUSH EAX
PUSH EBX
XOR EBX, EBX // EBX = 0
PUSH 4+64 // ;uType: UINT --> 4 = MB_YESNO and 46 = MB_ICONINFORMATION
PUSH ACaption // ;lpCaption: PAnsiChar -->ACaption;
PUSH AText // ;lpText: PAnsiChar --> AText
PUSH 0 // ;hWnd: HWND -->0 = Application.Handle
MOV EAX, pASM_MessageBox
CALL EAX // Run MessageBoxA
MOV Result,eax // Result --> 6=Yes | 7=NO
POP EBX
POP EAX
end;
end
else
ShowMessage('Oops !');
end;
اینم نحوه استفاده :
procedure Test_ASM_MSG();
var
Ret: Integer;
begin
Ret := ASM_MessageBox('Like ??', 'MessageBox by Inline Assembly');
if Ret = 6 then
ShowMessage('Yes')
else if Ret = 7 then
ShowMessage('NO');
end;
اینم تابع :
function ASM_Invoke(AFunction: Pointer; const AArguments: array of const)
: Cardinal; stdcall;
var
iIndex, iCurrentArgument: Integer;
begin
Result := 0;
for iIndex := High(AArguments) downto Low(AArguments) do
begin
iCurrentArgument := AArguments[iIndex].VInteger;
asm
push iCurrentArgument
end;
end;
asm
call AFunction
mov Result, eax
end;
end;
اینم همون مثال اول با تابعی که نوشتم:
procedure Test_ASM_MSG();
var
Text: AnsiString;
Caption: AnsiString;
ret: Integer;
begin
Text := 'Hello World ';
Caption := 'Test Invoke';
ret := ASM_Invoke(@Winapi.Windows.MessageBoxA,
[0, Text, Caption, MB_YESNO or MB_ICONINFORMATION]);
if ret = 6 then
ShowMessage('Yes')
else if ret = 7 then
ShowMessage('NO');
end;
موفق باشید