خلاصه آموزشی از درس اسمبلی

جلسه اول

 

مبانی کامپیوتر

1.      مبنای 10 Decimal : (0 تا 10)

2.      مبنای 2 Binary : (0 و 1)

3.      مبنای 8  Octal : (0 تا 7)

4.      مبنای 16  Hexa Decimal : (0 to 9 , A,B,C,D,E)

1.      برای تبدیل مبنای 10 به کلیه مبناها از تصمیمات متوالی بر پایه مبنای مقصد استفاده می کنیم..

1.      در عملیات زیر باقیمانده های عدد را بر مبنای 2 بدست می آوریم.

a.      341%2=1

b.      170%2=0  عدد 170 نتیجه تقسیم 341 بر 2 است.

c.       85%2=1  عدد 85 نتیجه تقسیم 170 بر 2 است.

d.      42%2=0  ....

e.       21%2= 1  ....

f.        10%2= 0  ...

g.      5%2=1 ....

h.      2%2=0 ....

1 (عدد یک خارج قسمت آخرین تقسیم مورد نظر است.یعنی نتیجه تقسیم 2 بر 2)

حالا از پایین به بالا شروع به نوشتن جواب ها می کنیم.

(341)10 = (1,0101,0101)2

2.      در عملیات زیر نشان می دهیم چگونه مبنای 8 عدد 341 را بدست می آوریم.

a.341 % 8 = 5 

b.      42 % 8 = 2 عدد 42 از تقسیم 341 بر 8 بدست اومده

c. 5  (عدد پنج خارج قسمت تقسیم 42 بر 8 است.)

حالا از پایین به بالا اعداد را می نویسیم.

(341)10 = (525)8

3.     در عملیات زیر نشان می دهیم چگونه مبانی 16 عدد 341 را بدست می آوریم.

a.341%16 = 5

b.      21%16 = 5 عدد 21 خارج قسمت تقسیم 341 بر 16 هست.

c. 1 ( خارج قسمت تقسیم 21 بر 16 ، 1 می شود. )

حالا از پایین به بالا اعداد را می نویسیم. عددی که بدست می آید بر مبنای 2 خواهد بود.

(341)10 = (155)16

 

2.      تبدیل کلیه مبانا ها به مبنای 10

(an … a2 a1 a0 )r = ( T )10

T = an * rn + an-1 * rn-1 + … + a2 * r2 + a1 * r1 + a0 * r0

 

Ex : ( 11010100 )2 = ( 212 )10

(1 * 27 ) + ( 1 * 26 ) + ( 0 * 25 ) + ( 1 * 24 ) +(  0 * 23 ) + ( 1 * 22 ) + ( 0 * 21 ) + ( 0 * 20 ) = 128 + 64 + 16 +4 = 212  

 

Ex : ( 324 )8 = (212)10

3 * 82 + 2 * 81 + 4 * 80 = 192 + 16 + 4 = 212

 

Ex : ( D4 )16 = (212)10

D * 161 + 4 * 160 = ( 13 * 16 ) + 4 = 208 + 4 = 212

3.      تبدیل مبنای 2 به 8 و بالعکس

مبنای 2

مبنای 8

111

7

110

6

101

5

100

4

011

3

010

2

001

1

000

0

 

Ex : ( 730546 )8 = ( 111, 011 , 000 , 101 , 100 , 110 )2

Ex : ( 001 , 011 , 001 , 001 , 001 , 111 , 001 , 000 , 001 )2 = ( 131117101 )8

 

 

 

 

 

4.      تبدیل مبنای 2 به 16 و بالعکس

مبنای 2

مبنای 16

1111

15 – F

1110

14 – E

1101

13 – D

1100

12 – C

1011

11 – B

1010

10 – A

1001

9

0000

0

 

Ex : ( 7E5FA9 )16 = ( 0111 , 1110 , 0101, 1111 , 1010 , 1001 )2

Ex : ( 0110 , 0100 , 0011 , 1010 , 1000 , 1110, 1101 )2 = ( 643A8ED )16

 

شکل تبدیل مبنا ها به یکدیگر

 

5.      تبدیل اعداد اعشاری مبنای 10 به مبنای 2

برای تبدیل اعداد اعشاری مبنای 10 به مبنای 2 قسمت صحیح مثل تبدیل مبنای 10 به 2 هست. اما برای قسمت اعشاری باید مقدار اعشاری را در 2 ضرب کنیم. سپس قسمت صحیح جواب را می نویسیم ( 0 یا 1 ) . دوباره قسمت اعشاری ( جدید ) را در 2 ضرب می کنیم . در جواب بدست اومده قسمت صحیح ( 0 یا 1 ) را جدا می کنیم و برای جواب می نویسیم. این کار تا وقتی که قسمت اعشاری ، صفر  شود ، ادامه می دهیم. ( البته اینجا خیلی مهم نیست و تا بعد از بدست آوردن 4 یا 5 رقم اعشار ضرب کردن را ادامه نمی دهیم. )

·        در مثال زیر قسمت های صحیح را از بالا به پایین می نویسیم.

·        اگر عددی در مراحل ضرب تکرار شود آن عدد را گرد می کنیم.

( 35.247 )10 = ( 10,0011 . 0011 )2

0.247 * 2 = 0.494 , اینجا جواب می شود : صفر، قسمت اعشاری که 494 هست را در 2 ضرب می کنیم.

0.494 * 2 = 0.988 , جواب صفر می شود ، قسمت اعشاری که 988 است را در 2 ضرب می کنیم.

