ثابت ها :
ثابت ها :
براي تعريف ثابت ها در اسمبلي بطور كلي دو روش وجود دارد.
1- ثابت هاي عددي مقدار Equal نام ثابت
مثال/ max Equal z0
2/ ثابت هاي كاراكتري مقدار text Equal نام ثابت
مثال / name text Equal 'ALI'
قالب كلي برنامه ها به زبان اسمبلي : هر برنامه در زبان اسمبلي به 4 بخش تقسيم شده كه 1 بخش آنرا عموماً نمي نويسيم (پس مي شه 3 بخش).
تعريف سگمنت استك
دستورات سگمنت استك
پايان سگمنت استك
تعريف سگمنت داده
دستورات سگمنت داده
پايان سگمنت داده
تعريف سگمنت كه
دستورات سگمنت كه
پايان سگمنت كه
End.
قالب كلي تعريف يك سگمنت در اسمبلي :
' پارامترها ' segment نام سگمنت
دستورات سگمنت
Ends نام سگمنت
مثال / تعريف سگمنت استك :
Stackseg segment 'stack'
db 3z Dup ('stack')
stackseg Ends
قالب كلي يك برنامه به زبان اسمبلي :
Stackseg segment 'stack'
db 32 Dup ('stack')
stackseg Ends
dataseg segment 'data'
p1 DB 10
P2 DB 20
dataseg Ends.
codeseg segment 'code'
main proc for
Assume ss:stackseg,Ds:dataseg, Cs:codeseg
main Endp
codeseg Ends
End.
- هر برنامه به زبان اسمبلي از تعدادي زير برنامه يا كد تشكي شده است، يكي از اين زيربرنامه 2 را زير برنامه اصلي مي گويند. با استفاده از عبارت
Main porc for زيربرنامه اصلي برنامه را تعريف مي كنيم به عبارت ديگر در code segment دو عبارت main prac for و main Endp بايد حتما در اول و آخر برنامه نوشته شود.
با استفاده از فرمان : Assume هدف از تعريف هر segment را با اختصاص دادن نام سگمنت به ثبات سگمنت مشخص مي كنيم . به عنوان مثال نامي كه به ثبات ss اختصاص داده مي شود، stack segment است.
دستورات يا فرامين زبان اسمبلي :
قالب كلي هر فرمان به زبان اسمبلي به صورت زير است :
] توضيحات؛[ ] عملوند 2[ و ]عملوند1[ دستور ]برچسب[
عبارات نوشته شده در داخل براكت در تمام فرامين اسمبلي الزامي نيستند يعني ممكن است در دستوري وجود داشته باشند يا نداشته باشد.
برچسب : از برچسب براي ارجاع به يك دستور استفاده مي شود.
دستور : يكي از فرامين استاندارد اسمبلي است . در هر خط تنها مي توان يك دستور نوشت.
عملوند : مقاديري كه مي خواهيم دستور بر روي آنها اعمال شود را در عملوند ها قرار مي دهيم. عملوند ها مي توانند ثبات، متغيري از حافظه يا مقدار فصل يا نامشخص باشند.
توضيحات : اسمبلي عبارات نوشته شده بعد از سميكالن را در نظر نمي گيرد. بنابراين مي توانيد توضيح در مورد يك دستور را پس از سميكالن بنويسيم اگر نخواهيم توضيحات بنويسيم نيازي به گذاشتن سميكالن نيست.
اولين دستور اسمبلي : mov
قالب كلي اين دستور به صورت زير است :
عملوند 2 و عملوند 1 mov
اين فرمان محتواي عملوند 1 را به عملوند 2 مي ريزد. محتواي قبلي عملوند 1 از بين مي رود ولي محتواي عملوند 2 دست نخورده باقي مي ماند.
* عملوندها مي توانند ثبات، متغيري از حافظه يا مقدار به فصل باشند.
قوانين دستور mov :
1/ هر دو عملوند مي بايست هم طول باشند.
AL يك بايتي Ax دو بايتي
P1 يك بايتي P2 دو بايتي
DB يك بايتي
با توجه به داده هاي بالا درستي يا نادرستي عبارات زير را مشخص كنيد ؟
Mov AL, P1 mov Ax , P1
Mov AL, P2 mov Ax , P2
زمانيكه هر دو طول اند يعني هردو 1 بايتي اند و يا هر دو 2 بايتي اند عبارت درست و در غير اينصورت عبارت نادرست است.
2/ هر دو عملوند نمي تواند متغيرهايي از حافظه باشند.
مثال /
3/ مقدار بعد فصل يا متغيري از حافظه را نمي توانيم در ثبات سگمنت قرار دهيم.
هر دو 2 بايتي اند و Ax ثبات سگمنت است.
هر دو 2 بايتي ند ولي Dx ثبات سگمنت است.
4/ انتقال از ثبات سگمنت به ثبات سگمنت امكان پذير نيست.
- برنامه اي بنويسيد كه محتواي دو متغير از حافظه بنام هاي را جابه جا مي كند.
Stackseg segment 'stack'
Db 3z Dup('stack')
Stackseg Ends
Dataseg segment 'data'
P1 DB 10
P2 DB 20
Dataseg Ends
Codeseg segment 'code'
Main proc far
Assume ssistackseg , dsidataseg , cs:codeseg
1- با استفاده از اين دو فرمان آدرس سگمنت داده را در ثبات Ds قرار مي دهيم بدين ترتيب مي توانيم از متغيرهاي تعريف شده در سگمنت داده در سگمنت كرا استفاده كنيم.
2- اين دو فرمان برنامه را خاتمه داده و كنترل را به دست سيستم عامل مي سپارند.
|
خروجي 30 10 20 |
دستور xchg :
غالب كلي اين فرمان به صورت زير است، اين فرمان محتواي يك عملوند را جابه جا مي كند. عملوندها مي توانند ثبات يا متغيري از حافظه باشند.
عملوند 2 و عملوند 1 xchg
X تمام قوانين دستورات mov در اينجا هم وجود دارد.
مثال /
با استفاده از xchg
مثال /
با استفاده از xchg
/ مثال
: خروجي
با استفاده از xchg
/مثال خروجي
با استفاده از xchg
روش دوم :
خروجي
فرمان LNC :
اين فرمان به محتواي عملوند 1 واحد اضافه مي كند. عملوند مي تواند ثبات يا تغييري از حافظه باشد.
فرمان DEC
اين فرمان از محتواي عملوند 1 واحد كم مي كند.
كلاً غلط است
- برنامه اي بنويسيد كه محتواي و را جا به جا كند.
خروجي
فرامين استك يا پشته :
پشته نوعي از ساختمان داده است كه عمل درج و حذف آن به صورت Lifo است. ثبات sp در stack همواره به آخرين يا بالاترين عنصر استك اشاره مي كند مثل Top در پشته ي ساختمان داده و كنترل اعمال درج و حذف در پشته را انجام مي دهد هنگاميكه در سگمنت stack عبارت DB32 را تعريف مي كنيم DB 32 Dup('stack')
خانه از حافظه را اختيار كرده و به استك اختصاص مي دهيم.
|
|
sp |
|
5 |
|
sp |
|
9 |
|
3 |
|
|
sp |
|
5 |
|
sp |
|
9 |
|
3 |
|
X 8 |
|
|
9 |
|
3 |
|
sp |
پشته هاي بالا را براساس اين پشته رسم مي كنيم.
فرامين استك :
Push : اين فرمان محتواي عملوند را در استك درج مي كند.
* در فرامين استك كنترل فرمان sp توسط فرمان انجام مي شود بنابراين نيازي نيست
|
5 |
|
9 |
|
25 |
|
sp |
|
|
|
9 |
|
25 |
|
Mov AL,S/مثال push AL
|
|
sp |
فرمان POP :
غالب كلي اين فرمان به صورت زير است : اين فرمان آخرين عنصر استك را حذف كرده و در داخل عملوند مي گذارد.
مثال / برنامه اي بنويسيد كه محتواي دو متغير P1 و P2 را با استفاده از فرمان استك جابه جا كند ؟
|
|
|
|
|
10 |
|
|
|
20 |
|
10 |
|
sp |
|
sp |
/ مثال
عملوند مي تواند ثبات يا متغيري از حافظه باشد يعني مثلاً
فرمان A Puch و POP A :
عملكرد اين دو فرمان دقيقاً همانند فرامين Puch A و POP A اند و تنها تقاوتشان اينست كه اينها با ثباتهاي 32 بيتي كار مي كنند (يعني E مي گذاريم پشت ثباتها مثل EBX )
فرامين Puch F و POP F :
اين دو فرمان محتواي ثبات وضعيت پردازنده (ثبات Flag ) را در ثبات گذاشته يا از آن بر مي دارد.
* از اين دو فرمان جهت حفظ وضعيت پردازنده قبل و پس از اجراي فرامين استفاده مي شود.
* از استك براي نگه داري موقت داده ها در اسمبلي استفاده مي شود.
- محتواي و را جابه جا كنيد.
خروجي
مهندسی نرم افزار کامپیوتر