دوست عزیز همانطور که می دونی توابع API توابعی هستند که در غالب DLL ها ، در حافظه توسط سیستم عامل Load می شوند تا سایر برنامه های کاربردی از این توابع استفاده کنند !
برای استفاده از این توابع در هر برنامه ای ، صرف نظر از زبان برنامه نویسی و حتی محیط کاریش ، باید به کامپایلر بفهمانی که می خوای از فلان تابعی که در بهمان کتابخانه (DLL) قرار گرفته استفاده کنی تا کامپایلر در زمان کامپایل بتونه اون تابع رو به برنامت Link کنه ! و سپس بعد از این کار خیلی راحت می تونی تابع مورده نظرت رو در برنامت احضار کنی .
در مورده سوال شما هم مسئله به همین گونه است که عرض کردم ، یعنی در اسمبلی ابتدا باید DLL مورده نظر رو با استفاده از دایرکتیو INCLUDELIB اعلان کنی و سپس داخل سگمنت کدت اون رو احضار کنی . باید به این دو نکته هم اشاره کنم که ارسال پارامترها به توابع با استفاده از Stack انجام می پذیره ، لذا برای احضار تابعی که مثلا دو پارامتر داره باید ابتدا آن دو رو با استفاده از دستور PUSH داخل Stack قرار بدی و سپس تابعت رو فرا بخوانی ! ( در MASM دایرکتیوی به نام invoke وجود دارد ، که احضار توابع را ساده کرده است و دیگر نیازی به این PUSH کردن ها نیست ! ) و نکته ی دوم اینکه مقدار برگشتی توابع در رجیستر EAX قرار می گیره !
برای مثال در زیر دستورات برنامه ای رو قرار می دهم که با استفاده از تابع MessageBoxA که در کتابخانه user32 قرار گرفته ، پیغامی رو نمایش می ده !
.486
.model flat,stdcall ; Flat memory model
MB_OK equ 0 ; Constant
EXTERN ExitProcess@4:NEAR ; Prototype of the external procedure
EXTERN MessageBoxA@16:NEAR ; Prototype of the external procedure
includelib ...\lib\user32.lib ; Directives for the linker to link libraries
includelib ...\lib\kernel32.lib
.data
msgtex db "Hello World ...",0
msgc db "Message !",0
.code
Start:
PUSH MB_OK
PUSH OFFSET msgc
PUSH OFFSET msgtex
PUSH 0
CALL MessageBoxA@16
PUSH 0
CALL ExitProcess@4
END Start
موفق باشی ...