0.988 * 2 = 1.976 , جواب یک می شود، قسمت اعشاری را جدا می کنیم و در 2 ضرب می کنیم.

0.976 * 2 = 1.952 ,جواب یک می شود، قسمت اعشاری را جدا می کنیم و در 2 ضرب می کنیم.

 

6.      اعداد اعشاری مبنای 2 به مبنای 10

برای تبدیل اعداد اعشاری مبنای 2 به مبنای 10 قسمت صحیح مثل تبدیل مبنای 2 به 10 هست. اما برای قسمت اعشاری باید مقدار اعشاری را از سمت چپ به راست با توان منفی شماره گذاری کنیم. ( در قسمت صحیح از سمت راست به چپ با توان مثبت بود ).

( 1011011 . 01001 )2 = ( 91 . 28 )10

قسمت اعشاری : ( 0 * 2-1 ) + ( 1 * 2-2 ) + ( 0 * 2-3 ) + ( 0 * 2-4 ) + ( 1 * 2-5 ) = 0.28

قسمت صحیح : (1 * 26 ) + (0 * 25 ) + (1 * 24 ) + (1 * 23 ) + (0 * 22 ) + (1 * 21 ) + (1 * 20 ) = 91

 

تعداد بیت ها

هر بیت دارای 2 حالت ( 0 یا 1 ) هست. پس تعداد حالات در n بیت می شود : 2n.

مثال : 28  : 256 ( 0 تا 255 )

نکته : هر 8 بیت 1 بایت است.

 

مثال : عدد 50735 نیازمند چند بایت حافظه برای ذخیره سازی است؟

50735 / 256 = 198 ( باقیمانده می شود 47 )

عدد 50735 نیازمند 198 + 1 ( 1بایت برای این هست چون که 47 بیت باقیمانده وجود دارد) بایت برای ذخیره سازی بر روی حافظه هست.

 

حافظه

1.     اصلی

a.      ROM - Random Only Memory - حافظه فقط خواندی

                                      i.            Post : تست سخت افزار

                                    ii.            Bios : اطلاعات ورودی و خروجی

                                 iii.            Loader : بارگذارنده سیستم عامل

b.      RAM - Random Access Memory - حافظه با دسترسی تصادفی

                                      i.            هر برنامه ای جهت اجرا به درون این حافظه منتقل می شود.

                                    ii.            با قطع جریان برق پاک می شود.

c.       Register - ثبات : درونCPU  قرار دارد.

2.     جانبی

ماندگاری اطلاعات دارد.

 

نکته: هر زبانی که به زبان انسان نزدیکتر باشد زبان سطح بالاتر و هر چه به زبان ماشین نزدیکتر باشد سطح پایین تر نام دارد.

ثبات  : حافظه های 2 بایتی درون CPU

1.     ثبات سگمنت

1.      ثبات سگمنت پشته SS : حاوی آدرس شروع سگمنت پشته

2.      ثبات سگمنت دادهDS : حاوی آدرس شروع سگمنت داده

3.      ثبات سگمنت کد CS : حاوی آدرس شروع سگمنت کد

4.      ثبات سگمنت اضافی ES : حاوی آدرس شروع سگمنت اضافی

 

2.     ثبات عمومی

شماره

ثبات عمومی

>>> 

 

 

توضیحات

1

Ax

>>> 

Ah

Al

Ax به دوقسمت ah (قسمت با ارزش)و al (قسمت کم ارزش) تقسیم می شود.

2

Bx

>>> 

Bh

Bl

Bx به دوقسمت bh (قسمت با ارزش) و bl (قسمت کم ارز.ش) تقسیم می شود.

3

Cx

>>> 

Ch

Cl

Cx به دو قسمت ch (قسمت با ارزش) و cl (قسمت کم ارزش) تقسیم می شود.

4

Dx

>>> 

Dh

Dl

Dx به دو قسمت dh (قسمت با ارزش) و dl (قسمت کم ارزش) تقسیم می شود.

 

نکته : به جای x در ثبات های عمومی h به معنی high و l به معنی low است. فرق h  و l در ارزش مقداری آنهاست. ارزش h (256 * ah)  و ارزش L (1 * al) است. همچنین  L  و h  هر کدام 1بایت حافظه را اشغال می کنند.

مثال  در مورد ثبات عمومی  : ارزش ثبات ax  چقدر است؟

 

Al

Ah

7

3

 

3 * 256 + 7 = 775

 

3.      کنترل - IP : این ثبات همواره حاوی offset دستور اجرایی بعدی در سگمنت کد است.

4.      وضعیت - Flags

 

1.      Carry - C : به معنی رقم نقلی است و این بیت حاوی رقم نقلی از آخرین بیت در انجام محاسبات و یا شیفت است.

2.      Parity-P : به معنی توازن است و این بیت برای کنترل صحت اطلاعات به کار می رود.

3.      Auxiliary - A : به معنی رقم نقلی کمکی است. چنانچه در محاسبات 8 بیتی رقم نقلی در بیت شماره 3 ایجاد شود این بیت برابر 1 خواهد شد .

4.      Zero -  Z : به معنی صفر است و چنانچه نتیجه اعمال محاسباتی یا مقایسه برابر صفر باشد این بیت برابر 1 خواهد بود.

5.      Sign - S : به معنی علامت است . اگر نتیجه عملیات منفی باشد این بیت برابر 1 خواهد شد و در صورتی که مثبت شود این بیت برابر صفر خواهد شد.

