PDA

View Full Version : سوال: چگونگی استفاده از توابع API در Assembly



woeful
یک شنبه 16 خرداد 1389, 21:40 عصر
سلام

اگه میشه یه کد از استفاده از توابع API در Assembly بزنید ( با توضیح )

با تشکر
Woeful

امید خطیبی
دوشنبه 17 خرداد 1389, 10:03 صبح
سلام من نمی دونم چه نوع توابع Api رو می خواهی لینک کنی اما می دونم با یک برنامه WinAsm می توانی این کار را انجام دهی و برای استفاده از تواب در برنامه باید انها را Include کنی یعتی این که زمانی که تابع فراخوانی می شود توسط این لینک به کتابخانه رجوع می کند و تابع را فراخوانی می کند و نحوه استفاده از اون هم در برنامه به صورت زیر هست به Include ها نگاه کن در کجا به کار برده شده است.


http://forum.codecall.net/attachments/assembly-tutorials/2819d1269615381-assembly-language-basics-context-windows-api-.png


و در کد برنامه که باید توابعی رو که می خواهی بنویسی که اینجوری است اول با Satart: شروع می کنی توابع را فراخوانی می کنی و در پایان End start رو می نویسی.

woeful
دوشنبه 17 خرداد 1389, 21:18 عصر
سلام من نمی دونم چه نوع توابع Api رو می خواهی لینک کنی اما می دونم با یک برنامه WinAsm می توانی این کار را انجام دهی و برای استفاده از تواب در برنامه باید انها را Include کنی یعتی این که زمانی که تابع فراخوانی می شود توسط این لینک به کتابخانه رجوع می کند و تابع را فراخوانی می کند و نحوه استفاده از اون هم در برنامه به صورت زیر هست به Include ها نگاه کن در کجا به کار برده شده است.


http://forum.codecall.net/attachments/assembly-tutorials/2819d1269615381-assembly-language-basics-context-windows-api-.png


و در کد برنامه که باید توابعی رو که می خواهی بنویسی که اینجوری است اول با Satart: شروع می کنی توابع را فراخوانی می کنی و در پایان End start رو می نویسی.


سلام آقا خیلی ممنون از اینکه جواب دادین اما...

ولی این عکسی که شما گزاشتین مال یه سایت دگس که اینجا کپی شده (این سایتو قبلا دیدم)



سلام من نمی دونم چه نوع توابع Api رو می خواهی لینک کنی

فرض کن من از kernel32.dll تابع WinExec رو میخوام فراخوانی کنم


می دونم با یک برنامه WinAsm می توانی این کار را انجام دهی

من فک میکنم WinAsm یک IDE ساده برای راحت تر کردن کاره و به توابع API مربوط نیست


و در کد برنامه که باید توابعی رو که می خواهی بنویسی که اینجوری است اول با Satart: شروع می کنی توابع را فراخوانی می کنی و در پایان End start رو می نویسی.


این به توابع API ربطی نداره :Start فقط یه Lable و End Start هم در همه کد های Assebmly هست


اگه میشه لطفا در این عکسی که گزاشتین خطوط 3،5،6،14 رو یه توضیح به من بدین


بازم ممنون (جدی میگم )

Alay102
جمعه 21 خرداد 1389, 03:19 صبح
دوست عزیز همانطور که می دونی توابع 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


موفق باشی ...