PDA

View Full Version : CALL



barnamenevis300
پنج شنبه 01 تیر 1391, 14:00 عصر
در سطح زبان ماشین دستور call چه operand ایی رو داره؟
یعنی منظورم اینه که مثلا
call x
در اینجا x آدرس حافظه (ماله ابتدای پروسیجر) هست؟
ممنون میشم جز جواب به همین یه اطلاعات کلی هم که مفید باشه برای من بدید.

MostafaMohammadi
پنج شنبه 01 تیر 1391, 20:02 عصر
در سطح زبان ماشین دستور call چه operand ایی رو داره؟
یعنی منظورم اینه که مثلا
call x
در اینجا x آدرس حافظه (ماله ابتدای پروسیجر) هست؟
دستور زیر:

CALL X
در واقع اینکار رو میکنه:

PUSH IP
MOV IP, OFFSET X
دستور زیر:

RET
در واقع اینکار رو میکنه:

POP IP

ممنون میشم جز جواب به همین یه اطلاعات کلی هم که مفید باشه برای من بدید.
یه PDF آموزشی پیدا کن و بخون.

barnamenevis300
پنج شنبه 01 تیر 1391, 21:00 عصر
یه حسی به من میگه شما تازه واردی و اشتباه جواب دادی! چطور میشه دستور call به این مهمی ترکیب این دو تا دستور ساده باشه؟

xman_1365_x
پنج شنبه 01 تیر 1391, 22:38 عصر
ما دو حالت فراخوانی داریم دور و نزدیک

call near label

call far label

همینطور دو نوع برگشت

retn

retf

حالا اگر بشکل زیر بنویسید

call label
&
ret

به صورت near برداشت میشود و آپکد یکسان برای آن تولید میشود،ضمنا بعد از دستور بازگشت عدد ثابت هم میتونید بنویسید که اگر قبل از فراخوانی مقدایری به پشته push کنید با در نظر گرفتن عدد شما پارامتر های قبل تابع نادیده گرفته میشود بعبارت دیگه بعد از تابع نیازی به pop نداریم،نحوه انتقال پارامتر ها همچنین ایجاد متغیر محلی به صورت استاندار با کمک پشته میباشد. به مثال زیر توجه کنید:

program1:

push ax
push bx
call far your_label

program2:

your_label proc far
push bp
mov bp,sp
sub sp,0x40 ; 64 bytes of local stack space
mov bx,[bp+8] ; first parameter to function
mov bx,[bp+6] ; second parameter to function

; some more code

mov sp,bp ; undo "sub sp,0x40" above
pop bp
retf 4 ; total size of params is 4
your_label endp



تفاوت هم در این هست که نوع نزدیک فقط آدرس دستور بعد از فراخوانی ip را به پشته انتقال میدهد و نوع دور علاوه بر ip ثبات cs هم در پشته انتقال میدهد.

در یک برنامه عادی تابع اصلی ما از نوع دور و بقیه از نوع نزدیک میباشد ، فراخوانی راه دور برای وقتی هست دو برنامه یا آبجکت داریم که تابع مشترک در آن به صورت دور نوشته میشه و در برنامه اصلیمون از نوع دور فراخوانیش میکنیم.

RET, RETF, RETN: Return from Procedure Call

RET ; C3 [8086]
RET imm16 ; C2 iw [8086]

RETF ; CB [8086]
RETF imm16 ; CA iw [8086]

RETN ; C3 [8086]
RETN imm16 ; C2 iw [8086]


CALL: Call Subroutine

CALL imm ; E8 rw/rd [8086]
CALL imm:imm16 ; o16 9A iw iw [8086]
CALL imm:imm32 ; o32 9A id iw [386]
CALL FAR mem16 ; o16 FF /3 [8086]
CALL FAR mem32 ; o32 FF /3 [386]
CALL r/m16 ; o16 FF /2 [8086]
CALL r/m32 ; o32 FF /2 [386]

http://courses.engr.illinois.edu/ece390/books/labmanual/inst-ref-general.html
http://www.nasm.us/doc/nasmdoc8.html

pswin.pooya
جمعه 02 تیر 1391, 11:54 صبح
یه حسی به من میگه شما تازه واردی و اشتباه جواب دادی! چطور میشه دستور call به این مهمی ترکیب این دو تا دستور ساده باشه؟
اگر ميدونستي چرا پرسيدي؟