6.      Trap - T : به معنی قدم به قدم است . چنانچه این بیت برابر با یک باشد اجرای برنامه به صورت دستور به دستور انجام می شود.

7.      Interrupt - I : به معنی وقته است . اگر این بیت 1 باشد سیستم به وقفه ها پاسخ می دهد.

8.      Direction-D : به معنی جهت است. و این بیت برای کنترل اعمال رشته ای مانند مقایسه یا انتقال رشته ای که بیش از یک کلمه اند به کار می رود . اگر این بیت برابر با یک باشد عمل مقایسه یا شیفت از سمت راست به چپ و گرنه عمل مقایسه یا شیفت از چپ به راست انجام می شود.

9.      Overflow - O : به معنی سرریز است . چنانچه در انجام محاسبات آخرین بیت به دلیل سرریز شدن از بین برود این بیت برابر با 1 خواهد شد.

 

Segment : به ناحیه های 64KB از حافظه های RAM که برای اهداف خاص مورد استفاده قرار می گیرد -  ناحیه ای از حافظه است که آدرس شروع آن بر 16 قابل قسمت است.

1.      پشته(stack) : این سگمنت حاوی آدرس برگشت از توابع و زیر برنامه ها است و به طور کلی هر نوع اطلاعاتی که برای فراخوانی زیر برنامه ها لازم است در این سگمنت قرار می گیرد.

2.      داده(Data) :  برای تعریف داده ها و متغیر ها و ناحیه های کار برنامه از این ناحیه استفاده می شود.

3.      کد(Code) : دستورالعمل های زبان ماشین که باید اجرا شوند در این سگمنت قرار می گیرد.

4.      اضافی(extra) : برای انجام عملیات خاص همچون کار بر روی رشته ها و  ... .

 

نکته :  افست  :آدرس مکان مورد نظر از ابتدای ناحیه سگمنت را آفست می گویند.

 نکته : سگمنت در RAM و ثبات در CPU قرار می گیرد.

 نکته : ثبات های IP و CS برای تعیین آدرس دستور بعدی به کار می روند.

سگمنت :

1.     پشته

2.     داده

3.     کد

4.     اضافه

ثبات:

1.      عمومی

a.      Ax  

b.      BX

c.       CX

d.      DX

2.      سگمنت

a.      SS  : حاوی آدرس شروع سگمنت پشته است.

b.      DS : /////////////////////////////////////// دیتا ///////////.

c.       CS : ///////////////////////////////////////////کد ////////////.

d.      ES : //////////////////////////////////////////// اضافه ///////.

3.      ایندکس

a.      BP : این ثبات حاوی offset ای از سگمنت S است.

b.      SP : این ثبات حاوی offset بالای پشته است.

c.       SI : این ثبات برای عملیات رشته ای مورد استفاده قرار می گیرد.

d.      DI : این ثبات آدرس رشته مقدار را در عملیات رشته ای نگهداری می کند.

 

مقدمات زبان برنامه نویسی اسمبلی

قالب اصلی برنامه اسمبلی

a.      تعریف سگمنت پشته

b.      تعریف سگمنت داده

c.       تعریف سگمنت کد

 

شیوه های تعریف سگمنت

a.      روش اول

 

تعریف سگمنت پشته

....

تعریف سگمنت داده

.....

تعریف سگمنت کد

End نام زیر برنامه

 

نام سگمنت

Segment

*پارامترها

.....

....

....

محتویات سگمنت

 

 

....

 

 

نام سگمنت

Ends

 

 

*پارامتر ها

1.      پارامتر تنظیم( align )  : مرزی که سگمنت باید از آنجا شروع شود و مشخص می کند.

a.      Byte    یعنی بر یک بخش پذیر هستند. آدرس سگمنت می تواند از هر بایتی شروع شود.

b.      Word    یعنی بر دو بخش پذیر هستند. آدرس سگمنت می تواند از هر آدرسی که زوج باشد شروع شود.

c.       PARAیعنی بر 16 بخش پذیر هستند. آدرس سگمنت می تواند از هر جایی که بر 16 قابل قسمت باشد شروع شود.

d.      PAGE یعنی بر 256 بخش پذیر هستند.آدرس سگمنت می تواند از هر جایی که بر 256 قابل قسمت باشد شروع شود.

نکته : اگر در تعریف سگمنتی پارامتر تنظیم مشخص نشود سیستم به پیش فرض مقدار PARA را در نظر می گیرد.

 

2.      پارامتر ترکیب( combine ) : اگر بخواهیم پس از پیوند برنامه ها سگمنت ها با هم ترکیب شوند می توانیم از این پارامتر استفاده کنیم.

a.      NONE یعنی کسی حق استفاده ندارد. سگمنت ها به صورت منطقی از همدیگر جدا هستند.

b.      Public یعنی همه حق استفاده دارند. سگمنت های مشابه به طور متوالی در حافظه قرار می گیرند.

c.       Common : سگمنت های مشابه از یک ناحیه به طور اشتراکی استفاده می کنند.

d.      Stack یعنی فقط پشته حق استفاده دارد. پشته به صورت عمومی در نظر گرفته می شود.

3.      پارامتر کلاس : برای تعریف کلاس سگمنت از این پارامتر استفاده می شود.

a.      'Stack' : برای تعریف کلاس سگمنت پشته استفاده می شود.

b.      'data' : برای تعریف کلاس سگمنت دیتا استفاده می شود.

c.       'code' : برای تعریف کلاس سگمنت کد استفاده می شود.

d.      'Extra.' : برای تعریف کلاس سگمنت اضافی استفاده میشود.

 

