نمایش نتایج 1 تا 2 از 2

نام تاپیک: دو سوال

  1. #1

    دو سوال

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

  2. #2
    سلام،

    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 کجای حافظه رو نشون میده.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •