دستور RET
هر برنامه (*هر پروسه )* توسط سیستم عامل داره اجرا میشه حالا آخر برنامه کار که تموم شد یک مقدار رو به سیستم عامل برگردونه که سیستم عامل بفهمه برنامه به خوبی اجرا شده و بره سراغ کار های بعدی هر زیر برنامه هم ( مثل توابع ) باید یک مقدار رو به خود برنامه برگردونه (*مثلا یه تابع درست میکنیم که یه مقدار رو بگیره ده برابر کنه اون ده برابره مقدار بازگشتی از تابع هست )* برای برگردوندن مقدار بازگشتی از دستور RET استفاده میکنیم که در آینده راجع بهش بیشتر صحبت میکنیم .
اولین برنامه ساده :
ما اینجا میخوایم یه برنامه بنویسیم که دو عدد رو از ورودی بخونه حاصل جمعشون رو بهمون بده .
اینجا یک برنامه Edlinas خیلی ساده هست که این کار رو برامون انجام میده :
( یادداشت ها رو مجبور شدم فینگیلیش بزارم چون تو کد فارسی به هم میریزه )
کد PHP:
Mov EDX , 0 ; meghdare edx ke 32 bit hast ro sefr mikone pas DX ham ke 16 bit azash hast sefr mishe
IN EAX,[DX] ; avalin adad ro ba porte sefr az karbar mikhone
MOV EBX,EAX ; adade aval ro mirize toye ebx
IN EAX,[DX] ; dovomin adad ro ham migire
ADD EAX,EBX ; meghdari ke to ebx hast ke dar vaghe adade avalemon hast ro ba adade dovom ke dar eax hast jam
MOV EDX,1 ; yek ke porte khoroji hast ro mirize toye dx
OUT EAX,[DX] ; meghdari ke toye eax hast ke hasele jam hast ro ba porte yek ke porte khoroji hast chap mikone
RET ; be system amel mige ke barname tamom shod
برنامه رو یک بار بدون یادداشت مینویسم تا مشکلی در خوندنش نباشه :
کد PHP:
MOV EDX,0
IN EAX,[DX]
MOV EBX,EAX
IN EAX,[DX]
ADD EAX,EBX
MOV EDX,1
OUT EAX,[DX]
RET
دیدید که خیلی ساده اومد اول یه عدد گرفتم و بعد ریخت توی ebx بعد اومد یه عدد دیگه گرفت و حالا مقداری که توی ebx بود رو باهاش جمع کرد و بعد هم چاپش کرد.
پرش ها در اسمبلی
اگر با زبون دیگه ای مثل سی کار کرده باشید (* که حتما کردید ) میدونید که چیزایی تو زبونای سطح بالا وجود دارن به نام حلقه ( مثل While ) که کارشون این هست که مادامی که یک شرط درست هست یک سری دستور رو انجام میدن و وقتی شرط نادرست شد کار رو به پایان میرسونن خوب حالا فکر کنید این حلقه ها تو اسمبلی چه طور میشن ؟؟؟ ما که تو اسمبلی چیزی به نام حلقه نداریم که پس اینا چه جوری توسط کامپایلر به زبون اسمبلی ترجمه میشن ؟
توسط شرط ها و پرش ها
فلوچارت یک حلقه while اینجوری میشه :
خوب پس نیاز به پرش ها رو فهمیدیم .
برای اینکه if else ها و حلقه ها در زبان های سطح بالا به اسمبلی ترجمه بشن از پرش استفاده میکنیم با استفاده از لیبل ها که در چند پست قبل گفتیم میگه اگه فلان شرط درست بود بپر به این لیبل اگه درست نبود بپر به اون یکی لیبل .
چون سیستم کامپیوتر اینجوریه که هر دستوری که داره اجرا میشه آدرس دستور بعدیش توی eip ( instruction pointer ( ذخیره میشه و بعدش میره سراغ اون آدرس ولی با پرش آدرس اون لیبل توی eip ذخیره میشه .
ما برای پرش از دستور jmp استفاده میکنیم و کاربردش هم به صورت زیر هست*:
کد PHP:
jmp label