پارامتر به شکل زیر تعریف میشود

 

 

مثال :

StackS

 SEGMENT

Byte

NONE

'STACK'

DataS

 SEGMENT

Word

Public

'Data'

 

مثال:

برنامه ای بنویسید که به متغیرهای p و  S مقادیر 10 و 15 را انتساب داده و با استفاده از دستورات برنامه نویسی مقادیر دو متغیر را عوض کند.

 

Stack segment para public 'stack'

Db 128 dup(' ')

Stack end s

 

Data segment public 'data'

P db 10

S db 15

Data end s

 

CD Segment public 'code'

Mp proc far

Assume DS: data , cs : cd, ss : stk

Mov ax, data     ;انتقال آدرس سگمنت داده به ثبات سگمنت داده

Mov ds, ax

 

Mov ah, p

Mov cl, s

Mov  s, ah

Mov p, cl

Mov ah, 4ch

Int 21h

 

Mp endp

Cd ends

End mp

تعریف روال زیر برنامه - procedure

نام زیر برنامه   proc     far ( یا near)

.........

.........

 نام زیر برنامه  endp

 

Assume  SS:نام سگمنت پشته , DS:نام سگمنت داده , CS:نام سنگمنت کد, ES:نام سگمنت اضافی

برای مرتبط نمودن سگمنت های تعریفی با ثباتهای متناظر آنها استفاده می شود.

مثال: برنامه ای بنویسید که دو عدد یک رفمی را از ورودی بگیرد و حاصل جمع آنها را در متغیر حافظه قررا دهد.

Stk segment public 'stack'

Db 128 dup('  ')

Stack ends

 

Data segment public 'data'

M db ?

Data ends

 

Code segment public 'code'

Mp proc far

Assume ds: data, cs: cd, ss: stk

Mov ax, data

Mov ds, ax

Mov ah, 01h

Int 21h

 

Mov dh, al

Mov ah, 01h

Int 21h

 

Mov cl, al

Sub dl, 48

Sun cl, 48

Add dh, cl

Mov m , cl

Mov ah, 4ch

Int 21h

Mp ends

Cd ends

End mp

d

a.      روش دوم(توی کلاس از این روش استفاده می کنیم)

تعریف سگمنت به روش استفاده از مدل های حافظه

.model نوع مدل (small)

.stack میزان حافظه مورد نیاز( بر حسب بایت)

.data

….

تعریف متغیر ها

….

.code

نام برنامه اصلی

Proc

Far

 

کدهای برنامه

نام زیر برنامه اصلی

Endp

…..

End نامر زیر برنامه اصلی

نکته : تعریف سگمنت پشته و داده می تواند جابجا انجام شود، اما تعریف سگمنت کد حتما باید بعد از این دو سگمنت باشد.

تعریف زیر برنامه

 

تعریف زیر برنامه

 proc

پارامتر

 

....

ما بقی کدها

...

 

 

 

نام زیر برنامه

endp

 

 

 

پارامتر

Far

این زیر برنامه می تواند توسط زیربرنامه ای موجود در سگمنت هایی دیگر فراخوانی شوند.

Near

این زیر برنامه توسط زیربرنامه ای که در همین سگمنت قرار دارد فراخوانی شود.

نکته : زیر برنامه اصلی برنامه از نوع far می باشد. این زیر برنامه توسط سیستم عامل فراخوانی می شود.

 

 

 

 

انواع متغیر ها در اسمبلی

1.      DB(برای متغیر های یک بایتی)

2.      DW(برای متغیر های 2 بایت)

3.      DD(برای متغیر های چهار بایتی)

 

تعریف متغیر ها در اسمبل

نام 

نوع

مقدار اولیه

A

Db

15

A

Db

?

A

Dw

?

تعریف رشته ها

نکته : علامت '$' نشان گر پایان یافتن رشته مورد نظر است.

نکته : رشته ها را فقط با db تعریف می کنیم.

Dup = duplicate = تکثیر کردن

نام

نوع

ادامه

 

S

Db

'reshte' +'$'

برای تعیریف رشته فقط باید از db

استفاده کنیم.

S

Db

'*************' +'$'

یک رشته که چندتا '*'چاپ می کند

S

Db

20 dup ('*') + '$'

عمگر dup برای چاپ یک تعداد خاص

از یک کاراکتر خاص استفاده می شود.

P

Equ

3.14

برای تعریف مقدار های ثابت

سوال :  هر کاراکتر به یک بایت حافظه نیاز دارد. پس چطور ممکنه که رشته ای مثل چند ستاره ذخیره شود؟

جواب : در واقع فقط کاراکتر اول ذخیره می شود .

جلسه چهارم

تعریف دستورات :

 

Mov

عملوند 1

عملوند 2

عملوند 2 را درون عملوند 1 می ریزد

 

شرایط عملنوندها برای عملگر های 2 عملوندی

متغیر حافظه

متغیر حافظه

ثبات

ثبات

ثبات

عملوند 1

مقدار ثابت

ثبات

مقدار ثابت

متغیر حافظه

ثبات

عملوند 2

 

مثال:

p db 5

S   db 112

---------------

Mov

Al, ch

ص

Mov

Bl, p

ص

Mov

s, dl

ص

Mov

p,s

غ - دو متغیر حافظه

Mov

Cx,s

غ- متغیر یک بایتی را نمیتوان درون متغیر دو بایتی ریخت.

Mov

7,p

غ - نمی توان متغیر را درون مقدار ثابت ریخت

