ثابت ها :

براي تعريف ثابت ها در اسمبلي بطور كلي دو روش وجود دارد.

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

- برنامه اي بنويسيد كه محتواي 3 متغير از حافظه را به صورت زير جا به جا كند.

دستور 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

نمايش محل درج در استك (k)

 

 

X            8

نمايش محل حذف از استك (x)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

9

3

sp

 

 

 


پشته هاي بالا را براساس اين پشته رسم مي كنيم.

 

فرامين استك :

Push : اين فرمان محتواي عملوند را در استك درج مي كند.

* در فرامين استك كنترل فرمان sp توسط فرمان انجام مي شود بنابراين نيازي نيست

5

9

25

sp

برنامه نويس مقدار 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 ) را در ثبات گذاشته يا از آن بر مي دارد.

* از اين دو فرمان جهت حفظ وضعيت پردازنده قبل و پس از اجراي فرامين استفاده مي شود.

* از استك براي نگه داري موقت داده ها در اسمبلي استفاده مي شود.

- محتواي  و  را جابه جا كنيد.

  خروجي