PDA

View Full Version : دو سوال



پرنده کوچک
جمعه 15 خرداد 1383, 09:01 صبح
سلام. اولش بگم من مبتدی هستم.
1.اولا سگمنت پشته را چرا تعریف میکنیم دوما دستور زیر در این سگمنت به چه معنی است:
db 32 dup("stack")
2.دستور assume چه میکند و چرا بعد از آن دوباره از mov استفاده میکنیم مثلا:
assume ds:datasg
mov ax,datasg
mov ds,ax

B-Vedadian
دوشنبه 18 خرداد 1383, 09:51 صبح
سلام،

1-کار اصلی سگمنت پشته برای پیاده سازی برنامه ها بصورت تایع و رویه (Function & Procedure) یا همان برنامه نویسی ساخت یافته است. هر بار که دستور Call یا Ret رو استفاده می کنید، وقفه ها رو به کار میبرید و یا محتویات رجیسترهای خاصی رو ذخیره می کنید که بعدا بازیابی بشه تو پشته چیز نوشتید (دستور Push). اگه خودتون تعریفش نکنید بالاخره یه جای حافظه پشته در نظر گرفته شده که اگه مثلا با سگمنت کد همپوشانی داشته باشه برنامتون قاطی میکنه (تو حالت 16 بیتی غیر Protected Mode).

عبارت <span dir=ltr>db 32 dup(0) </span>یا عبارت <span dir=ltr>db 32 dup(?( </span>باعث میشن که حداقل 32 بایت حافظه رزرو بشه که چون عبارت رو تو سگمنت Stack نوشتید تو این سگمنت 32 بایت قرار میگیره فرق دو عبارت هم اینه که اولی تو اون 32 بایت همش 0 قرار میده و دومی محتویات حافظه رو تو اون 32 تغییر نمیده.

2-assume یک راهنمای کامپایلره و تبدیل به کد نمیشه فقط واسه اینه که جاهای که بجای نوشتن آدرس مستقیم از اسم استفاده کردید کامپایلر بفهمه که آدرس واقعی اش چیه مثلا:


ds1 segment para public
x dw 0
y dw 2
ends

ds2 segment para public
x db 1
y db 0
ends

cs1 segment para public
assume cs&#58;cs1,ds&#58;ds2
mov x,byte ptr &#91;bx&#93;
ends
end

اولین استفاده assume مشخص شد. اینکه کامپایلر بدونه که سگمنت کد (برنامه) کدومه که باید اجرا شه.

دوما کامپایلر بفهمه که نام x کجای حافظه رو نشون میده.