Mov

15, al

غ

 

نکته : 

مثال : برنامه ای بنویسید که مقدار 5 را به p و مقدار 112  را به متغیر s انتصاب دهد و به وسیله ی برنامه نویس مقادیر S و P را تعویض کنید.

.model small

.stack 128

.data

s db 112

P db 5

.code

MP proc  far

Mov ax, @data   -  این خط و خط زیرین برای قرار دادن ادرس سگمنت داده در ثبات سگمنت بکار می رود

Mov ds, ax

Mov bl,s

Mov dh, p

Mov s, dh

Mov p, bl

 

Mov ah,4ch

Int 21h - برای خاتمه برنامه و انتقال کنترل به سیستم عامل

MP endp

End MP

 

Mov ah, 10 - عدد 10 بر مبنای دهدهی

Mov ah, 10b - عدد 10 بر مبنای 2

Mov ah,10o  - عدد 10 بر مبنای اکتال است.

Mov ah, 10h  - عدد 10  بر مبنای شانزده دهی

Mov ah,ceh -   این اشتباه است زیرا کامپایلر سی.ای.اچ را متغیر در نظر می گیرد . برای این که این متغیر را به  شانزده دهی تبدیل کنیم باید   قبل از سی.ای.اچ یک صفر بگزاریم.

Mov ah, 0ceh

 

تعدادی از دستورات مهم

Inc

عملوند 1

·          

         مقدار یک را به عملوند اضافه می کند

Dec

عملوند 1

·          

مقدار یک را از عملوند کم می کند

add

عملوند 1

عملوند2

عملوند 2 را به عملوند 1 اضافه می کند و نتیجه را درون عملوند 1 می ریزد

Sub

عملوند 1

عملوند2

عملوند 1 را از عملوند 2 کم می کند و نتیجه را درون عملوند 1 می ریزد(عملوند2- عملوند1)

Neg

عملوند

 

مقدار عملوند را در منفی 1 ضرب می کند و نتیجه را در عملوند می ریزد.

Not

عملوند

 

تمامی یک های مبنی 2 عملوند را به صفر و تمامی صفر ها را به یک تبدیل می کند.

 

نکته : هر جا عملوند را استفاده می کنیم ، این عملوند می تواند متغیر حافظه یا ثبات باشد .

 

کاراکتر

کد

0

48

1

49

2

50

3

51

4

52

5

53

6

54

7

55

8

56

9

57

Enter

13

 

نکته : به هنگام اجرای برنامه وقتی که کاربر یک عدد را وارد می کند، کامپیوتر کد اسکی کد را می گیرد نه خود عدد را. پس ما مجبوریم معادل عدد مورد نظر را بدست بیاوریم. برای این کار کد کاراکتر را منهای 48 می کنیم. و بعد از اجرای عملیات بر عدد مورد نظر ، برای چاپ عدد مورد نظر باید آن عدد را با عدد 48 جمع کنیم.

48 - کدکاراکتر رقم <<< معادل عددی رقم

48 + معدل عددی رقم  <<< کد کاراکتر رقم

مثال :برنامه بنویسید که دو مقدار دلخواه را به ثبات های al  و cl نسبت دهد. و بدون استفاده از هر گونه متغیر حافظه و یا ثبات دیگر مقدار این دو ثبات رو جابجا کند.(برای ظرف کمکی استفاده نکنیم)

الگوریتم:

1.      a<<<5

2.      b<<<12

3.      a<<< a + b

4.      b<<< a - b

5.      a <<< a - b

.model small

.stack 128

;data - توی اسمبلی سمی کالن نشانه کامنت است.

.code

MP proc  far

 

Mov al, 5

Mov cl,12

Add al,cl

Mov ah,al

 

Sub al,cl

Mov cl,al

Mov al,ah

Sub al,cl

 

Mov ah,4ch

Int 21h

 

MP endp

 

End MP

جلسه پنجم

وقفه ها Interrupt

روند اجرای یک وقفه

 

 

 

وقفه

تابع:

هدف:                                                                                                                                    

ورودی :                                                                                          

خروجی:         

21h

4ch

خاتمه برنامه و انتقال کنترل به سیستم عامل

4ch : ah

ندارد

21h

01h

دریافت کاراکتر به همراه چاپ کاراکتر

01h : ah

Al : کد کاراکتر خوانده شده

21h

02h

چاپ کاراکتر

02h : ah - dl : کد کاراکتر مورد نظر

ندارد

21h

08h

دریافت کاراکتر بدون چاپ کاراکتر دریافتی

Ah : 08h

 

 

 

1.      برنامه ای بنویسید یک کاراکتر را بگیرد و 3 بار آن را چاپ کند.

 

 

 

 

 

 

 

 

.model small

.stack 64

.data

.code

fashooMP proce far

Mov ah, 01h

Int 21h

 

Mov ah, 02h

Mov dl, ah

Int 21h

Int 21h

Int 21h

 

Mov ah, 4ch

Int 21h

fashooMP endp

End fashooMP

2.      برنامه ای بنویسید که یک کاراکتر را از ورودی بگیرد و کاراکتر قبلی ، کاراکتر بعدی و کاراکتر قبلی آن را چاپ کند.

 

.model small

.stack 64

.data

.code

fashooMP proc far

Mov ah, 08h

Int 21h

 

Mov dl, al

Dec dl

 

Mov ah, 02h

Int 21h

Inc dl

Int 21h

Inc dl

Int 21h

 

Mov ah,4ch

Int 21h

 

fashooMP endP