بله درسته. دستور call تمامي ثباتها رو داخل پشته ميذاره ( يعني تقريبا همشون رو) و بعدش آدرس IP رو وارد پشته ميكنه و بعد به آدرس داده شده پرش ميكنه. و حالا دستور ret آدرس داخل پشته رو بر ميداره و داخل IP ميذاره و بر ميگرده

MostafaMohammadi
جمعه 02 تیر 1391, 16:15 عصر
یه حسی به من میگه شما تازه واردی و اشتباه جواب دادی! چطور میشه دستور call به این مهمی ترکیب این دو تا دستور ساده باشه؟
ببخشید، شرمنده.
من چیزی رو که قبلا از تو جزوه آموزشی خونده بودم و فکر می‌کردم درسته رو گفتم. خوشبختانه دوستان اشتباه من رو اصلاح کردن.

barnamenevis300
جمعه 02 تیر 1391, 17:27 عصر
اولا ببخشید من قصد بدی نداشتم از این حرف. فقط احتمال دادم جواب اشتباه هست (با توجه به اطلاعات ناقص خودم) که شاید یکی دیگه باشه جواب بده. بعد اینکه سوال من بیشتر این بود که در دستور call X
این ایکس که در دستور اسمبلی یه چیزی مثل متغییر هست که نوشته میشه در سطح زبان ماشین آیا یک آدرس هست که به ابتدای کد پروسیجر اشاره میکنه؟

جنس X رو میخام بدونم.

xman_1365_x
جمعه 02 تیر 1391, 18:16 عصر
اگر ميدونستي چرا پرسيدي؟

بله درسته. دستور call تمامي ثباتها رو داخل پشته ميذاره ( يعني تقريبا همشون رو) و بعدش آدرس IP رو وارد پشته ميكنه و بعد به آدرس داده شده پرش ميكنه. و حالا دستور ret آدرس داخل پشته رو بر ميداره و داخل IP ميذاره و بر ميگرده

surprise

امیدوارم دوستان وقتی کسی میخواد به رایگان کمکشون کنه احترام بیشتری براش قائل باشن ، حداقل کاری هم که میتونند انجام بدن کلیک روی دکمه تشکر هست.(اگر قوانین سایت مطالعه میشد نیازی به تکرار نمیبود)

در تکمیل گفته پویا جان ذخیره سازی ثباتها به صورت استاندارد درون بدنه تابع صورت میگیره و البته اختیاری هست برای مثال api های ویندوز معمولا بیشتر ثباتها رو ذخیره میکنه به جز eax که ازش برای بازگشت مقدار خروجی تابع استفاده میکنه ،دستور call فقط آدرس دستور بعد از خودش رو در پشته ذخیره میکنه و بعد با دستور ret مقدار پشته رو به ip انتقال میده تا کنترل برنامه به اون بخش بره البته در نوع near

در ارتباط با توابع نکات بیشتری هست مثلا توابع بازگشتی که به خواننده پست واگذار میکنم



این ایکس که در دستور اسمبلی یه چیزی مثل متغییر هست که نوشته میشه در سطح زبان ماشین آیا یک آدرس هست که به ابتدای کد پروسیجر اشاره میکنه؟

جنس X رو میخام بدونم.


call Call procedure or function
Syntax: call addr
addr: register, memory, or immediate
Action: Push IP onto stack, set IP to addr.
Flags Affected: None

همونطور که در بالا میبینید x میتونه ثبات ،ثابت عددی و یا حافظه باشه
در کل همه اینها عددی هست که ادرس مورد نظر برای پرش رو مشخص میکنه

موفق باشید

pswin.pooya
جمعه 02 تیر 1391, 19:23 عصر
در تکمیل گفته پویا جان ذخیره سازی ثباتها به صورت استاندارد درون بدنه تابع صورت میگیره و البته اختیاری هست برای مثال api های ویندوز معمولا بیشتر ثباتها رو ذخیره میکنه به جز eax که ازش برای بازگشت مقدار خروجی تابع استفاده میکنه ،دستور call فقط آدرس دستور بعد از خودش رو در پشته ذخیره میکنه و بعد با دستور ret مقدار پشته رو به ip انتقال میده تا کنترل برنامه به اون بخش بره البته در نوع near

حق با شماست. من با calling convention اشتباه گرفتم. هف چجوري همچين اشتباهي كردم!!!