تماس درباره   صفحه اصلی
  زبان اسمبلي > پشته  
 
 

پشته


پشته يک ليست LIFO است که می تواند به عنوان محلی مناسب برای ذخيره داده های موقتی استفاده شود. پشته برای فراخوانی زيربرنامه ها، ارسال پارامترها و متغيرهای محلی هم به کار می رود. دستورات ابتدائی پشته push و pop هستند.

تعريف پشته در برنامه
دستورات push و pop
ثبات SP


پشته (stack) ناحيه ای از حافظه اصلی است که به صورت LIFO (last-in-first-oout) سازماندهی شده است. يعنی آخرين داده ای که وارد آن می شود اولين داده ای است که از آن خارج می شود.


تعريف پشته در برنامه

در برنامه های exe ناگزير به تعريف پشته توسط راهنمای .stack هستيد. اندازه پشته توسط راهنمای .stack تعيين می شود. اگر اندازه تعيين نشود 1KB درنظر گرفته می شود.

.stack [size]


مثال. پشته ای با اندازه 1024 بايت ايجاد می شود.

.stack

مثال. پشته ای با اندازه 256 بايت ايجاد می شود.

.stack 100h


نکته. اگر برنامه نويس راهنمای .stack را استفاده نمايد قصد توليد برنامه exe دارد. برای توليد برنامه های com از راهنمای .stack استفاده نمی شود و هرچه از سگمنت کد باقی بماند به عنوان پشته درنظر گرفته می شود.


دستورات push و pop

دستورات push و pop دستورات پايه برای استفاده از پشته هستند. برنامه نويس اسمبلی از طريق دستورات زير می تواند داده های خود را در پشته قراردهد و يا از پشته بردارد. فرم کلی دستورات به صورت زير است:

push mem/reg
pop   mem/reg

push عملوند خود را به پشته اضافه می کند و دستور pop مقداری را از پشته حذف می کند و در عملوند خود قرار می دهد. داده ای که برداشته می شود هميشه آخرين داده ای است که اضافه شده است.

عملوند دستورات push و pop نمی توانند فوری يا ثبات های CS و IP و flag باشند.


مثال 1. دستورات زير يک کلمه را در پشته قرار می دهد.

mov AX, 12
push AX

مثال 2. دستورات زير محتوای دو متغير Value و Count را با هم تعويض می نمايد.

push Value
push Count
pop Value
pop Count

مثال 3. به کمک دستورات پشته می توان محتوای يک ثبات سگمنت را در ديگری کپی کرد.

push DS
pop CS

مثال 4. مقدار نهائی AX برابر با 1234h است. ابتدا در AX عدد 1234h ذخيره می شود سپس وقفه فراخوانی می شود. مقدار AX از پشته بازيابی می شود.

mov AX,1234H
push AX
mov AH,09
int 21H
pop AX


ثبات SP

ثبات های SS و SP به پشته به صورت SS:SP به پشته اشاره می کنند. در هنگام اجرای يک برنامه EXE ثبات SS توسط سيستم عامل برابر آدرس سگمنتی که پشته را در بردارد و ثبات SP برابر آفست بالای پشته می شود. يعنی آدرس جائی از پشته که داده بايد برداشته شود.

پشته به صورت معکوس در حافظه رشد می کند(يعنی به سمت آدرس های کمتر). وقتی يک کلمه در پشته اضافه می شود در آدرس SS:SP ذخيره می شود و از SP دو واحد کم می شود. دستور push مقدار SP را کاهش و دستور pop مقدار SP را افزايش می دهد.

Stack

هنگامی که يک کلمه در پشته push شود عمليات زير توسط CPU انجام می شود:

1. دو واحد از ثبات SP کم می شود.
2. کلمه مورد نظر در آدرس SS:SP کپی می شود.

هنگامی که يک کلمه از پشته pop شود عمليات زير توسط CPU انجام می شود:

1. از آدرسSS:SP يک کلمه خوانده می شود.
2. دو واحد به ثبات SP اضافه می شود.


مثال. فرض کنيد مقدار اوليه SP برابر با 1000h است.

push word 1 ;1 stored at 0FFEh, SP = 0FFEh
push word 2 ;2 stored at 0FFCh, SP = 0FFCh
push word 3 ;3 stored at 0FFAh, SP = 0FFAh
pop AX ;AX = 3, SP = 0FFCh
pop BX ;BX = 2, SP = 0FFEh
pop CX ;CX = 1, SP = 1000h


هنگام فراخوانی زير برنامه توسط دستور call مقدار ثبات های CS و IP که به دستورالعمل بعدی اشاره می کنند در پشته ذخيره می شود. هنگامی که CPU در زير برنامه به دستور ret می رسد مقادير را از پشته حذف و به ثبات های CS و IP برمی گرداند.


مثال. شکل زير وضعيت پشته را قبل و بعد از انجام دستور Call 3C10:0720 نشان می دهد.

Call and Return

 


 


صفحه اصلی| PDF| درباره| تماس