End fashooMP

جلسه ششم

نکته : سطر های مانیتور 0 تا 24 است. و تعداد ستون ها 0 تا 79 هست.  (شماره ستون ، شماره سطر)

چند وقفه :

وقفه

تابع:

هدف:                                                                                                                                     

ورودی :                                                                                         

خروجی:                                                 

10h

02h

انتقال مکان نما

Ah : 02h

Bh : شماره صفحه(صفر)

Dh : شماره سطر

Dl : شماره ستون

ندارد

21h

09h

چاپ رشته

Ah : 09h

DX : آدرس متغیرهای رشته

 

ندارد

21h

0Ah

دریافت رشته

Ah  :  0Ah

DX : آدرس لیست پارامتر

 

10h

06h

پاک کردن صفحه نمایش

Ah :  06h

Al : تعداد خطوط

Ch : شماره سطر گوشه بالا سمت چپ

Cl : شماره ستون گوشه بالا سمت چپ

Dh : شماره سطر گوشه پایین سمت راست

Dl : شماره ستون گوشه پایین سمت راست

Bh : صفت محدوده

ندارد

 

 

بدست آوردن آدرس متغیر

2 راه دارد :

Mov

ثبات 2 بایتی

Offset متغیر

LEA

ثبات 2بایتی

متغیر

 

 

تعریف لیست پارامتر در سگمنت داده

نام لیست پارامتر

Label

Byte

نام متغیر حاوی حداکثر طول

Db

حداکثر طول

نام متغیر حاوی طول واقعی

Db

?

نام متغیر حاوی رشته

Db

حداکثر طول  dup(' ') + '$' یا   حداکثر طول dup(?) + '$'

 

سوال 1 : برنامه ای بنویسید که پیام in the name of GOD در مختصات (2, 30) چاپ نماید. سپس از مختصات (5,20) رشته ای حد اکثر به طول 17کاراکتر دریافت نموده و در مختصات (10, 50) پیام "your text is: " چاپ نماید و بعد از آن رشته دریافتی را چاپ کند. و برای پایان منتظر دریافت کلیدی شود .

الگوریتم حل مسئله :

1.      انتقال مکان نما به (30و 2)

2.      چاپ رشته in the ...

3.      انتقال مکان نما به (20و 5)

4.      دریافت رشته حداکثر 17کاراکتری

5.      انتقال مکان نما(50و 10)

6.      چاپ رشته your ...

7.      چاپ رشته دریافتی

8.      دریافت کاراکتر

نکته :

.model small

.stack 128

.data

Msg1 db 'in The name of GOD' + '$'

; tartibe list parameter

List1   label   byte

Max db 17

Len db ?

Reshte db 17 dup(' ') + '$'

Msg2 db 'your text is:$'

.code

Main proc far

Mov ax, @data

Mov ds, ax

 

Mov ah, 02h

Mov bh, 0

Mov dh, 2

Mov dl, 30

Int 10h

 

Mov ah, 09h

Lea DX, msg1

Int 21h

 

Mov ah, 02h

Mov bh, 0

Mov dh, 5

Mov dl, 20

Int 10h

 

Mov ah, 0ah

Lea dx, list1

Int 21h

 

Mov ah, 02h

Mov bh, 0

Mov dh, 10

Mov dl, 50

Int 10h

 

Mov ah, 09h

Mov dx, offset msg2

Int 21h

 

Mov ah, 09h

Lea dx, reshte

Int 21h

 

Mov ah, 08h

Int 21h

 

Mov ah,4ch

Int 21h

 

Main endp

End main

 

 

 

 

 

جلسه هفتم

وقفه

تابع:

هدف:                                                                                                                                    

ورودی :                                                                                          

خروجی 

10h

06h

پاک کردن صفحه نمایش

Ah :  06h

Al : تعداد خطوط

Ch : شماره سطر گوشه بالا سمت چپ

Cl : شماره ستون گوشه بالا سمت چپ

Dh : شماره سطر گوشه پایین سمت راست

Dl : شماره ستون گوشه پایین سمت راست

Bh : صفت محدوده

ندارد

 

Bh یک بایت هست. هر بایت از 8 بیت تشکیل شده. در وقفه بالایی هر کدام از این بیت ها نقشی دارند که پایین تو ضیح داده شده است :

 

 

مثال : عدد زیر یک بایت هست. این عدد را به bh به صورت باینری ، اکتال ، شاندزده دهی و دسیمال انتصاب کنید.

10100111

Mov bh, 10100111b   ; باینری

Mov bh, 247o    ; اکتال، برای نوشتن اکتال باید 3 تا 3تا از سمت راست جدا کنیم.

Mov bh, 0a7h   ; هگزا، در هگزا 4عدد 4عدد از سمت راست جدا می کنیم.

Mov bh, 167   ; دسیمال

نکته : چشمک زن و شدت نور را تا وقتی که توی مسئله گفته نشده را نباید چاپ کنید.

 

مثال : برنامه ای بنویسید که پرچم ایران را چاپ کند.

.model small

.stack 128

.data

.code

    fashooMP proc far

       

        mov ah, 06h

        mov al, 8

        mov bh, 10101000b

        mov ch, 0

        mov cl, 0

        mov dh, 7

        mov dl, 79

        int 10h

       

        mov ah, 06h

        mov al, 8

        mov bh, 11111000b

        mov ch, 8

        mov cl, 0

        mov dh, 15

        mov dl, 79

        int 10h

       

        mov ah, 06h

        mov al, 8

        mov bh, 11001000b

        mov ch, 16

        mov cl, 0

        mov dh, 24

        mov dl, 79

        int 10h

       

        mov ah,08h 

        int 21h

       

        mov ah, 4ch

        int 21h

       

        fashooMP endp

    end fashooMP

 

مثال : برنامه ای بنویسید که صفحه نمایش را به صورت کامل با رنگ پیش فرض پاک کند. سپس پیام )اسم و فامیل خود ) را در مختصات     (3, 25) چاپ کند. سپس صفحه مختصات را در ( 4و 10) تا ( 70و 20) پاک کند.(زمینه سبز، قلم قرمز، چشمک زن) .  سپس در مختصات ( 20و 10) پیام Enter your text: را چاپ کند. سپس رشته ای حدکثر به طول 30 کاراکتر را دریاف نماید. سپس در مختصات (50و 15) رشته your text is: را چاپ کند و پس از آن رشته دریافت شده را چاپ کند و بعد از آن یک کاراکتر رادریافت کند که چاپ نشود.

 

توضیحات دستورات Mul و Div

 

ضرب: در این دستور ابتدا باید به al مقدار که قصد ضرب کردن آن را داریم بنویسیم. سپس برنامه عملوند2 را د al ضرب می کند و نتیجه را درون ax می گزارد.

Mov al, عملوند1

Mul عملوند2 

تقسیم: در این دستور باید ابتدا مقسوم رل درون ax بگزاریم سپس باید بر عدد مورد نظر تقسیم کنیم. خارج قسمت جواب به al ریخته می شود و باقیمانده تقسیم به ah ریخته می شود.

Mov ax, مقسوم

DIV عملوند(مقسوم علیه)

نکته : برای تبدیل مقدار یک بایتی al به دوبایتی ax از دستور CBW استفاده می کنیم.

مثال : برنامه ای بنویسید که دو عدد یک رقمی بگیرد سپس جواب را درون متغیر حافظه بریزد.

.model small

.stack 64

.data

S dw ?

.code

Main proc far

Mov ax, @data

Mov ds, ax

 

Mov ah, 01h

Int 21h

 

Sub al, 48

Mov bh, al

 

Int 21h

Sub al, 48

 

CBW

Mul bh

 

Mov s, ax

Mov ah, 4ch

Int 21h

 

Main endp

End main

 

جلسه هفتم

 

دستورات پرش در اسمبلی

1- jmp

اسم پرش

اسم متغیر

توضیحات

Jmp

برچسب

برای انتقال کنترل اجرا به محل برچسب

تعریف برچسب

برچسب:                           "علامت : بعد از برچسب حتما باید نوشته شود."

نکته :

برچسب را نباید درون دیتا تعریف کنیم. نباید با عدد شروع شود. نباید از ثبات برای اسم برچسب استفاده شود.

مثال:

......

برچسب:

…..

….

….

Jmp   برچسب

2- CMP

اسم پرش

عملوند 1

عملوند 2

توضیحات

CMP

عملوند 1

عملوند2

برای مقایسه عملوند 1 و عملوند 2 است.

نکته : عملوند 1 منهای عملوند 2 می شود. و تاثیرات نتیجه به ثبات پرچم ریخته می شود.

نتیجه مقایسه عملوند ها به دو ثبات پرچم ریخته می شود.

1- SF : اگر نتیجه مقایسه مثبت باشد ، SF صفر میشود. اگر نتیجه مقایسه منفی باشد ، SF یک می شود.

2- ZF : اگر نتیجه محاسبه صفر نباشد ، ZF می شود صفر. اگر نتیجه محاسبه صفر نباشد ، ZF می شود یک.

 

مثال :

Jmp

        برچسب

توضیحات

Js

برچسب

 پرش به محل برچسب در صورتیکه ، sf= 1 باشد. یعنی نتیجه محاسبه منفی است. یعنی عدد اول از عدد دوم کوچکتر است.

Jns

برچسب

پرش به محل برچسب در صورتیکه ، sf = 0 باشد. یعنی نتیجه محاسبه مثبت است. یعنی عدد اول از عدد دوم بزرگتر یا مساوی است.

Jz

برچسب

پرش به محل برچسب در صورتیکه ، zf = 1  باشد. یعنی نتیجه محاسبه صفر است. یعنی عدد اول با عدد دوم برابر است.

Jnz

برچسب

پرش به محل برچسب در صورتیکه ، zf = 0 باشد. یعنی نتیجه محاسبه صفر نیست. یعینی عدد اول با عدد دوم برابر نیست.

 

 

مثال : برنامه ای بنویسید که دو عدد 1 رقمی را بگیرد و عدد بزرگتر را چاپ کند.

.model small

.stack 64

.code

Main proc far

 

Mov  ah, 01h

Int 21h

Mov bl, al

Int 21h

 

CMP bl, al

Js    l1      "پرش به محل ال.یک در صورتی که اس.دو برابر یک باشد. یعنی نتیجه منفی است. یعنی بی.ال از آ.ال کوچکتر است."

;در صورتی که پرش بالا انجام نشد یعنی شرط بالا غلط است. یعنی بی.ال از آ.ال بزرگتر یا کوچکتر است.

Mov ah, 02h

Int 21h

Jmp    l2     

L1:

Mov ah, 02h

Mov dl, al

Int 21h

L2:

Mov ah, 4ch

Int 21h

Main enp

End main

 

مثال : برنامه ای بنویسید که اعداد 0 تا 9 را چاپ کند.

 

.model small

.stack 64

.code

Main proc far

Mov dl, 48

L1:

Mov ah,02h

Int 21h

Inc dl

Cmp dl, 58

Js l1

 

Mov ah, 4ch

Int 21h

 

Main endp

End main

 

 

 

جلسه هشتم

حلقه :

CX

تعداد دفعات تکرار

برچسب:

 

.......

بدنه حلقه

........

 

 

 

 

Loop

 

نکته : حلقه loop به صورت اوتوماتیک دستورات زیر را اجرا می کند.

برچسب : dec  CX
cmp   cx,0
jnz  برچسب

 

مثال : برنامه ای بنوسید که 10 عدد یک رقمی را بگیرد و معدل آنها را چاپ کند.

الگوریتم :

a.      شروع

b.      0 <<<< S

c.       اعمال زیر را 10 بار انجام شود.

1.      A را بگیر

2.      S <<<< S + A

d.      A <<<< S/10

e.       A را چاپ کند.

.model small

.stack 128

.code

Main proc far

Mov bh, 0      ;بی.اچ را برای جمع مجموع اعداد بکار می بریم.

Mov  cx, 10

  L1:

Mov ah, 01h

Int 21h

Sub al , 48

ADD bh, al

   Loop l1

Mov al, bh

CBW

Mov cl, 10

Div cl

Mov ah, 02h

Mov dl, al

Add dl, 48

Int 21h

Mov ah, 4ch

Int 21h

Main endp

End main

 

مثال : برنامه ای بنوسید که دو عدد را بگیرد و خارج قسمت حاصل تقسیم عدد بزرگتر بر عدد کوچک را چاپ کند.

مثال : برنامه ای بنوسید که تعدادی عدد را دریافت نماید و معدل آنها را چاپ نمیاید. شرط پایان ورود عدد صفر است.

.model small

.stack 64

.code

Main proc far

Mov bh, 0

Mov bl, 0

   ls:

Mov ah, 01h

Int 21h

Cmp al,48

Jz lc

Sun al, 48

Add bh, al

Inc bl

Jmp ls

   lc:

Mov al, bh

Cbw

Div bl

Add al, 48

Mov dl , al

Mov ah, 02h

Int 21h

Mov ah,4ch

Int 21h

Main endp

End main

 

مثال : برنامه ای بنوسید که تعدادی عدد مثبت غیر صفر را دریافت نماید و بزرگترین عدد دریافتی را چاپ کند.

.model small

.stack 64

.code

Main proc far

Mov ah, 01h

Int 21h

Mov bh, al

   l2:

Mov ah, 01h

Int 21h

Cmp al, 48

Jz l1

Cmp al, bh

Js l2

Mov bh, al

Jmp l2

   l1:

Mov ah, 02h

Mov dl,bh

Int 21h

Mov ah, 4ch

Int 21h

Main endp

End main

 

مثال ها :

a.      برنامه ای بنویسید که یک عدد بگیرد و مقسوم علیه های آن را چاپ کند.

.model small

.stack 64

.code

Main proc far

Mov ah, 01h

Int 21h

Sun al,48

Mov bh, al

Mov cl, al

Mov ch, 0

   l1:

Mov al, bh

Cbw

Div cl

Jnz l2

Mov dl, cl

Add dl,48

Mov ah, 02h

Int 21h

   l2:

Loop l1

Mov ah, 4ch

Int 21h

Main endp

b.     End main

 

c.       برنامه ای بنویسید که یک عدد بگیرد و مقسوم علیه های مشترک آن را چاپ کند.

d.      برنامه ای بنویسید که یک عدد بگیرد و فاکتوریل آن را در یک متغیر حافظه قرار دهد.

e.       برنامه ای بنویسید که عددی را بگیرد که مشخص کند که عدد اول است یا نه؟

f.        برنامه ای بنوسید که یکی عدد را بگیرد و مشخص کند که عدد دریافتی عدد کامل است یا خیر؟

 


مطالب مشابه :


تبدیل مبناها به یکدیگر

تبدیل مبناهای 2 به 8 ، 10 ، 16 تبدیل مبنای 8 به 2 ، 10 ، 16 تبدیل مبنای 10 به 2 ، 8 ، 16 ، و بالاخره تبدیل




آموزش تبدیل مبنا ها

تبدیل مبنای ۱۰ به 16. یعنی عدد مبنای ۸ را ۳ بیت ۳بیت به مبنای ۲ برده سپس ۴ بیت ۴ بیت




اصول تبدیل اعداد

تبدیل از مبنای 2 به 16: برای تبدیل از مبنای 2 به مبنای 16 از ممیزبطرف راست وچپ اعداد را چهار




تبديل مبناها (مبانی سال دوم کامپیوتر)

تبديل مبناي 16 به 10 : 16=>10::: (9d7a)=(10*16^0)+(7*16^1)+(13*16^2)+(9*16^3)=40314




تبديل اعداد مبناي 16 به مبناي 2 در ديباگ

برای تبدیل اعداد مبنای 16 به مبنای 2 در دیباگ به یادگیری چند مورد نیاز داریم . استفاده از فلاگ




برنامه تبدیل مبنای 10 به مبنای 2 (++C & C)

برنامه تبدیل مبنای 10 به مبنای 2 برنامه تبدیل مبنای 10 به مبنای 2 (++c & c) برنامه زبان c:




خلاصه آموزشی از درس اسمبلی

تبدیل مبنای 2 به 16 و اعداد اعشاری مبنای 2 به مبنای 10. برای تبدیل اعداد اعشاری




برچسب :