اصول اساسی برنامه نويسی به زبان اسمبلی

345
ی ل ب م س ا ان ب ه ز ب ی س ي و ن ه م ا رب ب ی سسا ول ا ص ا: ف ل و مRichard C. Detmer ن مي ج ر* مت: ون ح. ش م- ل ص ی ا م. س ها م* ت س سي ی مه ساز ا رب ب و ن ي. سی ما ها ن ا ب ز م* ت س سي ی مه ساز ا رب ب و ن ي. سی ما ها ن ا ب ز ده ب ه ه د ازاب ده ب ه ه د ازاب اده رز سك ع ن س ح: اده رز سك ع ن س ح:

Upload: damon

Post on 11-Jan-2016

79 views

Category:

Documents


2 download

DESCRIPTION

زبانهای ماشين و برنامه سازی سيستم. اصول اساسی برنامه نويسی به زبان اسمبلی. مو لف : Richard C. Detmer. مترجمين : هاشمی اصل - مشحون. ارايه دهنده : حسن عسكرزاده. فهرست مطالب. فصل اول : نمایش داده ها در کامپیوتر فصل دوم : قسمت های یک سیستم کامپیوتری فصل سوم : استفاده از اسمبلر - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: اصول اساسی برنامه نويسی به زبان اسمبلی

اصول اساسی برنامه نويسی به زبان اسمبلی

Richard C. Detmer مو لف :

هاشمی اصل - مشحون : مترجمين

زبانهای ماشين و برنامه زبانهای ماشين و برنامه سازی سيستمسازی سيستم

: حسن عسكرزاده : حسن عسكرزادهارايه دهندهارايه دهنده

Page 2: اصول اساسی برنامه نويسی به زبان اسمبلی

: کامپیوتر نمایش داده ها در فصل اول :فصل اول: کامپیوتری قسمت های یک سیستم فصل دوم :فصل دوم: اسمبلر استفاده از فصل سوم :فصل سوم

: دستورالعملهای اساسیدستورالعملهای اساسیفصل چهارم : فصل چهارم : حلقهحلقه انشعاب و انشعاب وفصل پنجم : فصل پنجم : هاها روال روالفصل ششم : فصل ششم : هاها عملیات رشته عملیات رشتهفصل هفتم : فصل هفتم : دهیدهی سایر حالت های آدرس سایر حالت های آدرسفصل هشتم : فصل هشتم : هاها دستکاری بیت دستکاری بیتفصل نهم : فصل نهم : خروجیخروجی / وقفه و ورودی / وقفه و ورودیفصل دهم : فصل دهم : اسمبلیاسمبلی پردازش پردازشفصل یازدهم : فصل یازدهم : شرطیشرطی اسمبلیاسمبلی ها و ها و ماکروماکروفصل دوازدهم : فصل دوازدهم : نمونهنمونه مثال مثالفصل سیزدهم : فصل سیزدهم

فهرست مطالب

Page 3: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل اول

نمايش داده ها در كامپيوتر

Page 4: اصول اساسی برنامه نويسی به زبان اسمبلی

نمايش داده ها در کامپيوترفصل اول

اعداد دودویی و شانزده شانزدهیکد های کارکتری برای اعداد صحیح عالمت دار2نمایش مکمل 2جمع و تفريق اعداد مكمل سيستم هاي ديگر براي نمايش اعداد

Page 5: اصول اساسی برنامه نويسی به زبان اسمبلی

زبCCان در داده هCCا نمCCايش چگCCونگي

اسمبلي:

اعداد دودويي و شانزده شانزدهي

کدهاي کاراکتري

لFFFايش مکمFFFحيح 2نمFFFداد صFFFراي اعFFFب

عالمت دار

سيستم هاي ديگر براي نمايش اعداد

مکمل يک•

•BCD

مميز شناور•

Page 6: اصول اساسی برنامه نويسی به زبان اسمبلی

اعداد دودويي و شانزده شانزدهي

بيت كوچكترين واحد قابل ثبت در كامپيوتر است مانند اعداد در 2ارزش مكاني اعداد در مبناي

است10مبناي ( + 1*3 برابر است با )10 در مبناي 123

(2*10( + )1*100) برابر است با 2 در مبناي 1010

(0*1(+)1*2(+)0*4(+)1*8 )

Page 7: اصول اساسی برنامه نويسی به زبان اسمبلی

نمادها در نمايش اعداد در مبناها

2مبناي 0 ,1

10مبناي 0,1,2,3,4,5,6,7,8,9

مبناي شانزده 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

A=10 ,B=11, C=12, D=13, E=14, F=15

Page 8: اصول اساسی برنامه نويسی به زبان اسمبلی

سيستم ارزش مکاني مبناي دو:

و ...هشت گانچهارگاندوگانيگان

اعFداد دودويي بFه قFدري طFوالني هسFتند کFه خوانFدن و نوشFتن

آنها مشکل است.

Page 9: اصول اساسی برنامه نويسی به زبان اسمبلی

سيسFتم شانزده شFانزدهي مي توانFد اعFداد را فقFط بFا اسFتفاده

از يک چهارم ارقام سيستم دودويي نمايش دهد.

ت علت بFFFديل سFFFاده بين سيسFFFتم دودويي و شFFFانزده به

مبنFاي شFانزدهي تلقي شFکل کوتFاه شFده دودويي بعنFوان 16،

شود.

مFورد اسFتفاده 9 تFا 0در سيسFتم شانزده شFانزدهي رقم هFاي

تFا 10قFرار مي گيرنFد؛ کFه عالوه بFر اين، بFه جFاي اعFداد دهFدهي

جايگزين مي گردند.F تا A حروف 15

سيستم ارزش مکاني مبناي شانزده:

و...شش گان و پنجاه دويست وشانزده گانيگان

Page 10: اصول اساسی برنامه نويسی به زبان اسمبلی

جدول مقايسه اعداد در مبناهاي متفاوت

دهدهي شانزده شانزدهي

دودويي

0 0 0

1 1 1

2 2 10

3 3 11

4 4 100

5 5 101

6 6 110

7 7 111

8 8 1000

9 9 1001

10 A 1010

11 B 1011

12 C 1100

13 D 1101

14 E 1110

15 F 1111

Page 11: اصول اساسی برنامه نويسی به زبان اسمبلی

:2 به مبناي 16تبديل مبناي

يک عFدد شانزده شFانزدهي مي توانFد بFه سFادگي بFا جFايگزيني

چهFار بيت بFراي هFر رقم شانزده شFانزدهي بFه عFدد معFادل

دودويي تبديل شود.

Page 12: اصول اساسی برنامه نويسی به زبان اسمبلی

:16 به مبناي 2تبديل مبناي

ابتFFدا از سFFمت راسFFت، عFFدد را بFFه دسFFته هاي چهFFاربيتي

تقسFFيم مي کFFنيم و سFFپس هFFر دسFFته را بFFا رقم معFFادل

شانزده شانزدهي آن جايگزين مي نماييم.

Page 13: اصول اساسی برنامه نويسی به زبان اسمبلی

روش تبديل عدد دهدهي به شانزده شانزدهي

و قراردادن باقيمانده هادر كنار يكديگر16با تقسيم متوالي عدد بر به روش زير محاسبه ميشود16 در مبناي 5876مثال عدد

376 4باقيمانده 16÷ 5876 =

16 = 22 15باقيمانده ÷ 367

= 1 6باقيمانده ÷ 22 16

16 = 0 1باقيمانده ÷ 1

16F4

Page 14: اصول اساسی برنامه نويسی به زبان اسمبلی

طول كلمات

بايت1 بيت يا 8بايت كلمه ياWORD 16 بايت2 بيت يا كلمه مضاعف ياdouble word 32 بايت4 بيت يا

در يك عدد مثبت بايد بيت منتها اليه سمت چپ باشدصفر

Page 15: اصول اساسی برنامه نويسی به زبان اسمبلی

:10 به 2تبديل مبناي

براي تبFديل يFک عFدد دودويي بFه معFادل دهFدهي آن، بFه جFاي

تبFديل مسFتقيم و طFوالني، سFريعتر خواهFد بFود کFه آن را بFه

ببريم.10 و سپس به مبناي 16مبناي

Page 16: اصول اساسی برنامه نويسی به زبان اسمبلی

کدهاي کاراکتري( 2

در کFامپيوتر بFه حFروف، اعFداد، عالمت هFا و کاراکترهFاي ديگFر، يFک

عدد نسبت داده مي شود.

سيسFتمي کFه بFه طFور عمFومي در ريFز کامپيوترهFا مFورد اسFتفاده

قFFرار گرفتFFه اسFFت کFFد اسFFتاندارد امريکFFايي بFFراي تبFFادل

مخفف صورت به )که است ASCII (Americanاطالعات

Standard Code for Information Interchange) دهFFنامي

مي شود.(

Page 17: اصول اساسی برنامه نويسی به زبان اسمبلی

در سيسFتم اسFکي از هفت بيت بFراي نمFايش دادن کاراکترهFا

استفاده مي شود.

کFد مختلFف اسFکي را نمFايش 128به اين تFرتيب مي تFوان

داد.

o بFه صFورت اعFداد در مبنFاي شFانزده 00کدهاي اسFکي معمFوال

نمايش داده مي شوند.127 تا 0 و دهدهي 7Fتا

Page 18: اصول اساسی برنامه نويسی به زبان اسمبلی

بين کFد هFر حFرف بFزرگ و کFد کوچFک همFان حFرف، در يFک

، صFFفر 5بيت تفFFاوت وجFFود دارد در حFFروف بFFزرگ بيت

اسFت و در حFروف کوچFک، يFک، ولي بيت هFاي ديگFر مشFابه

هستند

Page 19: اصول اساسی برنامه نويسی به زبان اسمبلی

بعنFوان کFدهاي کنFترلي شFناخته 1F16تFا 0016کاراکترهFاي

مي شوند.

0D16 0 وA16 طرFه اول سFت بFدهاي برگشFرتيب کFه تFب

(CR) ورFط خFو خ (LF) کيFدهاي اسFفحه کليFتند. در صFهس

0D16 فشFار داده شFود کFد Return يFا EnterوقFتي کليFد

توليFد مي گFردد. وقFتي اين کFد بFه يFک صFفحه نمFايش اسFکي

فرسFتاده شFود، بFاعث مي شFود کFه مکان نمFا بFه ابتFداي خFط

جاري ) و نه خط بعدي( برود.

مکFان نمFا را يFک خFط بFه طFرف پFائين حFرکت 0A16کد

مي دهFد. در اين صFورت مکان نمFا بFه ابتFداي خFط نخواهFد

رفت.

Page 20: اصول اساسی برنامه نويسی به زبان اسمبلی

براي اعداد صحيح عالمت دار2نمايش مکمل (3

يFک روش خيلي خFوب بFراي ذخFيره کFردن 2سيسFتم مکمFل

اعداد عالمت دار صحيح به صورت دودويي است.

وقFتي يFک عFدد بFه شFکل مکمFل دو نشFان داده مي شFود، تعFداد

بيت هاي مورد استفاده بايد از قبل مشخص گردد.

براي نمFايش يFک عFدد صFحيح مثبت بFه شFکل مکمFل دو، ابتFدا

بايFد آن را بFه صFورت دودويي بFا صFفرهاي اضFافي نوشFت تFا

طول موردنظر به دست آيد.

Page 21: اصول اساسی برنامه نويسی به زبان اسمبلی

در يFFک عFFدد مثبت بايFFد بيت منتهي اليFFه سFFمت چپ يFFا بFFا

ارزش ترين بيت، صفر باشد.

وجFFود »يFFک« در اين بيت مشFFخص کننده آن اسFFت کFFه عFFدد

منفي اسFت. بقيFه بيت هFاي عFدد منفي هماننFد بيت هFاي عFدد

ت.بدون عالمت متناظر آن نيس

Page 22: اصول اساسی برنامه نويسی به زبان اسمبلی

مکمل دو يک عدد منفي:

ابتFدا آن را بFه صFورت عFدد بFدون عالمت در مبنFاي شFانزده بيFان

100 کرده و سپس براي نمايش آن به شکل کلمه، آن را از

تفريق مي کنيم.0016

00 00 100و براي نمايش آن به شکل مضاعف، آن را از

تفريق مي کنيم. 0016

Page 23: اصول اساسی برنامه نويسی به زبان اسمبلی

عبFارت از عددي کFه بايFد عFدد اصFلي را از آن تفريFق کFرد

( اسFت و بFه دنبFال آن بايFد همFان تعFداد 1يFک عFدد يFک )

رقم که در عدد موجود است صفر قرار داد.

Page 24: اصول اساسی برنامه نويسی به زبان اسمبلی

گرفتن مکمل دو يا مکمل گيري:

عمFل تفريFق کFردن عFدد از يFک عFدد »يFک« کFه بFه دنبFال آن

، را گويند.تعداد صفرهاي الزم قرار گرفته اند

در نمFFايش مکمFFل دو، تعFFداد ارقFFام معين اسFFت در نتيجFFه

o مي تFFوان بزرگ تFFرين عFFددي را کFFه در آن قابFFل مشخصFFا

نمFايش اسFت، تعFيين نمFود. در نمFايش بFه صFورت کلمFه،

اسFت. زيFرا اين بزرگ تFرين 7F FFبزرگ تFرين عFدد مثبت

بيFتي در نمFايش بFه صFورت دودويي اسFت کFه بFا 16عFدد

ارزش تFرين بيت آن صFفر اسFت. اعFداد مثبت کFه بFه صFورت

نوشFته مي شFوند مي تواننFد در سFمت چپ خFود 16مبنFاي

را داشته باشند.7يکي از ارقام صفر تا

Page 25: اصول اساسی برنامه نويسی به زبان اسمبلی

اگر مکمل دو عددي را بگيريم و سپس از حاصل

o مکمل دو بگيريم به عدد اصلي برمي گرديم. مجددا

Page 26: اصول اساسی برنامه نويسی به زبان اسمبلی

اگر عمل را بر روي يک عدد منفي آغاز کنيد، نتيجه

عمل گرفتن مکمل دو به يافتن عدد بدون عالمت

متناظر به آن ختم خواهد شد.

Page 27: اصول اساسی برنامه نويسی به زبان اسمبلی

جمع و تفريق اعداد مکمل دو:

يک دليFل اسFتفاده از روش مکمFل دو بFراي ذخFيره

کFردن اعFداد صFحيح عالمت دار آن اسFت کFه عمليFات

جمFع و تفريFق مي تواننFد بFه سFادگي و بFه طFور کارآمFد

در سخت افزار کامپيوتر پياده سازي شوند.

Page 28: اصول اساسی برنامه نويسی به زبان اسمبلی

يک رقم را از بFاارزش ترين مکFان بFه مکFان بعFدي بFه

طFرف چپ انتقFال مي دهFد و يFک رقم »اضFافي« ايجFاد

مي کند.

سخت افزار کFFامپيوتر در زمFFان عمFFل جمFFع مي توانFFد

سFرريز را تشFخيص دهFد. کFامپيوتر در واقFع جمFع را بFه

صFورت دودويي انجFام مي دهFد و بFر روي جفت بيت هFا

از سمت راست به چپ عمل مي کند.

Page 29: اصول اساسی برنامه نويسی به زبان اسمبلی

سرريزي زماني رخ مي دهد که رقم نقلي به داخل

بيت عالمت با رقم نقلي از بيت عالمت متفاوت

باشد.

Page 30: اصول اساسی برنامه نويسی به زبان اسمبلی

سرريزي رقم نقلي از بيت عالمت

رقم نقلي به بيت عالمت

خيربلهبلهخير

خيربلهخيربله

خيرخيربلهبله

Page 31: اصول اساسی برنامه نويسی به زبان اسمبلی

تفريFق اعFداد بFه صFورت مکمFل دو، در صFورت امکFان

همانند تفريق اعداد بدون عالمت است.

مت چپFد، در سFدد اول باشFر از عFدد دوم بزرگ تFر عFاگ

اضافه مي کنيم.1عدد اول يک عدد

Page 32: اصول اساسی برنامه نويسی به زبان اسمبلی

سرريزي نFيز بFراي تفريFق تعريFف مي شFود. چنانچFه در يFک

تFFا 32768-تفريFFق، حاصFFل تفريFFق خFFارج از محFFدوده

باشFFد مشFFاهده خواهFFد شFFد کFFه سFFرريزي رخ 32768

مي دهFد و پاسFخ نادرسFت ايجFاد مي گFردد. بFراي تشFخيص

سFرريزي، هماننFد کFامپيوتر، بايFد تفريFق را بFه جمFع تبFديل

کFرد، بFراي اينکFار الزم اسFت مکمFل عFدد دوم گرفتFه شFود

اين عمFل و يFک واحFد بFه آن افFزوده گFردد. حFال اگFر در

جمFع سFرريزي رخ دهFد در تفريFق اصFلي نFيز رخ خواهFد

داد.

Page 33: اصول اساسی برنامه نويسی به زبان اسمبلی

سيسCتم هاي ديگCر بCراي نمCايش

اعداد

مکمل يک

دهدهي دودويي شده(BCD)

مميز شناور

Page 34: اصول اساسی برنامه نويسی به زبان اسمبلی

گرفتن مکمل يک:

براي بFه دسFت آوردن عFدد منفي کافيسFت کFه تمFام

بيت هFا را معکFوس کFنيم، تمFام صFفرها را بFه يFک و

تمFام يک هFا را بFه صFفر تبFديل نمFاييم گFاهي اوقFات

اين عمل، گرفتن مکمل يک ناميده مي شود.

Page 35: اصول اساسی برنامه نويسی به زبان اسمبلی

مکمFل يFک داراي معFايب زيFادي اسFت و عمFده ترين آنهFا

اين اسFت کFه طFراحي مFدار بFراي انجFام جمFع يFا تفريFق در

اين اعFداد مشFکل تر اسFت و بFراي عFدد صFفر دو گونFه

نمFايش وجFود دارد. محFدوده اين اعFداد تFا حFدي کFوچک تر

مي شود.

چنانچه مکمل يک عددي را بگيريد و يک واحد به

آن بيافزائيد، مکمل دو آن عدد به دست مي آيد.

Page 36: اصول اساسی برنامه نويسی به زبان اسمبلی

بFFا تعFFداد معيFFني بFFايت نشFFان داده BCDاغلب اعFFداد

مي شوند.

براي يFک کFامپيوتر انجFام عمليFات رياضFي بFر روي اعFداد

BCD امFFود و انجFFد بFFل دو نخواهFFداد مکمFFارايي اعFFه کFFب

عمليFات رياضFي بFر روي اعFدادي کFه بFه صFورت کFدهاي

اسکي نمايش داده شوند خيلي غيرکارآمد است.

Page 37: اصول اساسی برنامه نويسی به زبان اسمبلی

، اعFداد را بFه شFکل نزديFک بFه نمFاد علمي ممFيز شFناورروش

ذخيره مي کند.

o هماننFFد نمFFايش علمي در سيسFFتم دهFFدهي توان دو، دقيقFFا

اسFت کFه در آن تFوان، بFا شFمردن تعFداد ارقFامي کFه ممFيز بايFد

بFه سFمت چپ يFا راسFت حFرکت کنFد تFا مFانتيس مFوردنظر بFه

دست آيد، حاصل مي شود.

Page 38: اصول اساسی برنامه نويسی به زبان اسمبلی

به طFور خالصFه، مي تFوان مراحFل زيFر را بFراي تبFديل يFک عFدد

بيان داشت:IEEEدهدهي به فرم ساده

فر وFداد مثبت صFايش در اعFوع نمFمت چپ در اين نFرين بيت سFآخ

در اعداد منفي يک است.

.عدد را به صورت بدون عالمت در سيستم دودويي بنويسيد

عدد را به شکل نماد علمي دودويي بنويسيد

بيت کسFري وجFود دارد امFا نيFاز نيسFت 24 اسFت. f23=1کFه در آن

که صفرهاي اضافي سمت راست نوشته شوند.

ابتFدد ثFني 12710عFا يعFدد نمFه عFرا ب e وعFد. اين مجمFافه کنيFاض

در فFرم دودويي در هشFت بيت بعFدي جFواب اسFت کFه بFه دنبFال بيت

عالمت قرار مي گيرد.

رFرين بيت کسFناور را 23آخFيز شFا ممFدد بFبيت ع

حذف مي گردد.f23تشکيل مي دهند. بيت

02122 ..... fff

efff 2..... 02223

Page 39: اصول اساسی برنامه نويسی به زبان اسمبلی

کامپيوتر عمليFFات رياضFFي بFFر روي اعFFداد بFFا ممFFيز شFFناور را

o کنFFدتر از عمليFFات بFFر روي اعFFداد مکمFFل دو انجFFام معمFFوال

مي دهFد. البتFه مFزيت قبFول کFردن اعFداد غيرصFحيح يFا اعFداد

خيلي بFزرگ يFا خيلي کوچFک اين عFدم کFارآيي نسFبي محاسFبات

با آنها را به کنار مي زند.

Page 40: اصول اساسی برنامه نويسی به زبان اسمبلی

تمFFFام داده هFFFا در کFFFامپيوتر بFFFا اسFFFتفاده از سFFFيگنال هاي

الکFترونيکي نمFايش داده مي شFوند. اين سFيگنال ها مي تواننFد

بFه صFورت الگوهFايي از ارقFام دودويي )بيت( تفسFير گردنFد.

اعFداد مي تواننFد بFه صFورت دهFدهي، شFانزده شFانزدهي يFا

دودويي نوشته شوند.

در اعFداد مکمFل دو، جمFع و تفريFق سFاده اسFت. زيFرا طFول يFک

عFدد مکمFل دو محFدود اسFت و امکFان رقم نقلي و غFيره وجFود

دارد.

Page 41: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل دوم

قسمتهاي يك سيستم كامپيوتري

Page 42: اصول اساسی برنامه نويسی به زبان اسمبلی

مطالب اين فصل

سخت افزارpc حافظه اصليواحد پردازش مركزيدستگاههاي ورودي / خروجي

نرم افزارpcسيستم عاملويرايشگر متنمترجم زبان و پيوند دهنده برنامه

Page 43: اصول اساسی برنامه نويسی به زبان اسمبلی

واحد پردازش مركزي

Page 44: اصول اساسی برنامه نويسی به زبان اسمبلی

: حافظCCه PCسخت افزار

اصلي

يک کFFFامپيوتر حقيقي شFFFامل سFFFخت افزار و نرم افFFFزار

مي باشد.

اجFFزاء اصFFلي سFFخت افزاري يFFک سيسFFتم ريزکFFامپيوتر

:معمولي عبارتند از

يک تراشه واحد پردازش مرکزي(CPU)

اي حافظههتراشه

يک صفحه کليد براي ورودي

يک مانيتور براي نمايش خروجي

يرهFراي ذخFک بFده ديسFد گرداننFا چنFک يFا کيFردن برنامه ه

و داده ها.

Page 45: اصول اساسی برنامه نويسی به زبان اسمبلی

نرم افFزار بFه برنامه هFايي کFه سFخت افزار اجFرا مي کنFد،

اطالق مي شود.

حافظFFه اصFFلي يFFک مجموعFFه منطقي از مکان هFFايي

اسFت کFه هرکFدام مي توانFد يFک بFايت دسFتورالعمل ها يFا

داده هFا را ذخFيره نمايFد. هFر بFايت حافظFه اصFلي داراي

مي باشد.آدرسيک برچسب عددي به نام

Page 46: اصول اساسی برنامه نويسی به زبان اسمبلی

......

000

00

000

01

9FF

FD

9FF

FE

FFFF

E

FFFF

F

تصوير منطقي حافظه pcاصلي

Page 47: اصول اساسی برنامه نويسی به زبان اسمبلی

در حقيقت متشFکل از مFدارهاي مجتمFع PCحافظFه اصFلي يFک

(IC.مي باشد )

RAM : دFه مي توانFند کFادفي مي باشFتيابي تصFا دسFه بFاين حافظ

بFا اسFتفاده از دسFتورالعمل هاي برنامFه، اطالعFاتي را روي آنهFا

بFا قطFع جريFان RAMنوشFته و يFا خوانFد. محتFواي تراشFه هاي

برق کامپيوتر از بين مي رود.

ROM : ا راFFط آنهFFوان فقFFوده و مي تFFا دائمي بFFواي آنهFFمحت

.خوانده ولي نمي توان روي آنها نوشت

Page 48: اصول اساسی برنامه نويسی به زبان اسمبلی

را مي تFFوان بFFه صFFورت PCاصFFلي يFFک حافظFFة

مجمFوعه اي از سFگمنت ها در نظFر گFرفت. يFک سFگمنت

بFايت بFوده و آدرس شFروع آن مضFرب 64kبFه طFول

مي باشد.16

Page 49: اصول اساسی برنامه نويسی به زبان اسمبلی

به جFاي اسFتفاده از پنج رقم شFانزده شFانزدهي آدرس يFک

حافظFه اصFلي، مي تFوان آنFرا بFا سFگمنت حFاوي بFايت تبFاي

مزبFور و بFه دنبFال ان افسFتي کFه از ابتFداي سFگمنت يFاد شFده

در نظر گرفته مي شود، آدرسي دهي کرد.

آفسFت برابFر فاصFله بFايت مFورد نظFر از اولين بFايت

مي باشد. سگمنت مربوطه

Page 50: اصول اساسی برنامه نويسی به زبان اسمبلی

yyyآفست

آدرس اين بايت برابر

XXX0+YYYY

شروع سگمنت

XXXX

آدرس دهي يک بايت با استفاده از سگمنت و آفست آن

Page 51: اصول اساسی برنامه نويسی به زبان اسمبلی

چنين آدرسFي بFه صFورت چهFار رقم شFانزده شFانزدهي

سFگمنت و سFپس کFاراکتر کFولن ):( و بFه دنبFال آن چهFار

رقم شانزده شانزدهي افست ذکر مي گردد.

Page 52: اصول اساسی برنامه نويسی به زبان اسمبلی

براي بدسFFFت آوردن آدرس پنج رقمي شFFFانزده شFFFانزدهي،

آدرس شروع و افست را با هم جمع مي کنيم.

بFا ترکيبFات مختلFف »افسFت: سFگمنت«يک بFايت را مي تFوان

آدرس دهي کرد.

Page 53: اصول اساسی برنامه نويسی به زبان اسمبلی

CPU: واحد پردازش مرکزي PCافزار سخت

ثبFات مي باشFد کFه هFر کFدام يFک 14 داراي 8088تراشFه

16محFل ذخFيره سFازي داخلي بFوده و مي توانFد يFک کلمFه

بيتي را نگه دارد.

Page 54: اصول اساسی برنامه نويسی به زبان اسمبلی

را ثبات هاي داده اي يا ثبات هاي Ax، Bx، Cx، Dxثبات هاي

همگاني مي گويند.

را با توجه به اينکه بسياري از نتايج محاسبات در آن Axثبات

( مي گويند. accumulatorقرار مي گيرند، گاهي آکوموالتور )

Page 55: اصول اساسی برنامه نويسی به زبان اسمبلی

را مي تFوان بFه صFورت Ax، Bx، Cx، Dxهر کFدام از ثبات هFاي

بيت سFمت چپ 8 بيFتي مسFتقل يعFني نصFف بFاال بFراي 8دو ثبFات

بيت سمت راست، استفاده نمود.8و نصف پائين براي

, AH، Al، BH، CL اسFامي اين ثبات هFاي هشFت بيFتي عبارتنFد از

CH، DL , DH.

بFه تFرتيب قسFمت هاي بFاالئي و پFائيني L و Hدر اينجFا حFروف

ثبات ها را نشان مي دهند.

Page 56: اصول اساسی برنامه نويسی به زبان اسمبلی

سFگمنت حافظFه سFگمنت کFد شFامل شFمارهCSثبFات

يعFني نFاحيه اي از حافظFه اصFلي کFه دسFتورالعمل هاي

اجرائي برنامه در آنجا ذخيره مي شوند، مي باشد.

Page 57: اصول اساسی برنامه نويسی به زبان اسمبلی

شFامل شFماره سFگمنت حافظFه سFگمنت DSثبFات

داده ها مي باشد.

سFگمنت حافظFه سFگمنت شFامل شFمارهESثبFات

فوق العاده مي باشد.

شFامل شFماره سFگمنت حافظFه سFگمنت SSثبFات

پشته مي باشد.

Page 58: اصول اساسی برنامه نويسی به زبان اسمبلی

درسيني هاپشتهشبيهاطالعاتيساختاريکپشته،يک

يکرستورانمي باشد

بالکلمةافستشاملوبودهپشتهگراشاره،SPثبات

مي باشدپشتهائي

SP

Page 59: اصول اساسی برنامه نويسی به زبان اسمبلی

فراخFFFواني روال هFFFايک کFFFاربرد عFFFادي پشFFFته در

مي باشد.

افسFت دسFتورالعمل بعFد از دسFتور العمFل فراخFواني

روي پشFFته ذخFFيره مي گFFردد. در موقFFع برگشFFت از

روال، اين افست از پشته بازيابي مي شود.

Page 60: اصول اساسی برنامه نويسی به زبان اسمبلی

ثبات هاي انديس مي باشند. DI و SIثبات هاي

( وSource Index برابر انديس منبع )SI ثبات

Destination برابFFFر انFFFديس مقصFFFد )IDثبFFFات

Index .مي باشد )

Page 61: اصول اساسی برنامه نويسی به زبان اسمبلی

، IPثبات اشاره گر دستور العمل ها يعني

نمي تواند بطور مستقيم توسط برنامه

نويس زبان اسمبلي دستيابي شود.

Page 62: اصول اساسی برنامه نويسی به زبان اسمبلی

بيت اين ثبFات بFراي نشFان دادن 16ثبFات نشFانه: بعضFي از

نتيجFFه اجFFراي دسFFتورالعمل بوسFFيله دسFFتورالعمل هاي

مختلFف تغيFير پيFدا مي کننFد. هFر کFدام از اين بيت هFا را يFک

يا بيت نشانه مي گويند.بيت وضعيت

Page 63: اصول اساسی برنامه نويسی به زبان اسمبلی

: دستگاه هاي ورودي/خروجيPCسخت افزار

o از سه تا هشت يک دستگاه ورودي/خروجي معموال

درگاه استفاده مي کند. اين آدرس ها از آدرس هاي

حافظه معمولي متمايز مي باشند.

Page 64: اصول اساسی برنامه نويسی به زبان اسمبلی

:PCنرم افزار

نرم افزار به برنامه ها يا روال هايي که بوسيله سخت

افزار اجرا مي شوند، اطالق مي شود.

:دليل لزوم سفارش سيستم عامل اينست که

عFFده روال هFFاي نرم افFFزاري اسFFتفاده سيسFFتم عامل از يFFک

ذخFيره ROMمي کنFد کFه بFه طFور دائمي روي تراشFه هاي

مي شFFوند و اين روال هFFا از يFFک سيسFFتم بFFه سيسFFتم ديگFFر

تغيير مي کنند.

Page 65: اصول اساسی برنامه نويسی به زبان اسمبلی

: ويرايشگرهاي متنPCنرم افزار

يک ويرايشFگر متن، برنFامه اي اسFت کFه مي تFوان بFه وسFيله

آن فايل هFFاي متFFني را روي ديسFFک ذخFFيره کFFرده يFFا آنهFFا را

تغيFFير داد. يFFک فايFFل متFFني مجمFFوعه اي از کFFدهاي اسFFکي

است.

بFا توجFه بFه اينکFه يFک فايFل متFني را بFه EDLINويرايشFگر

صFFFورت مجمFFFوعه اي از خطFFFوط در نظFFFر مي گFFFيرد، يFFFک

ويرايشگر خطي ناميده مي شود.

Page 66: اصول اساسی برنامه نويسی به زبان اسمبلی

، ويرايشFگرهاي متFني مي باشFند کFه واژه پردازهFا

سFرويس هاي اضFافي بFراي قالب بنFدي و چFاپ

مستندات ارائه مي دهند.

Page 67: اصول اساسی برنامه نويسی به زبان اسمبلی

مي تFوانيم بFراي آمFاده سFاختن يFک فايFل کFد منبFع زبFان

اسFFمبلي از يFFک واژه پFFرداز اسFFتفاده کFFنيم، ولي يFFک

واژه پFرداز مي توانFد اطالعFات قالب بنFدي را بFه همFراه

کFFدهاي اسFFکي متن مFFورد نظFFر در داخFFل يFFک فايFFل

ذخFيره کنFد. چFنين اطالعFات اضFافي ممکن اسFت فايFل

مزبFور را بFه عنFوان يFک فايFل کFد منبFع زبFان اسFمبلي

غيرقابل استفاده گرداند.

Page 68: اصول اساسی برنامه نويسی به زبان اسمبلی

: مترجم يک زبان و پيونددهنده برنامهPCنرم افزار

مترجم يFک زبFان برنFامه اي اسFت کFه کFد يFک منبFع را بFه فFرمي

تبديل مي کند که مي تواند توسط کامپيوتر اجرا شود.

:مترجم ها را مي توان به سه گروه تقسيم نمود

مفسرها

کامپايلرها

اسمبلرها

Page 69: اصول اساسی برنامه نويسی به زبان اسمبلی

مفسرها:

.دFه مي کننFتقيم ترجمFور مسFه طFع را بFه منبFک برنامFي

يFک مفسFر بFراي اجFراي يFک برنامFه، يFک خFط از برنامFه

منبFع را گرفتFه و دسFتورالعمل هاي واقFع در خFط مزبFور را

اجرا مي کند.

بيFور نسFه طFب o برنامه هFايي کFه تفسFير مي شFوند معمFوال

کند اجرا مي شوند.

هFFه بFFک برنامFFراي يFFير و اجFFر تغيFFک مفسFFک يFFه کمFFب

سرعت صورت مي گيرد.

Page 70: اصول اساسی برنامه نويسی به زبان اسمبلی

کامپايلر:

هFFدف آن را کFFد هFFه و کFFع را گرفتFFد منبFFک کFFايلر يFFک کامپFFي

o متشFکل از دسFتورالعمل هايي مي باشFد کFه بFه وسFيله معمFوال

CPU.مورد نظر اجرا مي شوند، تشکيل مي دهد

دFپيون o کFد هFدف توليFد شFده بFه وسFيله يFک کامپFايلر بايسFتي غالبFا

(link) وانFا بتFود تFرکيب شFر تFدف ديگFدهاي هFا کFا بFده و يFداده ش

آن را به داخل حافظه اصلي بار کرده و اجرا نمود.

يرFاي تفسFريعتر از برنامه هFده خيلي سFل شFاي کامپايFبرنامه ه

شده اجرا مي شوند

Page 71: اصول اساسی برنامه نويسی به زبان اسمبلی

اسمبلر:

يک اسمبلر خيلي شبيه کامپايلر مي باشد اما زبان

.مي کند اسمبلي را به زبان ماشين ترجمه

براي اجراي فايل هاي نتيجه، بايستي آنها را پيوند o غالبا

داد.

Page 72: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل سوم

استفاده از اسمبلر

Page 73: اصول اساسی برنامه نويسی به زبان اسمبلی

مطالب اين فصل

دستورالعملهاي اسمبليچگونه بايد برنامه را اسمبل لينك و اجرا كنيمفايل ليست اسمبلر عمولوند دستوراتDB و DWعمولوند دستورالعملها ورودي خروجيهاي تعريف شده درIO.H

Page 74: اصول اساسی برنامه نويسی به زبان اسمبلی

دستورالعملهاي زبان اسمبلي

هر دسFتورالعمل زبFان اسFمبلي در روي يFک خFط فايFل کFد منبFع

کFاراکتر داشFته 128وانFد حFداکثر توارد مي شFود. يFک خFط مي

باشد.

وجFود خطFوط خFالي مجFاز اسFت و اسFتفاده از آنهFا بFراي جFدا

کردن بخش هاي مختلف کد برنامه مفيد است.

Page 75: اصول اساسی برنامه نويسی به زبان اسمبلی

ه بFه مFتوضFيحات بFراي مستندسFازي و فهم بيشFتر برنا

کFار مي رونFد و مي تواننFد در هFر جFايي از برنامFه وجFود

شFFروع ';'داشFFته باشFFند. هFFر توضFFيحي بFFا کFFاراکتر

مي شود و تا انتهاي خط مي تواند ادامه داشته باشد.

Page 76: اصول اساسی برنامه نويسی به زبان اسمبلی

حالت های آدرس دهی

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

Page 77: اصول اساسی برنامه نويسی به زبان اسمبلی

زبان اسمبلي داراي سه نوع دستور مي باشد:

دستورالعمل

دستور اسمبلر

ماکرو

Page 78: اصول اساسی برنامه نويسی به زبان اسمبلی

: بFه وسFيله اسFمبلر بFه کFد هFدف ترجمFه مي گFردد دسCتورالعمل

و اين کدها هستند که در زمان اجرا، اجرا مي گردند.

: بFه اسFمبلر مي گويFد کFه عملي را انجFام دهFد. دسCتور اسCمبلر

د.رو اغلب هيچ اثري بر روي کد هدف ندا

: نFFFFوعي دسFFFFتورالعمل اسFFFFت کFFFFه در آن تعFFFFدادي ماکرو

دسFتورالعمل ها، دسFتورات اسFمبلر يFا حFتي ماکروهFاي ديگFر قFرار

گرفته اند.

Page 79: اصول اساسی برنامه نويسی به زبان اسمبلی

يک دستورالعمل مي تواند شامل عناصر زير باشد:

اسمنام دستورالعملعملوند)ها(توضيحات

;[comment][operand)s(]mnemonic[name]

يک کFFFFاربرد فيلم اسFFFFم آن اسFFFFت کFFFFه مي تFFFFوان آدرس

دسFتورالعملي را بFه صFورت نمFادي بعFد از اسFمبل و لينFک شFدن

برنامFه بFا يFک برچسFب نشFان داد. دسFتورالعمل هاي ديگFر بFه

راحتي مي توانند به دستورالعمل مزبور رجوع کنند.

Page 80: اصول اساسی برنامه نويسی به زبان اسمبلی

دسFFFFتورالعمل هاي داراي برچسFFFFب مي تواننFFFFد مقصFFFFد يFFFFک

دستورالعمل پرش در زبان اسمبلي باشند.

ساختار حلقه در زبFان اسFمبلي وجFود نFدارد، امFا مي تFوان حلقه هFا

و يا دستورالعمل هاي ديگر پياده سازي کرد.jmpرا با استفاده از

FFب نمي توانFFه دبرچسFFر نقطFFود. و اگFFروع شFFدد شFFيله عFFه وسFFب

o بايد اولين کاراکتر باشد. استفاده شود، حتما

اي ديگFر مي تواننFد در هFر موقعيFتي هFبغFيراز اعFداد و نقطFه، کاراکتر

استفاده شوند.

کاراکتر اول اسم مورد استفاده قرار خواهد گرفت.31فقط

Page 81: اصول اساسی برنامه نويسی به زبان اسمبلی

مقFادير عFددي در دسFتورات زبFان اسFمبلي، دهFدهي فFرض

مي شFوند و فقFط زمFاني اين فFرض کنFار گذاشFته مي شFود کFه

در برنامه منبع حالت ديگري خواسته شده باشد.

از اعFداد يک مقFدار شFانزده شFانزدهي بايFد بFا يFک عFدد بغFير

«، شFروع شFود تFا اسFمبلر بتوانFد fتFا »« aشانزده شFانزدهي »

آنها را از يک اسم تشخيص دهد.

Page 82: اصول اساسی برنامه نويسی به زبان اسمبلی

شکل کلی برنامه

START STACK _ SEG SEGMENT PARA STACK ‘STACK’

.اندازه پشتهSTACK _ SEG ENDSDATA _ SEG SEGMENT PARA ‘DATA’

متغیر هاDATA _ SEG ENDSEXTRA _ SEG SEGMENT PARA ‘EXTRA’

متغیرهای رشته هاEXTRA _ SEG ENDSCODE _ SEG SEGMENT PARA ‘CODE’

دستورالعمل های برنامهCODE _ SEG ENDSEND START

Page 83: اصول اساسی برنامه نويسی به زبان اسمبلی

يک برنامFه از قسFمت هاي مختلفي تشFکيل شFده اسFت: هFر کFدام

ENDS و SEGMENTاز اين قسFFمت ها بFFا دسFFتورات اسFFمبلر

شروع شده و خاتمه يافته اند:

Segment_name SEGMENT

.

.

Segment_name ENDS

هيچ وقت داراي عملونFFد نيسFFت؛ ولي دسFFتور ENDSدسFFتور

SEGMENT.در بعضي کاربردها با عملوند به کار مي رود

Page 84: اصول اساسی برنامه نويسی به زبان اسمبلی

آخرين دستور برنامه، دستور اسمبلر زير است:

END start

بFه اسFمبلر مي گويFد کFه پFردازش دسFتورات کFد ENDدسFتور

منبع را خاتمه دهد.

وجFود دارد و آن ENDدر يFک برنامFه منبFع فقFط يFک دسFتور

آخرين دستور است.

Page 85: اصول اساسی برنامه نويسی به زبان اسمبلی

مشFخص کننFده اولين دسFتور برنامFه اسFت کFه بايFد startعملونFد

اجFرا شFود. زمFاني کFه برنامFه بFار مي شFود، سيسFتم عامل ثبFات

سFگمنت کFد را بFا سFگمنتي کFه حFاوي اين دسFتورالعمل اسFت

را بFFا IPمقFFداردهي کFFرده و ثبFFات اشFFاره گر دسFFتورالعمل ها،

آفسFFت اين دسFFتورالعمل از ابتFFداي سFFگمنت مزبFFور شFFروع

مي نمايد.

Page 86: اصول اساسی برنامه نويسی به زبان اسمبلی

Number1 DW ?

Number2 DW ?

هرکدام يک کلمه را در سگمنت داده ذخيره مي کنند.

عالمت سFؤال بFه اسFمبلر مي گويFد کFه هيچ مقFدار اوليه اي بFه

اين دو کلمه نسبت داده نشود.

Page 87: اصول اساسی برنامه نويسی به زبان اسمبلی

چنFد بFايت را بFا مقFادير اوليFه داده DBهر کFدام از دسFتورات

شFده ذخFيره مي نماينFد. در هFر مFورد، عملونFدها، مقFادير اوليFه را

تعيين مي کنند.

Page 88: اصول اساسی برنامه نويسی به زبان اسمبلی

:سگمنت کد با دستور اسمبلر زير شروع مي شود

ASSUME CS:Code,DS:data

ويFد در صFورتيکه يFک دسFتورالعمل از يFک گاين دسFتور بFه اسFمبلر مي

برچسFب کFه در داخFل سFگمنت کFد قFرار دارد اسFتفاده بکنFد آدرس

و CSواقعي عملونFد مزبFور بايFد بFه وسFيله حاصFلجمع ثبFات سFگمنت

آفست برچسب از ابتداي سگمنت کد محاسبه شود.

Page 89: اصول اساسی برنامه نويسی به زبان اسمبلی

سيسFتم عامل وظيفFه مقFداردهي اوليFه ثبFات سFگمنت کFد را بFه

بFFه عهFFده دارد ولي ENDواسFFطه عملونFFد موجFFود در دسFFتور

انجFام DSسيسFتم عامل همين کFار را بFراي ثبFات سFگمنت داده

نمي دهد. اينکار را بايد برنامه نويس انجام دهد.

شماره واقعي سFگمنت داده تFا زمFاني کFه برنامFه بFار نشFده باشFد

قابFل تعFيين نيسFت، در آن زمFان اسFت کFه اين آدرس بFه وسFيله

DOS.براي برنامه تعيين مي شود

Page 90: اصول اساسی برنامه نويسی به زبان اسمبلی

هيچ دسFتورالعملي نمي توانFد يFک عملونFد بالواسFطه را در يFک ثبFات

سگمنت قرار دهد.

يFک رشFته شFش کFاراکتري کFدهاي اسFکي بFراي عFدد itoaماکروي

مکمل دو ايجاد مي کند.

o تFرتيب کFدهاي حاصFله در يFک سFگمنت، تFرتيب دسFتورالعمل ها دقيقFا

را تعيين مي کند.

Page 91: اصول اساسی برنامه نويسی به زبان اسمبلی

DW و DBعملوندهاي دستورات

اسFمبلر، اعFداد را دهFدهي فFرض مي کنFد مگFر در حFالتي کFه داراي

پسFوندي باشFند کFه بFه معنFاي ديگFري اشFاره کنFد يFا اينکFه بFه وسFيله

پيش فرض را تغيير داده باشيم.RADIXدستور اسمبلر

مي توانFد در محFدوده دهFدهي DBيک عملونFد عFددي بFراي دسFتور

255 باشFFد. يFFک عFFدد بFFدون عالمت صFFفر تFFا 255- تFFا 255

مي تواند دريک بايت ذخيره شود.

- 65535از ، محFدوده مجFاز بFراي عملونFديDWدسFتور در مFورد

در يFک 65535 مي باشFد. اعFداد بFدون عالمت صFفر تFا 65535تFا

.کلمه جاي مي گيرند

Page 92: اصول اساسی برنامه نويسی به زبان اسمبلی

مي توانFد بFراي توليFد چنFدين بFايت يFا کلمFه بFا مقFادير DUPعملگFر

اوليFه معين و يFا بFدون مقFدار اوليFه، مFورد اسFتفاده قFرار بگFيرد.

و دسFتورات اسFمبلر ديگFري کFه DB، DWکFاربرد اين عملگFرد بFه

فضا را ذخيره مي کنند محدود مي شود.

Page 93: اصول اساسی برنامه نويسی به زبان اسمبلی

بFه برنFامه نويس اجFازه مي دهFد کFه يFک مقFدار اوليFه را کFه DWدسFتور

برابFر آفسFت قسFمت ديگFري از حافظFه اسFت، نسFبت دهFد. اينکFار

شFبيه بFه داشFتن يFک متغFير اشFاره گر اسFت کFه مقFدار آن آدرس

بلوکي از حافظه مي باشد.

Page 94: اصول اساسی برنامه نويسی به زبان اسمبلی

دستورات

array DB 100 DUP(?)

Pointer DW OFFSET array

ذخFيره pointer و يFک کلمFه را بFراي array بFايت را بFراي 100

مقداردهي اوليه مي شود.array با آفست pointerمي کنند و

Page 95: اصول اساسی برنامه نويسی به زبان اسمبلی

: يک کلمه مضاعف را ذخيره مي کندDDدستور اسمبلر

DQ.هشت بايت را ذخيره مي کند :

DT.ده بايت را ذخيره مي کند :

Page 96: اصول اساسی برنامه نويسی به زبان اسمبلی

عملوند دستورالعمل ها

عملونFدها داراي انFواع مختلFف هسFتند: بعضFي ثFابت بFوده، بعضFي

مي باشFند و بFرخي بFه حافظFه CPUمشFخص کننده ثبات هFاي

رجوع مي نمايند.

به طFور کلي عملونFد اول، مقصFد عمليFات را تعFيين مي کنFد و

عملوند دوم منبع عمليات را.

يک عملوند حالت بالواسطه نمي تواند بعنوان مقصد قرار گيرد.

Page 97: اصول اساسی برنامه نويسی به زبان اسمبلی

در مواردمعFدودي، برنFامه نويس ممکن اسFت يFک ثبFات سFگمنت و

MASMيFک آفسFت واقعي را بFه عنFوان عملونFد مسFتقيم بنويسFد،

دستورالعمل زير را مجاز مي شمارد:

Mov bx,dx:0014h

را بFا کلمه اي کFه از بيسFتمين بFايت BXاين دسFتورالعمل، ثبFات

سFFگمنت داده شFFروع مي شFFود، بFFار مي نمايFFد. اين آدرس قابFFل

جابجايي نيست.

يک عملوند ثبات غيرمستقيم، از داده حافظه استفاده مي کند.

Page 98: اصول اساسی برنامه نويسی به زبان اسمبلی

فقFط چهFار ثبFات مي تواننFد بFراي آدرس دهي ثبFات غيرمسFتقيم بFه

کار بروند:

BX

BP

SI

DI

در حFالت ثبFات غيرمسFتقيم، ثبFات هماننFد يFک متغFير اشFاره گر در

زبان هاي سطح باال مي باشد.

بايFد مFورد PTRوقFتي انFدازه عملونFد حافظFه مبهم باشFد، عملگFر

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

Page 99: اصول اساسی برنامه نويسی به زبان اسمبلی

را مجFاز $اسFمبلر، اسFتفاده از عملونFد شFمارنده مFوقعيت يعFني

مي شFمارد، اين عملونFد در زمFان اسFمبل شFدن مقFدار آفسFت

يFFک دسFFتورالعمل را نشFFان مي دهFFد. اين عملونFFد مي توانFFد در

دستورالعمل ها يا دستورات اسمبلر مورداستفاده قرار بگيرد

Page 100: اصول اساسی برنامه نويسی به زبان اسمبلی

، محتFوي هيچ ثبFاتي و همينطFور ثبFات نشFانه ها را outputماکروي

تغيير نمي دهد.

اثFFر CX فقFFط بFFر روي ناحيFFه مقصFFد و ثبFFات inputsماکروي

تغيFير نخواهنFد هامي گFذارد، هيچ ثبFات ديگFري از جملFه ثبFات نشFانه

کرد.

داراي هيچ عملونFدي نمي باشFد. اين مFاکرو يFک inputcماکروي

کFاراکتر را از صFفحه کليFد مي خوانFد و کFد اسFکي آن را در ثبFات

AL.ذخيره مي نمايد

Page 101: اصول اساسی برنامه نويسی به زبان اسمبلی

قFادر باشFد کFه بFه طFور موفقيت آمFيز يFک رشFته atoiاگFر مFاکروي

صFفر OFکFاراکتر اسFکي را تبFديل کنFد آنگFاه نشFانه سFرريز يعFني

بسFFته بFFه PF,ZF,SFخواهFFد گرديFFد. در تمFFام مFFوارد نشFFانه هاي

برگردانFده مي شFود بFه تFرتيب زيFر تغيFير خواهنFد AXمقFداري کFه در

کرد:

اگر عدد منفي باشدSFيک خواهد شد و در غيراينصورت صفر .

دFفر باشFدد صFر عFاگZF،فرFالت غيرصFد و در حFد شFک خواهFي

صفر خواهد شد.

PF نشاندهنده توازن عدد برگردانده شده در AX .است

Page 102: اصول اساسی برنامه نويسی به زبان اسمبلی

نمونه كد ماشين

0000 000A a dw 100002 00 b db ? .code0000 8B DF mov bx,di0002 8A F9 mov bh,cl0004 8B 1E 0000 R mov bx,a0008 8A 26 0002 R mov ah,b000C 8B 12 mov dx,[si][bp]000E A0 0002 R mov al,b0011 8A 26 0002 R mov ah,b0015 BB 0003 mov bx,30018 B1 03 mov cl,3001A C7 06 0000 R 0064 mov a,1000020 C6 06 0002 R FF mov b,255

Page 103: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل چهارم

دستورالعمل هاي اساسي

Page 104: اصول اساسی برنامه نويسی به زبان اسمبلی

مطالب اين فصل

انتقال اطالعات بين مكانهاي مختلف 2جمع و تفريق مكملدستورالعملهاي ضربدستورالعملهاي تقسيم با اعداد بزرگ2جمع و تفريق مكمل

Page 105: اصول اساسی برنامه نويسی به زبان اسمبلی

هدف فصل

هدف اين فصل ، بررسي دستورالعملهايي است ، كه براي انتقال داده ها بين مكانهاي

مختلف حافظه و انجام محاسبات با اعداد صحيح مكمل دو، مورد استفاده قرار مي

گيرند .

Page 106: اصول اساسی برنامه نويسی به زبان اسمبلی

عناوين مهم فصل

1-4 مختلف مكانهاي بين انتقال داده ها حافظه

2-4 دو مكمل تفريق جمع و3-4 ضرب هاي دستورالعمل 4-4 تقسيم هاي دستورالعمل5-4 دو با اعداد بزرگتر مكمل وتفريق جمع 6-4 خالصه ي مطالب فصل

Page 107: اصول اساسی برنامه نويسی به زبان اسمبلی

انتقال داده ها بين مكانهاي مختلف حافظه

دو مفهوم اساسي اين فصل فضا )حافظه ( و زمان كاراييمي با شند .

دستورالعملmov در زبان اسمبلي براي كپي كردن داده هااز محلي به محل ديگر مورد استفاده قرار مي گيرد.

دستورالعمل xchg ، دستور مفيد ديگري است كه درزباناسمبلي براي تعويض داده هاي منبع ومقصد كاربرد دارد.

را از يك كلمه به : مي توان اندازه ي داده ي مورد نظر نكته

يا بالعكس تغيير داد. يك بايت و

Page 108: اصول اساسی برنامه نويسی به زبان اسمبلی

مفهوم كارايي زمان

مدت زمان الزم براي اجراي يك دستورالعمل بر حسب سيكلهاي ساعت .

هر چه سيكل هاي زماني براي اجراي يك دستور العمل كمترباشد ان دستور العمل كارايي بيشتري خواهد داشت .

به طور كلي دستور العملهايي كه به حافظه دستيابي مي كنندخيلي كندتر از دستورهايي هستند كه از ثبات ها استفاده مي كنند بنا براين بايد در صورت امكان داده هايي كه زياد مورد

استفاده قرار ميگيرند را در ثبات ها قرارداد.

Page 109: اصول اساسی برنامه نويسی به زبان اسمبلی

مفهوم كارايي حافظه

ايجاد برنامه ي هدفي كه طول ان حداقل باشد يعني حافظهي كمتري را اشغال كند )كد فشرده( مناسبتر وحتي در بعضي

كاربرد هاي زبان اسمبلي الزم است . كارايي زمان بر حافظه ارجحيت دارد زيرا حافظه را مي توان

ا ما زمان را نه ! خريد )جبران كرد ( بنابراين برنامه اي كه سريعتر اجرا شود بر ديگري برتر است

حتي اگر از حافظه ي بيشتري استفاده كند.

Page 110: اصول اساسی برنامه نويسی به زبان اسمبلی

movدستورالعمل

به صورتmov destination , source نوشته مي شود و يك كپي destination به محل sourceبايت يا يك كلمه را از محل

مي كند . دستور العملmov شبيه يك دستور جايگزيني ساده در زبانهاي

هايي در زبان محدوديت سطح باال مي باشد ، البته با وجوداسمبلي

دستور العملmov محتواي ثبات نشانه ها و ثبات IP اشاره ( گر دستورالعمل ها ( را تغيير نمي دهد .

فرم هاي مجاز دستور العملmov 104 صفحه 4-1 در شكل كتاب درج شده است .

Page 111: اصول اساسی برنامه نويسی به زبان اسمبلی

را از movمحدوديت هاي زبان اسمبلي كه دستوريك دستور جايگزيني در يك زبان سطح باال

متمايز مي كند .1 ( عبارتهايي نظير -Count = 3 number + 5 را نمي توان با )

بيان كرد . ) الزم است قبال چند دستورالعمل movيك دستور براي محاسبه ي عبارت سمت راست استفاده شود . (

2 نيستند مجاز- تمام تركيبات انواع عملوندهاي منبع و مقصد .

Page 112: اصول اساسی برنامه نويسی به زبان اسمبلی

كه ممكن movتركيباتي ازعملوندهاي دستوالعملنمي باشند :

1 عملوند هر دو- در صورتي كه. منبع و مقصد در حافظه قرار داشته باشند

2 عملوند منبع بالواسطه به ثبات سگمنت مقصد -3هرانتقالي به ثبات نشانه ها يا از ان -4 هر انتقالي به ثبات -IP 5 انتقال از يك ثبات سگمنت به ثبات سگمنت ديگر -6 هر انتقالي كه عملوندهاي ان از يك نوع بايت يا كلمه -

نباشند

Page 113: اصول اساسی برنامه نويسی به زبان اسمبلی

وقتي كه عملوندهاي منبع و مقصد در movدستور

حافظه هستند با توجه به اينكه دستورالعملmov نمي تواند داده اي را از يك

منبع حافظه به يك مقصد حافظه كپي كند ، معموال براي انجام كه از يك ثبات مياني استفاده movاين كار ازدو دستورالعمل

مي كنند ، بهره مي گيريم . را به عنوان ثبات مياني به كار ببريم زيرا AXبهتر است ثبات

از يك سيكل زماني و بايت حافظه ، كمتري نسبت به ثبات كتاب مراجعه 104 ) به صفحه .هاي ديگر استفاده مي كند

شود (

Page 114: اصول اساسی برنامه نويسی به زبان اسمبلی

xcghدستور العمل

به صورتoperator2 , operator1 xcgh نوشته مي شود . و عملي را انجام مي دهد كه در زبانهاي سطح باال با سه دستور صورت مي گيرد . اين دستور عملوند اول و عملوند

دوم را با يكديگر تعويض نموده به صورتي كه به سيكل زماني و .حافظه كمتري نياز داشته باشد

هاي مختلف دستورالعمل فرمxcgh كتاب 110 در صفحه است .

در صورت استفاده از حافظه اصلي ، عملوند حافظه بايد عملوند باشد . xcghدوم دستور

دستورالعملxcgh. ثبات نشانه ها را تغيير نمي دهد

Page 115: اصول اساسی برنامه نويسی به زبان اسمبلی

نكته

براي تغيير اندازه داده مورد نظر از يك كلمه به يك بايت ميتوان كلمه مورد نظر را به يك ثبات انتقال داده پس بايت

بااليي يا پاييني را به مقصد مورد نظر انتقال دهيم . برعكس مي توانيم دو بايت را در يك ثبات كنارهم گذاشته پس

كلمه حاصل را به مقصد مورد نظر كپي كنيم .

Page 116: اصول اساسی برنامه نويسی به زبان اسمبلی

2جمع و تفريق مكمل

دستورالعمل هايadd و sub براي انجام جمع و تفريق با استفاده از عملوند هاي به طول يك بايت يا يك كلمه مي باشند .

مربوطه نكات دستورالعمل هايinc و dec براي افزايش ) يك واحد اضافه مي

كند ( و كاهش )يك واحد كم مي كند ( يك عملوند بوده رابطه دراين نكاتي دستورالعملneg 2 براي منفي كردن يك عملوند ) ساختن مكمل

يك عدد( مي باشد .بين دستور العمل هاي اين بخش و دستورالعمل هاي اين تفاوت

xcgh و movبخش و دستورالعمل هاي كامل مثال يك

Page 117: اصول اساسی برنامه نويسی به زبان اسمبلی

addدستورالعمل

: به فرمSource , add destination است كه در صورت اجرا در محل 2 به مقدار مكمل Source در محل 2، مقدار مكمل

destination اضافه شد و حاصل جايگزين مقدار قبلي

destination. مي گردد

Page 118: اصول اساسی برنامه نويسی به زبان اسمبلی

Subدستورالعمل

اين دستور به صورتsub destination , surce است و در 2 از مقدار مكمل surce در محل 2صورت اجرا مقدار مكمل

كم شده و تفاضل انها جايگزين مقدار destinationدر محل تفاضل به مي گردد destinationقبلي

محاسبه مي شود . source – destinationصورت

Page 119: اصول اساسی برنامه نويسی به زبان اسمبلی

نكته

دردستورالعملهايadd و sub ( محتواي عملوند دوم source تغيير )نميكند.

براي هر دستورaddيك دستور sub ،متناظر با همان نوع عملوند ها تعداد سيكل هاي زماني و تعداد بايت هاي كد هدف وجود دارد .

اعمال جمع و تفريق زماني سريع ترين مي باشند كه هر دو عملونددر ثبات ها قرار داشته باشند و زماني كندترين مي باشند كه

عملوند مقصد يك كلمه اي در حافظه باشد . اضافه كردن يك عملوند واقع در حافظه ي اصلي به محتواي يك

ثبات سريعتر از اضافه كردن مقدار يك ثبات به محتواي يك عملوند واقع درحافظه ي اصلي مي باشند .

زماني كه عملوند مقصد برابر يك كلمه است ، يك عملوند منبعبالواسطه مي تواند برابر يك بايت باشد . زيرا در زمان اجراي عمل

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

Page 120: اصول اساسی برنامه نويسی به زبان اسمبلی

dec وincدستورالعمل هاي

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

ميكنند.فرم اين دو دستور به صورت زيراست :

inc destination

dec destination

Page 121: اصول اساسی برنامه نويسی به زبان اسمبلی

dec وincنكاتي در مورد دستورات

مقدار عملوند مقصد را به صورت يك عدد بدون عالمت درنظرميگيرند.

نشانه هايOFو SFو ZF را تغييرميدهند ولي نشانه CF راتغييرنمي دهند.

جمع ازدستورات براي افزايش و كاهش شمارنده ها مفيدند و . ترند كارامد متناظر وتفريق

بهترين مكان براي نگه داشتن شمارنده ها در صورت امكانثبات ها مي باشند.

براي اشنايي بيشتربا انواع عملوندهاي دستورات فوق به شكل كتاب مراجعه شود .118 صفحه ي 5-4

Page 122: اصول اساسی برنامه نويسی به زبان اسمبلی

add نسبت به dec وincعلت كارامد تر بودن درشمارنده هاsubو

دودستورadd bx , 1 و inc bx از نظركاري معادل مي

نياز بايت حافظه3 سيكل زماني و 4 به addباشند اما دستور سيكل زماني و يك بايت 2 به incدارد در صورتي كه دستور

حافظه نياز دارد. به همين ترتيب دو دستورsub counter ,1 و dec counter از

سيكل 23 بهsubنظر كاري معادل يكديگرند ولي دستور به dec بايت حافظه نياز دارد درصورتي كه دستور4زماني و

بايت حافظه نيازمند است .4 سيكل زمان و21

Page 123: اصول اساسی برنامه نويسی به زبان اسمبلی

negدستورالعمل هاي

به صورتneg destination مورد استفاده قرار ميگيرد و تنها ان را پيدا مي كند 2 يعني مكمل عملوند خود را منفي مي كند

منفي يك عدد مثبت برابر يك عدد منفي ، منفي يك عدد منفيبرابر يك عدد مثبت و منفي عدد صفر برابر صفر مي شود .

عملوند هاي مجاز دستورneg 120 صفحه 4-6 در شكل امده است

Page 124: اصول اساسی برنامه نويسی به زبان اسمبلی

تفاوت

, add , subاين است كه تمام دستورالعمل هاي تفاوت در inc , dec و neg نشانه هاي ثبات نشانه ها را به روز در مي

اورند . مطابق مقدار نتيجه ZF, SF, PF, OF, AF نشانه هاي

دستورالعمل ها تغيير پيدا مي كنند .

Page 125: اصول اساسی برنامه نويسی به زبان اسمبلی

مثال

اين بخش با يك مثال كامل كه از دستورالعمل ها ي جديداستفاده مي كند پايان مي يابد.

برنامه مقاديرz,y ,x( 2+1 را خوانده سپس مقدار عبارتz – x+y .را محاسبه كرده ونتيجه را نمايش مي دهد -)

كتاب است وبه صورت مفصل 123اين برنامه در صفحه ي

توضيح داده شده است.

Page 126: اصول اساسی برنامه نويسی به زبان اسمبلی

دستورالعمل هاي ضرب

براي ضرب از دو دستورالعملmul و imul استفاده مي كنيم كه خيلي كندتر از دستورات جمع و تفريق مي باشند . البته

mul كمي سريعتر از imul است هر كدام از اين دستورات داراي يك عملوند)منبع( مي باشند

قراردارد.ax (al)وعملوند دوم )مقصد( همواره در ثبات Mulو imul كد عمل يكساني دارند اما بايت دوم كد هدفشان

آنها را از يكديگر متمايز مي سازد. برنامه اي كه با خواندن طول وعرض مستطيل (يك مثا ل

كتاب اورده 132مساحت ان را محاسبه مي كند در صفحه ي شده است(

Page 127: اصول اساسی برنامه نويسی به زبان اسمبلی

mulو imul

دستورimul عملوند هاي خود را به صورت اعداد داراي عالمت در نظر مي گيرد وعالمت حاصلضرب مطابق با قوانين ضرب اعداد عالمت دار

تعيين ميشود . دستورmul عملوندهاي خود را به صورت بدون عالمت در نظر گرفته و

حاصلضرب نيز بدون عالمت خو اهد بود. فرم اين دو دستوربه صورتimul source و mul source. است عملوند طول source . مي تواند برابر يك بايت يا يك كلمه باشد. محتواي ان پس از عمل ضرب تغيير نمي كند پس از عمل ضرب ممكن است مقادير نشانه هايPFو SFو ZF تغيير

كنند .. در دستورالعملهاي ضرب نمي توان از عملوند بالواسطه استفاده كرد

Page 128: اصول اساسی برنامه نويسی به زبان اسمبلی

در عمل ضربsourceطول عملوند

بسته به عملوندsource در دستو رالعمل هاي ضرب ، محل AX يا ALنگهداري عدد دوم كه بايد ضرب شود هميشه در ثبات

مي باشد . اگر طولsource يك بايت باشد ، در بايت موجود در ثبا ت AL

قرار مي گيرد AX بيتي درثبات 16ضرب شده و حاصل ضرب ، يك كلمه باشد در دو بايت sourceدر صورتي كه عدد موجود در

بيت AX( 16 بيتي در 32 ضرب شده و حاصل ضرب AXثبات بيت بااليي( قرار مي گيرد.16 )DXپاييني( و

اگر ثباتDX ، شامل بيت هاي با معني حاصل ضرب باشد قرار مي 1 را برابر OF و CF نشانه هاي imul وmulدستورات

دهند. در غير اين صورت نشانه هاي مزبور برابر صفر خواهند بود .

Page 129: اصول اساسی برنامه نويسی به زبان اسمبلی

دستورالعمل هاي تقسيمهاي دستورالعمل div و idiv . براي تقسيم اعداد صحيح به كار مي روند دستور العمل هاي تقسيم با يك مقسوم به طول مضاعف ويك مقسوم

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

دستورالعمل هايcwdو cbw براي دو برابر كردن طول مقسوم قبل از عمل تقسيم مي باشند.

بعد ازعمل تقسيم ، تنها عملوند آن )يعني source يا همان مقسومعليه ( بدون تغيير باقي مي ما ند.

دستورالعمل هاي تقسيم هيچ گونه مقاديرمفيدي در نشانه ها قرار نمي ZF SF PF OF CF AFدهند وممكن است مقادير قبلي نشانه هاي

را پاك كنند . درحين تقسيم ممكن است خطاهايي از قبيل تقسيم بر صفرويا خيلي

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

Page 130: اصول اساسی برنامه نويسی به زبان اسمبلی

div و idivدستورالعمل هاي

دستورdiv براي اعداد بدون عالمت ودستور idiv براي اعداد عالمت مورد استفاده قرار مي گيرند.فرم دستورالعمل هاي 2دار مكمل

idiv sourceتقسيم به صورت زير است : ( مي باشند كه به source كه داراي يك عملوند )div sourceو

عنوان مقسوم عليه به كار مي روند . طول مقسوم مورد نظربا توجه به source در ثباتAX يا در ثبات

قرار دارد . DX وAXهاي بعد از عمل تقسيم ، خارج قسمت و باقيمانده با توجه به

قرار مي گيرند. خاصي هاي طول مقسوم در ثبات .عالمت باقيمانده هميشه مساوي عالمت مقسوم است

Page 131: اصول اساسی برنامه نويسی به زبان اسمبلی

( sourceطول عملوند دستورالعملهاي تقسيم )و محل قرارداشتن مقسوم

اگرعملوند(source) يا همان مقسوم عليه به طول يك بايت قرار AXباشد مقسوم به طول يك كلمه بوده وبايد در ثبات

به طول يك كلمه باشد ، sourceداشته باشد واگر عملوند بيت پاييني 16مقسوم به طول يك كلمه مضاعف بوده وبايد

قرار داشته DX بيت بااليي آن در ثبات 16 وAXآن درثبات باشد.

Page 132: اصول اساسی برنامه نويسی به زبان اسمبلی

طول مقسوم ومحل قرار گرفتن خارج قسمت وباقيمانده

بيت ( 32پس از تقسيم يك كلمه مضاعف )مقسوم به طول قرار دارد به يك مقسوم عليه به DX وAXكه در ثبات هاي

وباقيمانده در AXبيت ( خارج قسمت درثبات 16طول كلمه ) قرار خواهد گرفت و پس از تقسيم يك كلمه كه DXثبات

به يك مقسوم عليه به طول يك بايت قرار داردAXدرثبات قرار AH و باقي مانده در ثبات ALخارج قسمت در ثبات

مي گيرد .

Page 133: اصول اساسی برنامه نويسی به زبان اسمبلی

با اعداد بزرگتر2جمع و تفريق مكمل

32767اگردرانجام محاسبات، با اعداد بزرگ )فراترازمحدوده -( سروكارداشته باشيم بايد از دستورالعمل هاي ويژه 32768تا

براي جمع وتفريق آنها استفاده كنيم .sbb وadcيعني انواع عملوند هاي مجاز دستوراتadcو sbb 15-4 درشكل ،

كتاب مشاهده مي شود.147صفحه نشانه يcf رامي توان توسط سه دستورالعمل clc وstc وclc

كنترل كرد.

Page 134: اصول اساسی برنامه نويسی به زبان اسمبلی

adcدستورالعمل

براي جمع اعداد بزرگ ،ابتدا همانند دستورadd ، 16 بيت با توجه به رقم نقلي از cfپاييني با يكديگر جمع شده ونشانه

بيت مرتبه بااليي ، مقدارصفر يا يك را به خود اختصاص مي بيت بعدي با هم جمع adc ، 16دهد. پس با استفاده ازدستور

16 حاصل جمع cf بودن 1شده ، به اين ترتيب كه در صورت نيز جمع شده ودرمقصد قرار مي گيرد ودر 1بيت بعدي با عدد

با هم add بيت بعدي همانند دستور cf ، 16صورت صفر بودن جمع مي شوند.

Page 135: اصول اساسی برنامه نويسی به زبان اسمبلی

sbbدستورالعمل

اين دستور براي تفريق اعداد بزرگ مورد استفاده قرار مي بيت از سمت راست به چپ تفريق مي 16گيرد. در هر بار

CF ، مگر اينكه نشانه ي subشوند ، همانند دستورالعمل باشد كه درآن صورت يك واحد از تفاضل كاسته مي 1برابر

شود.

Page 136: اصول اساسی برنامه نويسی به زبان اسمبلی

CFكنترل كردن نشانه

دستورالعملclc نشانه ي : cf .را برابر صفر قرار مي دهد 0 CF : =

دستورالعملstc نشانه ي : cf قرارمي دهد. 1 را برابر CF : = 1

دستورالعملcmc نشانه ي : cf.را مكمل مي كند

Page 137: اصول اساسی برنامه نويسی به زبان اسمبلی

خالصه مطالب

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

براي جابجايي محتواي دو محل از حافظه از دستورxchg استفاده ميشود

عمل جمع با دستورadd و تفريق با subصورت ميگيرد دستورالعمل inc براي يك واحد افزايش وdec براي يك واحد كاهش

كه كاربرد زيادي در حلقه هاي تكرار دارند دستوراتimul و idiv هستند2 ضرب و تقسيم مكمل دستوراتmul و div .ضرب و تقسيم اعداد بدون عالمت هستند براي جلوگيري از خطاي تقسيم طول مقسوم را با دستوراتcbw و

cwd دوبرابر ميكنيم

Page 138: اصول اساسی برنامه نويسی به زبان اسمبلی

خالصه مطالب

دستوراتadc و sbb براي عمليات جمع و تفريق با استفاده از بيت سرريز يا قرضي و به منظور جمع و

تفريق اعداد طوالني بكار ميروند دستورات clc و stc و cmc براي پاك كردن و روشن

بكار ميروندcf كردن و مكمل كردن نشانه دستورالعملهايي كه عملوند آن در داخل ثباتها قرار دارند

از سرعت بيشتري برخوردارند دستورات ضرب و تقسيم بسيار كندتر از جمع و تفريق

اجرا ميشوند

Page 139: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل پنجم

انشعاب و حلقه

Page 140: اصول اساسی برنامه نويسی به زبان اسمبلی

مطالب اين فصل

پرشهاي غير شرطي پرشهاي شرطي دستورات مقايسه و

ifساختارهاي پياده سازي حلقه هايfor , until , while حلقه هايfor در زبان اسمبلي آرايه ها

Page 141: اصول اساسی برنامه نويسی به زبان اسمبلی

پرش هاي غير شرطي

Jmp statement_label

متنFاظر بFا فيلFد اسFم دسFتور اسFمبلي statemaet_labelکه در آن

ديگري مي باشد.

در پاسکال يا بيسيک است. goto شبيه به JMPدستور

Page 142: اصول اساسی برنامه نويسی به زبان اسمبلی

اگFر شFرايط مختلفي وجFود داشFته باشFد کFه تحت آن شFرايط

برنامFه بايFد خاتمFه پيFدا کنFد، مي تFوان بFه يFک دسFتور اجFرايي کFه بFه

مشFخص شFده اسFت و محFل اختتFام برنامFه :quitوسFيله برچسFب

مي باشد، پرش نمود.

Page 143: اصول اساسی برنامه نويسی به زبان اسمبلی

د درFه مقصFوند کFد مي شFتي توليFگمنتي وقFاي درون سFفرم ه

درون سFگمنت جFاري قFرار داشFته باشFد، اين فرم هFا در بين انFواع

ديگر از همه رايج تر مي باشند.

رFد ديگFگمنت کFک سFه يFارتي بFه عبFه بFگمنتي کFاي بين سFپرش ه

پرش مي کنند، به ندرت مورد نياز مي باشند.

تورالعملFFود از دسFFايي خFFدار جابجFFتقيم مقFFاي غيرمسFFپرش ه

مقصFFد را، از يFFک ثبFFات يFFا از يFFک کلمFFه در حافظFFه بFFه دسFFت

مي آورند.

ودهFول تر بFر معمFواع ديگFبي، از انFگمنتي نسFاي درون سFپرش ه

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

Page 144: اصول اساسی برنامه نويسی به زبان اسمبلی

شFامل يFک جابجFايي jumpهرکFدام از اين دسFتورالعمل هاي

از مقصFFد نسFFبت بFFه خFFود دسFFتور مي باشFFند. اين مقFFدار

جابجFايي بFه آفسFت دسFتوربعدي اضFافه مي شFود تFا آفسFت

مقصد به دست مي آيد.

Page 145: اصول اساسی برنامه نويسی به زبان اسمبلی

MASM باشFد، jmpدر زمFاني کFه پFرش بFه قبFل از دسFتور

مي توانFد تعFيين کنFد کFه مقصFد کجاسFت و در صFورت امکFان از

يک مقدار جابجايي کوتاه استفاده مي کند.

باشFد، ماکرواسFمبلر JMPزمFاني کFه پFرش بFه بعFد از دسFتور

مقFدار جابجFايي دسFتور مقصFد را نمي دانFد و بايFد تصFميم بگFيرد

قFرار دهFد، بنFابراين فضFاي JMPکFه چFه مقFدار فضFا بFراي

بيتي را براي آن در نظر مي گيرد.16جابجايي

اگFر جابجFايي، فقFط بFه يFک بFايت نيFاز داشFته باشFد، بFه جFاي

را قFرار مي دهFد. اين دسFتور NOPبFايت اضFافي، دسFتورالعمل

هيچ کاري انجام نمي دهد و فقط يک بايت را اشغال مي کند.

Page 146: اصول اساسی برنامه نويسی به زبان اسمبلی

پFرش JMPزمFاني کFه بخFواهيم بFه دسFتوري بعFد از دسFتور

کFنيم و بFدانيم کFه اين دسFتور داراي فاصFله زيFادي نمي باشFد

بFه ماکرواسFمبلر بگFوييم SHORTمي تFوانيم بFه وسFيله عملونFد

کFه از مقFدار جابجFايي کوتFاه اسFتفاده کنFد. بFدين تFرتيب يFک

بايت در کد هدف صرفه جويي مي شود.

Page 147: اصول اساسی برنامه نويسی به زبان اسمبلی

پرش هCاي شCرطي، دسCتورات مقايسCه و سCاختارهاي

If

شکل کلي آنها به اين صورت است:

j--- target_statement

در آن آخFرين قسFمت دسFتور تعيين کننFده وضFعيتي اسFت کFه

تحت آن، پرش اجرا مي شود.

اگFFر شFFرط تحقFFق يابFFد، پFFرش صFFورت خوهFFد گFFرفت، در

غيراينصورت دستورالعمل بعدي اجرا خواهد شد.

Page 148: اصول اساسی برنامه نويسی به زبان اسمبلی

دسFFتورالعمل هاي پFFرش شFFرطي در وضFFعيت فلگ هFFا،

تغيFيري ايجFاد نمي کننFد و فقFط نسFبت بFه وضFعيت آنهFا

عکس العمل نشان مي دهند.

Page 149: اصول اساسی برنامه نويسی به زبان اسمبلی

JZ end_while

برابFر بFا ZFاين دسFتور بFه اين معFني اسFت کFه اگFر فلFک

پFرش end_whileيFک اسFت بFه دسFتورالعملي بFا برچسFب

کن و در غير اين صورت به دستور بعدي برو.

Page 150: اصول اساسی برنامه نويسی به زبان اسمبلی

ifچنFدين برچسFب مي تواننFد دسFتورالعمل هاي بعFد از سFاختار

کدهFدف جFزءرا آدرس دهي نماينFد. از آنجFايي کFه برچسFب ها

برنامFه نيسFتند، برچسFب هاي اضFافي بFه طFول کFد هFدف يFا

زمان اجراي برنامه چيزي را اضافه نمي کنند.

o از برچسFب هايي مثFل يبرا ، if پياده سFازي يFک طFرح غالبFا

then و else و endif.استفاده مي شود

هيچ کلمFFFه رزرو شFFFده اي حFFFاوي کFFFاراکتر خFFFط زيFFFرين

(underscore).نيست

Page 151: اصول اساسی برنامه نويسی به زبان اسمبلی

:CMPدستور

CMP operand_1 , operand-2

operand_1 را از عملونFFد operan_2اين دسFFتور عملونFFد

. مقFFدار subتفريFFق مي کنFFد، درسFFت هماننFFد دسFFتورالعمل

تفاضFFل و چيزهFFايي کFFه در اين عمFFل تفريFFق اتفFFاق مي افتنFFد

وضعيت فلگ ها را تعيين مي کنند.

عملونFFد sub اين اسFFت کFFه بFFر خالف subتفFFاوت آن بFFا

operand_1نمي دهد. را تغيير

Page 152: اصول اساسی برنامه نويسی به زبان اسمبلی

اين دسFتور دو عملونFد را بFا يکFديگر مقايسFه مي کنFد و سFپس

را برابFFر يFFک يFFا صFFفر ZF و AF,CF,OF,PFفلگ هFFاي

مي نمايد.

آن اسFت کFه مقFدار فلگ هFا را تعFيين CMPتنهFا وظيفFه دسFتور

کنFد. اين کFار وظيفFه اوليFه اين دسFتورات اسFت نFه وظيفFه

جانبي.

Page 153: اصول اساسی برنامه نويسی به زبان اسمبلی

نيFگ رقم نقلي يعFفلCF هFود کFک مي شFر يFاني برابFزم

در تفريFق يFک رقم عاريFه وجFود داشFته باشFد، چنانچFه

عاريFه وجFود نداشFته باشFد اين فلFگ برابFر صFفر خواهFد

بود.

اFرريزي يFگ سFفلOF هFود کFد بFک خواهFورتي يFدر ص

سFرريزي وجFود داشFته باشFد و در غFير اينصFورت برابFر

صفر خواهد بود.

اFگ عالمت يFفلSF لFه حاصFود کFد بFک خواهFاني يFزم

تفريFق نشFان دهنFده يFک عFدد منفي مکمFل دو باشFد و

زمFاني برابFر صFفر خواهFد بFود کFه حاصFل تفريFق برابFر

صفر يا مثبت باشد.

اFفر يFگ صFفلZF لFه حاصFود کFد بFک خواهFاني يFزم

تفريFق صFفر باشFد و در غFير اينصFورت برابFر صFفر خواهFد

بود.

Page 154: اصول اساسی برنامه نويسی به زبان اسمبلی

راه تشFخيص کFوچک تر بFودن يFک عملونFد از عملونFد

ديگFر آن اسFت کFه فلFگ عالمت سFرريزي را مقايسFه

کوچکFFFتر از operand_1کFFFنيم؛ در زمFFFاني کFFFه

operan_2 ديگرFFا يکFFاوت بFFا متفFFد، اين فلگ هFFباش

بزرگFتر يFا مسFاوي operand_1هسFتند و زمFاني کFه

operand_2 ابهيFFعيت مشFFا وضFFد، اين فلگ هFFباش

خواهند داشت.

Page 155: اصول اساسی برنامه نويسی به زبان اسمبلی

در بسFFFياري از اين پرش هFFا رابطFFFه بين دو عملونFFFد

مFوردنظر مي باشFد و نFه وضFعيت cmpدسFتورالعمل

فلگ ها.

cmpوقFتي اولين عملونFد در حافظFه باشFد، دسFتورات

بFFFFه پالس هFFFFاي سFFFFاعت کمFFFFتري نسFFFFبت بFFFFه

مربوطFه نيFاز دارنFد، زيFرا نيFازي subدسFتورالعمل هاي

به ذخيره کردن نتيجه نخواهد بود.

Page 156: اصول اساسی برنامه نويسی به زبان اسمبلی

همه دستورات زير مجاز هستند:

Cmp ax,356

Cmp pattern,0D3a6h

cmp bh,'$'

توجFه داشFته باشFيد کFه يFک عملونFد بالواسFطه بايFد

دومين عملونFد باشFد؛ بFه اين دليFل، دسFتورالعمل زيFر

مجاز نيست

Cmp 100,total ;illegal

Page 157: اصول اساسی برنامه نويسی به زبان اسمبلی

براي تعFFيين نامسFFاوي ها دوسFFري نFFام وجFFود دارد و

اينهFFا کFFدهاي ماشFFين متفFFاوتي را توليFFد مي کننFFد.

يکسFري از آنهFا بيشFتر بFه فلFگ رقم نقلي توجFه دارنFد

و بنFابراين متناسFب کFار بFا اعFداد بي عالمت مي باشFند.

مجموعFه ديگFر پرش هFاي شFرطي بFراي تعFيين تFرتيب

به فلگ عالمت و فلگ سرريزي توجه دارند.

Page 158: اصول اساسی برنامه نويسی به زبان اسمبلی

هيچ شFکل جFايگزين ديگFري بFراي دسFتورالعمل هاي

پFFرش شFFرطي جهت پرش هFFاي طFFوالني تر وجFFود

نFFدارد. گFFاهي اوقFFات پرش هFFاي شFFرطي بايFFد بFFا

پرش هFاي غيرشFرطي تFرکيب شFوند تFا بFه هFدف هايي

که در فواصل طوالني تر قرار دارند برسيم.

Page 159: اصول اساسی برنامه نويسی به زبان اسمبلی

for و while، untilپياده سازي حلقه هاي

While: . ;code to check Boolean expression

.

.

Body: . ;loop body

.

.

Jpm While ;go check condition again

End_While

Page 160: اصول اساسی برنامه نويسی به زبان اسمبلی

شرط ادامFFه کFFه يFFک عبFFارت بFFولي اسFFت در ابتFFدا

بررسFي مي گFردد، چنانچFه صFحت داشFته باشFد، آنگFاه

بدنFFه حلقFFه اجFFرا مي شFFود و دوبFFاره شFFرط ادامFFه

بررسFي مي شFود. هFر زمFاني کFه عبFارت بFولي صFحت

نداشFFFته باشFFFد، اجFFFرا بFFFا دسFFFتورالعمل بعFFFد از

end_While.ادامه پيدا مي کند

بFايت طFول داشFته 127البتFه اگFر بدنFه حلقFه بيش از

باشFد هيچکFدام از اين عبارت هFا صFحيح نخواهFد بFود

زيرا پرش نسبي خارج از محدوده مجاز خواهد بود.

Page 161: اصول اساسی برنامه نويسی به زبان اسمبلی

o شFرط ادامFه در يFک حلقFه سFاده نبFوده و WhileغالبFا

داراي دو قسFمت اسFت کFه بFه وسFيله عملگرهFاي بFولي

and اFي or رFوند. در عملگFرکيب مي شFديگر تFا يکFب and

هFر دو عملونFد بايFد صFحت داشFته باشFند تFا کFل شFرط

فقFط زمFاني نتيجFه orصFحت داشFته باشFد و در عملگFر

صFحت نFدارد کFه هFر دو عملونFد آن صFحت orعملگFر

نداشته باشد.

Page 162: اصول اساسی برنامه نويسی به زبان اسمبلی

گاهي اوقFات پFردازش يFک حلقFه تFا زمFاني کFه بFا مقFادير

نرمFال برخFورد شFود، بايFد ادامFه پيFدا کنFد و وقFتي بFا مقFدار

خاصي برخورد مي شود، متوقف مي گردد.

يک مFزيت زبFان اسFمبلي آن اسFت کFه قFابليت انعطFاف

بيشتري در برنامه نويسي وجود دارد.

Page 163: اصول اساسی برنامه نويسی به زبان اسمبلی

طرح زيFر مي توانFد بFراي گFرفتن داده هFا از صFفحه کليFد بFه کFار

رود:

While واردشده از صفحه کليد برابر مقدار موردنظر نيست)

value) loop

[بدنه حلقه] . . .

End While;

Page 164: اصول اساسی برنامه نويسی به زبان اسمبلی

چنانچFFه کFFاراکتر اسFFکي بFFه عFFدد منفي atoiدر مFFاکروي

يFFک مي شFFود و در غFFير (SF)تبFFديل شFFود فلFFگ عالمت

اينصورت صفر مي گردد.

، حلقه اي کFه بFه وسFيله يFک شFمارنده کنFترل forبدنFه حلقFه

مي شFود، بFراي هFر مقFدار شFاخص حلقFه در يFک محFدوده

معين يکبار تکرار مي شود.

for oبراي حلقه اي در زبFان اسFمبلي، شFاخص هاي معمFوال

اعدا صحيح هستند.

Page 165: اصول اساسی برنامه نويسی به زبان اسمبلی

براي مFواردي مطلوبسFت کFه تعFداد دفعFات تکFرار از قبFل

معلوم باشد.

For مقدار ابتدايي: = شاخص to مقدار انتهايي loop

{بدنه حلقه} . . .

End for:

ترجمFه while بFه راحFتي مي توانFد بFه سFاختار forبک حلقFه

گردد.

Page 166: اصول اساسی برنامه نويسی به زبان اسمبلی

مي تواند به صورت زير بيان شود:untilيک حلقه

until شرط خاتمه loop

{بدنه حلقه} . . .

End until;

بدنFه حلقFه حFداقل يکبFار اجFرا شFده و سFپس شFرط خاتمFه

بررسFي مي شFود. اگFر شFرط خاتمFه برقFرار نباشFد بدنFه

حلقFFه دوبFFاره اجFFرا مي شFFود و اگFFر برقFFرار باشFFد، اجFFرا

ادامه پيدا مي کند.end untilبرنامه از دستورات بعد از

Page 167: اصول اساسی برنامه نويسی به زبان اسمبلی

ساختارهاي حلقه اي ديگFر نFيز مي تواننFد بFه زبFان اسFمبلي

اغلب مفيFد اسFت و در forever گردنFد. حلقFه يپياده سFاز

هFر جFايي کFه بFه کFار رود، هميشFه داراي يFک جملFه خFروج

بFراي انتقFال کنFترل بFه انتهFاي حلقFه مي باشFد، اين جملFه

. ifاغلب شرطي است مثل يک دستورالعمل

Page 168: اصول اساسی برنامه نويسی به زبان اسمبلی

Forever loop

.

.

if (respons='s') or (response = 's')

then

exit loop

endif;

.

end loop;

Page 169: اصول اساسی برنامه نويسی به زبان اسمبلی

در زبان اسمبلي: forحلقه هاي

داراي شکل زير مي باشد:loopدستورالعمل

Loop statement_label

، برچسFب دسFتورالعملي اسFت statement_labelدر اين دسFتور

است.loopکه داراي يک جابجايي کوتاه نسبت به دستور

باعث مي شود که اعمال زير صورت پذيرند:loop دستور مقدار ثباتCX.کاهش پيدا مي کند

اتFFدار ثبFFر مقFFاگCX د ازFFتور بعFFرا از اولين دسFFاه اجFFد، آنگFFفر باشFFص

ادامه پيدا مي کند.loopدستورالعمل

اتFدار ثبFر مقFاگCX هFي کFه آدرسFرش بFاه پFد، آنگFفر نباشFص statement_label

مشخص مي کند، صورت مي گيرد.

Page 170: اصول اساسی برنامه نويسی به زبان اسمبلی

بFه دو بFايت کFد هFدف نيFاز دارد، بFايت اول، loopدسFتورالعمل

بFFايت کFFد عمFFل اسFFت و دومين بFFايت مقFFدار جابجFFايي بFFه

دستورالعمل مقصد مي باشد.

وضعيت هيچ فلگي را تغيير نخواهد داد.Loopدستور

CXدراين دسFتورالعمل ها هيچ ثبFات ديگFري نمي توانFد بFه جFاي

بFFه کFFار بFFرود. در عمFFل اين بFFه آن معFFني اسFFت کFFه وقFFتي

نمي توانFد بFه CX بFه کFار مي رود، ثبFات LOOPدسFتورالعمل

منظورهاي ديگر به کار برده شود.

Page 171: اصول اساسی برنامه نويسی به زبان اسمبلی

بFه اين منظFور بFه کFار JCXZدسFتورالعمل پFرش شFرطي

صFفر باشFد بFه مقصFدي CXمي رود کFه اگFر محتFواي ثبFات

که براي آن تعيين مي کند پرش کند.

اين دسFتور هماننFد دسFتورالعمل هاي پرشFي ديگFر بFه دو

بFFايت کFFد هFFدف نيFFاز دارد و بFFر روي فلگ هFFا هيچ اثFFري

نمي گذارد.

Page 172: اصول اساسی برنامه نويسی به زبان اسمبلی

را يFک يFا (ZF) فلFگ صFفر decاز آنجFايي کFه دسFتورالعمل

صFFفر مي کنFFد، دسFFتورالعمل پFFرش شFFرطي زيFFر کFFه کمي

بFه JCXZسFريعتر مي باشFد، مي توانFد بFه جFاي دسFتورالعمل

کار برود.

Page 173: اصول اساسی برنامه نويسی به زبان اسمبلی

Jz end_for

از forاغلب راحت تFر اسFت کFه بFراي پياده سFازي يFک حلقFه

اسFتفاده شFود حFتي زمFاني کFه شFاخص loopدسFتورالعمل

حلقFFه افFFزايش پيFFدا مي کنFFد و بايFFد در بدنFFه حلقFFه مFFورد

بFراي CXازثبFات loopاسFتفاده قFرار گFيرد. دسFتورالعمل

کنترل تعداد تکرارهاي استفاده مي کند.

Loopz statement_label

شFد و فلFگ صFفر، ا صFفر بCXچنانچFه مقFدار جديFدي در ثبFات

بFه دسFتورالعملي کFه در loopzيFک باشFد، دسFتورالعمل

statement_label.قرار دارد، پرش مي کند

Page 174: اصول اساسی برنامه نويسی به زبان اسمبلی

Loopnz statement_label

صFفر نباشFد و فلFگ صFفر CXچنانچFه مقFدار جديFد در ثبFات

بFه دسFتورالعملي کFه loopnzبرابFر صFفر باشFد، دسFتورالعمل

قرار دارد، پرش مي کند.statement_lableدر

بFر loonz و loopz، دسFتورالعمل هاي loopهماننFد دسFتورالعمل

روي هيچ فلگي اثر نمي گذارند.

Page 175: اصول اساسی برنامه نويسی به زبان اسمبلی

آرايه ها

Lea destination,source

يعني »آدرس مؤثر را بار کن« مي باشد.leaنام

Destination وميFات عمFک ثبFد يFوده و 16 بايFتي بFبي source

هرگونه رجوعي به حافظه است.

در ثبات بار مي شود.sourceآدرس

Page 176: اصول اساسی برنامه نويسی به زبان اسمبلی

قFابليت انعطFاف بيشFتري mov نسFبت بFه leaدسFتورالعمل

اختيار مي گذارد. را با توجه به نوع عملوند منبع در

با اسFFتفاده از آدرس دهي غيرمسFFتقيم ثبFFات مي تFFوان بFFه

صورت تصادفي دسترسي پيدا نمود.

Page 177: اصول اساسی برنامه نويسی به زبان اسمبلی

بFه تFرتيب زيFر را بFه مجمFوع اضFافه کن« مي توانFدarray [count]به طFور مثFال، عبFارت

بعنFوان AX بFه عنFوان شFمارنده و ثبFات CXپياده سFازي شFود، البتFه بFا اين فFرض کFه ثبFات

مجموع به کار برود:

Mov dx,cx ;count

Dec dx ;count-1

Add dx,dx ;2*(count-1)

Lea bx,nbr_array ;starting address of array

Add bx,dx ;address of nbr_array [count]

Add ax,,[bx] ;add array [count] to sumتکنيFک بFه کFار رفتFه در اينجFا آن اسFت کFه تعFداد بايت هFاي قبFل از عنصFر مFوردنظر را جمFع

کرده و اين عدد را به آدرس شروع آرايه اضافه کرد.

Page 178: اصول اساسی برنامه نويسی به زبان اسمبلی

پرشهاي غير شرطي

JMPدستور در بیسیک و GOTO این دستور مانند دستور

پاسکال استJMP statement_label

Statement_label اشاره به برچسب دستوری دارد که قرار است پرش به آن صورت گیرد

Page 179: اصول اساسی برنامه نويسی به زبان اسمبلی

پرشهاي غير شرطي مثال

;Jmp quit پرش به اولین دستورالعمل خروج

. : Quitبازگشت مقدار صفر در رجیستر

mov al ,0;

Page 180: اصول اساسی برنامه نويسی به زبان اسمبلی

انواع پرش مستقیم

نسبی درون سگمنتکوتاه نسبی درون سگمنتیغیر مستقیم درون سگمنتیمستقیم بین سگمنتیغیر مستقیم بین سگمنتی

Page 181: اصول اساسی برنامه نويسی به زبان اسمبلی

if پرشهاي شرطي دستوراتمقايسه و ساختارهاي

برای شبیه سازی دستورif در زبان اسمبلی انواع پرش وجود دارد

حالت کلی دستور به شکل زیر است

که jبه جز یک استثنا در بقیه موارد عبارت پس از معموال به نتیجه ثبت شده در فالگها اشاره میکند

تعیین شرط پرش مینماید

J --- TARGET _ STATEMENT

Page 182: اصول اساسی برنامه نويسی به زبان اسمبلی

نمونه های پرش شرطی

Jz پرش در صورت صفربودن

Jnz پرش در صورت صفر نبودن Js پرش در صورت منفی

بودن Jns پرش در صورت مثبت بودن

Page 183: اصول اساسی برنامه نويسی به زبان اسمبلی

دستور مقایسه

جهت مقایسه دو مقدار استفاده CMPدستور میشود

برای تغییر حالت فالگها که منجر به دستور پرش خواهد شد میباید عبارت شرط را با این دستور

ارزیابی کنیمشکل کلی دستور به صورت زیر است

Cmp operand_1 , operand_2

Page 184: اصول اساسی برنامه نويسی به زبان اسمبلی

, for , until پياده سازي حلقه هايwhile

برای پیاده سازی حلقه ها در اسمبلی مانند استفاده میشود… j و cmp از ifدستور

در حالت کلی عبارت مقایسه در ابتدا و عبارتپرش در انتهای کد ظاهر میشود

در حلقهfor عالوه بر این اندیس حلقه در افزایش یا dec یا incیک رجیستر با دستور

کاهش می یابد

Page 185: اصول اساسی برنامه نويسی به زبان اسمبلی

for حلقه های

حلقه هایfor در زبان اسمبلی با شبیه سازی حلقه while بوجود می آید

ابتدای شروع حلقه اندیس حلقه مقدار دهی شده دستور مقایسه در ابتدای حلقه اندیس را با مقدار

انتهایی مقایسه و درصورت رسیدن به مقدار نهایی به دستورالعما انتهایی پرش میکند

در داخل حلقه اندیس افزایش یا کاهش می یابدیک پرش غیر شرطی به ابتدای حلقه

Page 186: اصول اساسی برنامه نويسی به زبان اسمبلی

آرايه ها

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

SI , DI , BP

در برنامه dupذخیره سازی آرایه ها با دستور در سگمنت داده DWاسمبلر و با دستور

صورت میگیرد

Page 187: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل ششم

روال ها

Page 188: اصول اساسی برنامه نويسی به زبان اسمبلی

مطالب اين فصل

بدنه يك روال دستورالعملهاي call , return دستورالعملهايpush , popانتقال مقادير به يك روال و بالعكس( بازگشت پذيريrecursion)

Page 189: اصول اساسی برنامه نويسی به زبان اسمبلی

روال ها

زبFFان پاسFFکال و سFFاير زبانهFFاي برنامه نويسFFي کلمFFه روال در

o يFک واحFد کFاملي سFطح بFاال بFراي بيFان زيFر برنFامه اي کFه تقريبFا

مي باشد، بکار مي رود.

Page 190: اصول اساسی برنامه نويسی به زبان اسمبلی

آرگومانهFFا بايسFFتي متنFFاظر بFFا پارامترهFFاي مجFFازي روال مزبFFور

باشFند. در زبFان پاسFکال نFوع ديگFري از زيFر برنFامه بFه نFام تFابع

وجFود دارد. يFک تFابع در زبFان پاسFکال شFبيه يFک روال مي باشFد بجFز

اينکFه آن را در داخFل يFک عبFارتي بFا ذکFر نFام و آرگومانهFاي مربوطFه

تFابع مقFداري را بFر در داخFل پرانFتز، فراخFواني مي کFنيم. يFک

مي گردانFد کFه اين مقFدار در عبFارت مربوطFه مFورد اسFتفاده قFرار

مي گيرد.

Page 191: اصول اساسی برنامه نويسی به زبان اسمبلی

آدرس برگشFFت بFFه برنامFFه فراخواننFFده زيFFر برنامFFه روي پشFFته

ذخFيره مي شFود مي تFوان مقFادير ثبات هFا در زمFان فراخFواني يFک

زمFان برگشFت بFه در زيربرنامFه را روي پشFته ذخFيره نمFوده و

پشFFته ثبات هFFا را بFFا اسFFتفاده از برنامFFه فراخواننFFده مقFFادير

بازسFازي نمFود، بFا اسFتفاده از پشFته مي تFوان آرگومانهFا را بFه يFک

يFFک زيربرنامFFه يFFا مقFFاديري را از انتقFFال داده و زيربرنامFFه

حFFتي مي تFFوان فضFFاي الزم بFFراي فراخواننFFده انتقFFال داد، و

متغيرهاي محلي را روي پشته تخصيص داد.

Page 192: اصول اساسی برنامه نويسی به زبان اسمبلی

RETURN و CALLبدنه يک روال؛ دستورالعمل هاي

قFFرار ENDR و PROCبدنFFه يFFک رواي در داخFFل دسFFتورات

مي گFيرد و هFر کFدام از دسFتور العملهFا داراي بFر چسFبي اسFت

PROCکFه برابFر نFام روال مزبFور مي باشFد. بعالوه، دسFتور

مي باشFد. يFک روال FARيFا NEARشFامل يکي از عملونFدهاي

NEAR فFود تعريFواني مي شFه فراخFدي کFگمنت کFان سFدر هم

o در يFک سFگمنت کFد مجFزايي FARيFک روال مي گFردد، و معمFوال

تعريف مي شود.

Page 193: اصول اساسی برنامه نويسی به زبان اسمبلی

o از اولين دسFتورالعمل سFگمنت کFد اجFراي يFک برنامFه لزومFا

شFروع نمي شFود، بلکFه از دسFتورالعمل مشFخص شFده توسFط

کFه پايFان برنامFه را نشFان مي دهFد، شFروع ENDعملونFد دسFتور

مي شود.

بطور کلي، يک روال را مي توان هر چند بار فراخواني کرد.

دسFتور العمل برگشFت کنFترل اجFرا را از روال بFه برنامFه اصFلي

o حFداقل يFک دسFتورالعمل در يFک روال retبرمي گردانFد؛ معمFوال

retوجFود دارد کFه البتFه مي توانFد بيش از يFک دسFتورالعمل

وجود داشته باشد.

Page 194: اصول اساسی برنامه نويسی به زبان اسمبلی

زمFاني کFه پشFته بFراي ذخFيره کFردن مقFاديري بکFار مي رود، يFک

يFFا چنFFد کلمFFه ذخFFيره مي شFFود، هرگFز يFFک بFايت تکي ذخFFيره

2 بانFدازه SPنمي شFود. بFراي ذخFيره کFردن يFک کلمFه، ثبFات

واحد )بايت( کاهش مي يابد.

Page 195: اصول اساسی برنامه نويسی به زبان اسمبلی

****

يک کلمه روي پشته ذخيره شده

وضعيت اوليه پشته

SP

SS

SP

SS

Page 196: اصول اساسی برنامه نويسی به زبان اسمبلی

توجFه داشFته باشFيد کFه بFا ذخFيره شFدن کلمFات روي پشFته،

تغيFير پيFدا SP تغيFير نکFرده بلکFه تنهFا ثFابت SSمقFدار ثFابت

مي کند.

مي شFFود اجFFراCallزمFFاني کFFه دسFFتورالعمل ، افسFFت

را روي پشFته ذخFيره مي کنFد. سFپس callدسFتورالعمل بعFد از

و اجFراي برنامFه از برابFر افسFت روال قFرار داد شFدهIPثبFات

يعFني اولين دسFتورالعمل CS:IPدسFتورالعمل واقFع در آدرس

روال مزبFور ادامFه مي يابFد. بFا توجFه بFه اينکFه برنامFه اصFلي و

روال مزبFور در داخFل يFک سFگمنت قFرار دارنFد، نيFازي بFه تغيFير

وجود ندارد. CSشماره سگمنت واقع در ثبات

Page 197: اصول اساسی برنامه نويسی به زبان اسمبلی

اجFرا مي شFود، کلمFه واقFع در retزمFاني کFه دسFتور العمFل

ذخFيره مي گFردد. سFپس IPبFاالي پشFته بازيFابي شFده و در ثبFات

يعFني از IP:CSاجFراي برنامFه از دسFتورالعمل واقFع در آدرس

در برنامFه اصFلي ادامFه پيFدا مي کنFد. callدسFتورالعمل بعFد از

اين نFوع فراخFواني يFا برگشFت را فراخFواني يFا برگشFت درون

يک سگمنت گويند.

Page 198: اصول اساسی برنامه نويسی به زبان اسمبلی

CS( يFک دسFتوالعمل فراخFواني ابتFدا محتFواي ثبFات farفرم دور)

را روي پشFته ذخFيره کFرده و شFماره سFگمنت حFاوي روال مFورد

قFرار مي دهFد. سFپس افسFت دسFتورالعمل CSنظFر را داخFل ثبFات

بعFFدي را روي پشFFته ذخFFيره کFFرده و افسFFت روال مزبFFور )در

IP oداخFل سFگمنت کFد جديFد( را در ثبFات قFرار مي دهFد. جمعFا

چهFار بFايت ناحيFه پشFته مFورد اسFتفاده قFرار مي گFيرد. فFرم دور

عکس اين مراحFل را انجFام مي دهFد، ابتFدا retدسFتورالعمل يFک

را برابFر افسFت دسFتورالعمل بعFد از فراخFواني اوليFه IPثبFات

را برابFر شFماره سFگمنت برنFام CSقFرار داده و سFپس ثبFات

فراخواننFFده قFFرار مي دهFFد؛ اين دو کلمFFه از داخFFل پشFFته کFFپي

مي شوند.

Page 199: اصول اساسی برنامه نويسی به زبان اسمبلی

Call procedure

o برابFFر نFFام روال مFFورد نظFFر procedureعملونFFد معمFFوال

مي باشFد، ولي مي توانFد بFا اسFتفاده از آدرسFي در داخFل يFک

ثبات يا در حافظه بطور غير مستقيم بکار رود.

Page 200: اصول اساسی برنامه نويسی به زبان اسمبلی

داراي دو فFFرم مختلFFف اسFFت. فFFرم retدسFFتور العمFFل

معمول تر آن بدون عملوند بوده و بصورت زير است:

Ret(1

کFFه کمFFتر معمFFول مي باشFFد retفرم ديگFFر دسFFتورالعمل

بصورت زير است

Ret pop –value (2

پس از اتمFام سFاير مراحFل فرآينFد pop –valueعملونFد

و در مFFورد يFFک روال دور، IPبرگشFFت )بازسFFازي ثبFFات

افFزوده SP( بFه محتFواي ثبFات CSبازسFازي مقFدار ثبFات

مي شود.

Page 201: اصول اساسی برنامه نويسی به زبان اسمبلی

از اين فFرم مي تFوان در مFواردي کFه کلمFاتي )بعضFي مواقFع

مقFادير پارامترهFا( روي پشFته ذخFيره شFده و مي خFواهيم آنهFا را

در زمFان خFروج از روال بطFور منطقي حFذف کFنيم، اسFتفاده

کرد.(

o براي سFاختن بلوکهFاي تشFکيل دهنFده برنامه هFاي بFزرگ معمFوال

يک روال يا گروهي از روال ها را بطور مجزا اسمبل مي کنيم.

Page 202: اصول اساسی برنامه نويسی به زبان اسمبلی

دستور

PUBLIC Procedurel,Procedure2

و procedure1به اسFمبلر و لينکFر مي گويFد کFه برچسFب هاي

procedure2 ورFه طFه بFايي کFيله برنامه هFه وسFت بFممکن اس

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

Page 203: اصول اساسی برنامه نويسی به زبان اسمبلی

برنFFامه اي کFFه اين روال هFFا را فراخFFواني مي کنFFد بايسFFتي

باشFد کFه بFه اسFمبلر EXTRNشFامل يFک يFا چنFد دسFتور

Procedurel2 و ProcedurelبگويFFFد کFFFه برچسFFFب هاي

بوده و بطور محلي تعريف نشده اند. (exretnal)خارجي

Page 204: اصول اساسی برنامه نويسی به زبان اسمبلی

o دسFتورات در ابتFداي برنامFه مربوطFه ذکFر EXTRNمعمFوال

EXTRNمي شFوند. بFا اسFتفاده از يFک دسFتور، فFرم دسFتور

بصورت زير است:

EXTRN Procedure 1:FAR, procedure 2:FAR

فرض کنيFد کFه فايل هFاي اسFتفاده شFده بFراي برنامFه اصFلي و

باشند. PROCS.ASM و ASM.MAINروال ها به ترتيب

Page 205: اصول اساسی برنامه نويسی به زبان اسمبلی

براي ساختن يک برنامه قابل اجرا مراحل زير الزم مي باشد :

را اسFمبل کنيFد PROCS و MAIN فايلهFاي MASMبا اسFتفاده از

OBJ)هFر کFدام را بخواهيFد اول اسFمبل کنيFد( بFاين تFرتيب دو فايFل

ساخته مي شوند. PROCS.OBJ و OBJ. MAIN. بنامهاي

برنامFFFه اصFFFلي و روال هFFFا را بFFFا ذکFFFر LINKبا اسFFFتفاده از

"main+procs+io"وFFده ون ماژا بعنFFديگر پيونFFه يکFFدف بFFاي هFFله

. مFورد نظFر را بFا کFاراکتر »+«OBJدهيFد )بطFور کلي واحFدهاي

تنهFا زمFاني مFورد نيFاز مي باشFد کFه از io از يکFديگر جFدا کFنيم. واحFد

o نFام LINK اسFتفاده کFرده باشFيد.( IO.HماکروهFاي فايFل معمFوال

قFFرار مي دهFFد؛ OBJ را برابFFر نFFام اولين واحFFد EXEبرنامFFه

. را به هر ترتيبي ذکر کنيد. OBJمي توانيد نام واحدهاي

Page 206: اصول اساسی برنامه نويسی به زبان اسمبلی

. بFFه EXEبدنبال اين مراحFFل، مي توانيFFد بFFا دادن نFFام فايFFل

آن را اجرا کنيد.DOSسيستم عامل

بوسFيله دسFتورالعملهاي DXو AX، BX، CXثباتهFاي همگFاني

call و ret خصFFائف مشFFه داراي وظFFرده و نFFدا نکFFير پيFFتغي

ديگFFري مي باشFFند، از اين رو مي تFFوانيم از اين ثباتهFFا بFFراي

انتقFال مقFادير بانFدازه کلمFه بFه روال هFا و بFالعکس، اسFتفاده

کنيم.

Page 207: اصول اساسی برنامه نويسی به زبان اسمبلی

؛ داده هاي محليPOP و PUSHدستورالعمل هاي

بFFراي ذخFFيره کFFردن داده هFFاي روي pushدسFFتورالعمل هاي

بFFراي بازيFFابي آنهFFا از پشFFته popپشFFته و دسFFتورالعمل هاي

صورت مي گيرد.

بمنظFور ذخFيره کFردن محتFواي يFک ثبFات يFا کلمFه حافظFه اصFلي،

o بعFد از شFروع اجFراي يFک روال روي مقFدار مFورد نظFر معمFوال

پشFته ذخFيره شFده و قبFل از اجFراي دسFتور العمFل برگشFت از

روال آن را روي پشته بازيابي مي کنيم.

Page 208: اصول اساسی برنامه نويسی به زبان اسمبلی

Push Source

مي توانFد هFر ثبFاتي بجFز ثبFات نشFانه ها و SourceعملونFد

بFوده و يFا مي توانFد IPثبFات اشFاره گر دسFتورالعملها يعFني

کلمه اي در حافظFFFه اصFFFلي را ارجFFFاع دهFFFد. يFFFک عملونFFFد

pop و pushبالواسFFطه مجFFاز نمي باشFFد. دسFFتورالعملهاي

هيچکدام ثبات نشانه ها را تغيير نمي دهند.

Page 209: اصول اساسی برنامه نويسی به زبان اسمبلی

o ماننFد دسFتور العمFل pushدسFتورالعمل Call از پشFته دقيقFا

بانFدازه دو بFايت کFاهش SPاسFتفاده مي کنFد. اشFاره گر پشFته

داده شFده بوسFيله عملونFد منبFع در س يافتFه و سFپس کلمFه آدر

ذخFيره مي شFود. البتFه، اجFراي برنامFه SS:SPدو بFايت بFا آدرس

، CallبجFاي اولين دسFتورالعمل روال مربFوط در دسFتورالعمل

با دستور العمل بعدي ادامه پيدا مي کند.

Page 210: اصول اساسی برنامه نويسی به زبان اسمبلی

POP destination

مي توانFدکلمه اي در حافظFه اصFلي را ارجFاع destinationکه

داده و يFFا مي توانFFد هFFر ثبFFاتي بجFFز ثبFFات نشFFانه ها و ثبFFات

باشد. CS و ثبات سگمنت کد IPاشاره گر دستور العملها

o بصورت زوج استفاده POP و Pushاز دستورالعملهاي معموال

مي شود.

Page 211: اصول اساسی برنامه نويسی به زبان اسمبلی

بيت 16 )ذخFFFيره کFFFردن نشFFFانه ها( PushfدسFFFتورالعمل

نشFانه ها را )حFتي آنهFائي را کFه معFني خاصFي بعنFوان نشFانه

popfندارنFFد( روي پشFFته ذخFFيره کFFرده و دسFFتورالعمل

)بازيابي نشانه ها( نشانه ها را از روي پشته بازيابي مي کند.

Page 212: اصول اساسی برنامه نويسی به زبان اسمبلی

o نيFاز بFه دسFتيابي داده هFاي ذخFيره شFده در روالهFاي پيچيFده غالبFا

در حافظه اصلي وجود دارد.

يک روش از يFک سFگمنت داده مجFزا اسFتفاده مي کنFد، و روش

در همان سگمنت کد روال ذخيره مي کند. ديگر داده هاي را

Page 213: اصول اساسی برنامه نويسی به زبان اسمبلی

دستور

ASSUME CS: proc_code,ds: poc_data

در زمFان اجFراي CSبه اسFمبلر مي گويFد فFرض کنFد کFه ثبFات

اشFاره کFرده و proc-codeدسFتورالعملهاي بعFدي بFه سFگمنت

اشاره خوهد کرد.proc-data به سگمنت DSثبات

-procبکمک اين دستور، اسمبلر افست هاي متغيرها در داخل

data تورالعملها درFFت هاي دسFFگمنت و افسFFرا از اول اين س

را از اول اين سگمنت محاسبه خواهد کرد. proc-codeداخل

Page 214: اصول اساسی برنامه نويسی به زبان اسمبلی

در فراخFFواني يFFک روال، يFFک مقFFدار جديFFد بعنFFوان نتيجFFه

قFرار DS بطFور اتوماتيFک در داخFل ثبFات callدسFتورالعمل

نمي گFيرد. اين وظيفFه برنFامه نويس اسFت کFه محتFواي ثبFات

DS اتFFرده، ثبFFيره کFFد را ذخFFه فراخواننFFه برنامFFوط بFFمرب

سFگمنت داده جديFد را بFار کFرده و قبFل از بازگشFته بFه برنامFه

را بازسازي کند.DSفراخواننده، مقدار اوليه ثبات

Page 215: اصول اساسی برنامه نويسی به زبان اسمبلی

:انتقال مقادير به يک روال و بالعکس

دو روش ممکن بFراي انتقFال يFک مقFدار بانFدازه کلمFه

عبارتند از:

قرار دادن مقدار مورد نظر در يک ثبات •

قرار دادن مقدار مورد نظر روي پشته •

Page 216: اصول اساسی برنامه نويسی به زبان اسمبلی

در آدرس دهي مبنFا، افسFت يFک محFل حافظFه بصFورت مجمFوع

( و عFددي کFه در داخFل BX يFا BPمحتFواي يFک ثبFات مبنFا )ثبFات

دستورالعمل قرار دارد، محاسبه مي شود.

Page 217: اصول اساسی برنامه نويسی به زبان اسمبلی

نشان گذاري براي آدرس دهي مبنا:

[bp+number]

و از نشان گذاريBPبراي ثبات

[bx+number]

اسFتفاده شFود، در BP اسFتفاده مي کنFد. اگFر ثبFات BXبFراي ثبFات

اين صFFورت افسFFت در سFFگمنت پشFFته قFFرار دارد؛ يعFFني آدرس

:[BP+number]حقيقي برابFر SS رFر، اگFرف ديگFد از طFمي باش

اسFتفاده شFود، در اين صFورت افسFت در سFگمنت داده هFا BX ثبFات

:[BP+number]قFFFرار دارد؛ يعFFFني آدرس حقيقي برابFFFر DS

مي باشد.

Page 218: اصول اساسی برنامه نويسی به زبان اسمبلی

o مي خFواهيم پس از برگشFت بFه برنامFه فراخواننFده مقFدار غالبFا

بايسFتي در BP تغيFير پيFدا نکنFد، در اين صFورت مقFدار BPثبFات

، BP بFداخل ثبFات SPاول روال و قبFل از کFپي کFردن مقFدار ثبFات

بFر روي پشFته اضFافه گFردد. بايFد تFرتيب هFر کFدام از آرگومانهFا

بFا فFرض اينکFه دورتFر باشFند. SS:BPبانFدازه دو بFايت نسFبت بFه

تعريFف شFده باشFد، در اين صFورت FARروال مزبFور بصFورت

( و آرگومFFان اولي در افسFFت BP+6آرگومFFان دوم در افسFFت )

(BP+8 دFيره کنيFري را ذخFاي ديگFد ثباتهFر بخواهيFود. اگFد بFخواه )

BP بFداخل SPمي توانيFد اين کFار را بعFد از کFپي کFردن ثبFات

انجام دهيد.

Page 219: اصول اساسی برنامه نويسی به زبان اسمبلی

نقطFه قFوت اين سيسFتم اين اسFت کFه پس از ثFابت نگهداشFتن ثبFات

BP رد وFتفاده کFوري اسFر منظFراي هFور آزاد بFته را بطFد پشFمي توان ،

در حFالي کFه مي تFوان بFا اسFتفاده از را تغيFير داد،SPدر نتيجFه ثبFات

ي کرد.اب آرگومانها را دستيBPثبات

Page 220: اصول اساسی برنامه نويسی به زبان اسمبلی

اگFر برنFامه اي بFه اضFافه کFردن آرگومان هFا روي پشFته و فراخFواني

روالهFFا ادامFFه دهFFد، در اين صFFورت برنامFFه اصFFلي و يFFا روالهFFاي

مربوطFه بايسFتي اين مقFادير را از پشFته حFذف کننFد کFه در غFير اين

صFورت ممکن اسFت پشFته سFر زيFر نمايFد. برنFام اصFلي مي توانFد

اين کFار را انجFام دهFد کFه تعFداد بايتهFائي را کFه بايسFتي آزاد شFوند

اضافه کند.SPبه ثبات

اگFر از پشFته بFراي برگردانFدن يFک يFا چنFد مقFدار بFه برنامFه اصFلي

اسFتفاده شFود، هيچکFدام از اين تکنيکهFا بFدون تغيFير کFار نخواهFد

کرد.

Page 221: اصول اساسی برنامه نويسی به زبان اسمبلی

(Recursion)بازگشت پذيري

يک روال يFا تFابع بازگشFتي روال يFا تFابعي اسFت کFه بطFور

مسFتقيم يFا غFير مسFتقيم خFودش را فراخFواني نمايFد. بهFترين

الگوريتم هFا بFراي پFردازش بسFياري از سFاختارهاي اطالعFاتي

بصورت بازگشتي مي باشند.

Page 222: اصول اساسی برنامه نويسی به زبان اسمبلی

اگFر پارامترهFا روي پشFته انتقFال يابنFد، در اين صFورت بFراي

هFر فراخFواني روال مزبFور فضFاي جديFدي بFراي پارامترهFاي

آن تخصFيص داده مي شFود بطFوري کFه آرگومانهFاي انتقFالي بFه

يFک فراخFواني روال بFا آرگومانهFاي انتقFالي بFه فراخFواني ديگFر

آن روال اشFتباه نمي شFوند بFه همين تFرتيب، اگFر مقFادير پشFته

ذخFيره مي شFوند، در اين صFورت مي تFوان از همFان ثبات هFا و

يFا حFتي مکانهFاي حافظFه در هFر فراخFواني بازگشFتي يFک روال

استفاده نمود.

Page 223: اصول اساسی برنامه نويسی به زبان اسمبلی

, call بدنه يك روال دستورالعملهايreturn

دستورcallباعث فراخوانی یک روال میگردد در این حالت آدرس برنامه جاری درstack

دخیره میگردد پس از پایان روال و با اجرای دستورret مقدار

بازیابی شده و ادامه stack از PCقبلی برنامه از سر گرفته میشود

Page 224: اصول اساسی برنامه نويسی به زبان اسمبلی

push , pop دستورالعملهاي

بسیار محتمل است مقادیر رجیسترها در داخل یکروال تغییر کند لذا ذخیره ساری مقادیر اولیه ضروری

است برای ذخیره سازی مقادیر رجیسترها از دستورpush

استفاده میشود که این دستور باید در ابتدای روال قرار گیرد

برای بازگشت مقادی اولیه به رجیسترها از دستورpop استفاده میشود .این دستورات میباید آخرین دستورات

یک روال باشند

Page 225: اصول اساسی برنامه نويسی به زبان اسمبلی

انتقال مقادير به يك روال و بالعكس

برا یانتقال مقادیر به روال و بر عکس دو روش وجوددارد

1 استفاده از پشته : که در این حالت مقادیر ارسالی – به پشته فرستاده و در pushرا با استفاده از دستور

آنرا فراخوانی میکنیمpopداخل روال با دستور 2 استفاده از سگمنت داده ای : در این حالت آدرس –

خاصی از سگمنت را برای انتقال پارامترها در نظر میگیریم و در داخل روال نیز داده ها را از آدرس فوق

بازیابی میکنیم

Page 226: اصول اساسی برنامه نويسی به زبان اسمبلی

(recursion) بازگشت پذيري

یک برنامهrecursive برنامه ای است که خود را فراخوانی میکند

پیاده سازی یک برنامه خودفراخوان یا بازگشتپذیر در اسمبلی به راحتی نوشتن هر برنامه دیگر

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

در pcاست زیرا در هر فراخوانی یکبار مقدار پشته ذخیره میگردد

Page 227: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل هفتم

عمليات رشته ها

Page 228: اصول اساسی برنامه نويسی به زبان اسمبلی

مطالب اين فصل

استفاده از دستورالعملهاي رشته اي پيشوندهاي تكرار و بقيه دستورالعملهاي رشته

ايترجمه كاراكترها به يك رشته اسكي2تبديل يك عدد مكمل

Page 229: اصول اساسی برنامه نويسی به زبان اسمبلی

استفاده از دستورالعمل هاي رشته اي

پنج دسFتورالعمل وجFود دارد کFه بFراي عمليFات بFر روي رشFته ها

طراحي شده اند:

.1Movs هFه بFوقعيت حافظFک مFته از يFک رشFپي کردن يFراي کFب :

موقعيت ديگر

.2Cmpsبراي مقايسه محتويات دو رشته :

.3Scas.مي توان در يک رشته به دنبال يک مقدار معين گشت :

.4Stos کFد در يFدار جديFک مقFردن يFيره کFراي ذخFد بFمي توان :

رشته به کار برود.

.5Lods.يک مقدار را از يک رشته به دست مي آورد :

Page 230: اصول اساسی برنامه نويسی به زبان اسمبلی

رشFته بFه مجمFوعه اي متFوالي از بايت هFا يFا کلمFات در حافظFه

اشاره مي کند.

o در يFک برنامFه رشFته ها بFه وسFيله دسFتورات اسFمبلر زيFر معمFوال

در سگمنت داده تعريف مي شوند:

Response DB 80 Dup(?)

Label_1 DB 'the results are',0

Word_string DW 50 Dup (?)

هر دسFFتورالعمل رشFFته اي روي يFFک رشFFته منبFFع، يFFک رشFFته

مقصد يا هر دو عمل مي کند.

Page 231: اصول اساسی برنامه نويسی به زبان اسمبلی

براي مشFFخص کFFردن هFFر بFFايت يFFا هFFر کلمFFه از روش

آدرس دهي غيرمسFFFتقيم ثبFFFات اسFFFتفاده مي گFFFردد. اين

دسFتورالعمل ها بFراي دسFتيابي عناصFر رشFته مبFدأ از آفسFتي

قFرار دارد و بFراي دسFتيابي عناصFر رشFته SIکFه در ثبFات

قFFرار دارد، اسFFتفاده DIمقصFFد از آفسFFتي کFFه در ثبFFات

مي کننFد. عنصFر مبFدأ در سFگمنت داده قFرار دارد بنFابراين

مي باشFد. عنصFر مقصFد DS:SIآدرس واقعي آن عبFارت از

در سFگمنت فوق العFاده قFرار دارد، بنFابراين آدرس واقعي آن

مي باشد.ES:DIعبارت از

Page 232: اصول اساسی برنامه نويسی به زبان اسمبلی

از آنجFFايي کFFه آدرس هFFاي عناصFFر رشFFته اي مبFFدأ و مقصFFد

قFرار دارنFد، بFراي مشFخص کFردن DI و SIهميشFه در ثبات هFاي

اين آدرس هFا بFه هيچ عملونFدي نيFاز نمي باشFد. در اين صFورت

اسFمبلر انFدازه عناصFري را کFه بايFد مFورد اسFتفاده قFرار بگيرنFد

نمي داند.

Page 233: اصول اساسی برنامه نويسی به زبان اسمبلی

ماکرو اسFمبلر شFرکت مايکروسFافت بFراي حFل اين مشFکل دو

راه پيشنهاد مي کند:

از عملوندهاي مقصد و منبع استفاده شود.1.

از فرم هFاي خاصFي از دسFتور کFه انFدازه عنصFر را تعFيين 2.

مي کنند، استفاده نمود.

Page 234: اصول اساسی برنامه نويسی به زبان اسمبلی

وقFتي عناصFر در انFدازه بFايت مFورد اسFتفاده قFرار مي گيرنFد،

)شFFاخص( فقFFط يFFک واحFFد تغيFFير داده SI و DIثبات هFFاي

مي شFFوند ولي وقFFتي کFFه عناصFFر در انFFدازه کلمFFه مFFورد

بFه انFدازه دو DI و SIاسFتفاده قFرار مي گيرنFد، ثبات هFاي

واحد تغيير مي کنند.

Page 235: اصول اساسی برنامه نويسی به زبان اسمبلی

کFه بيت دهم ثبFات (DF)جهت حFرکت بFه وسFيله فلFگ جهت

نشانه ها است، تعيين مي شود.

بFه DI و SI حFاوي مقFدار يFک باشFد، آنگFاه مقFادير DFاگFر فلFگ

وسFFيله دسFFتورالعمل هاي رشFFته اي کFFاهش داده مي شFFوند.

بنابراين جهت رشته از سمت راست به چپ است.

DI و SI حFاوي مقFدار صFفر باشFد، آنگFاه مقFادير DFاگFر فلFگ

بFه وسFيله دسFتورالعمل هاي رشFته اي افFزايش داده مي شFوند.

بنFFابراين دو رشFFته از چپ بFFه راسFFت مFFورد پFFردازش قFFرار

مي گيرند.

Page 236: اصول اساسی برنامه نويسی به زبان اسمبلی

را صفر مي کند؛DF فلگ cldدستور

را يک مي کند.DF فلگ ctdدستور

يFک عنصFر رشFته )بFايت MOVSدسFتورالعمل انتقFال رشFته يعFني

يا کلمه( را از رشته مبدأ به رشته مقصد انتقال مي دهد.

بر روي هيچ فلگي اثر نمي گذارد.movsدستورالعمل

Page 237: اصول اساسی برنامه نويسی به زبان اسمبلی

، بسFFياري مراحFFل مقFFدماتي بايFFد movsقبFFل از اسFFتفاده از

انجام شوند:

بايFد حFاوي شFماره سFگمنت ESثبFات سFگمنت فوق العFاده

رشته مقصد باشد.

بايFد بFه آفسFت اولين بFايت رشFته اي کFه بايFد SI و DIثبات هFاي

مورد پردازش قرار گيرند، مقداردهي گردند.

ثبات نشانه ها بايد به مقدار مناسب، مقداردهي شود.

Page 238: اصول اساسی برنامه نويسی به زبان اسمبلی

براي آنکFه بFدانيم آيFا بFايت بعFدي مبFدأ همFان کFاراکتر تهي اسFت،

دستور زير مورد استفاده قرار مي گيرد:

While: cmp BYTE PTR [Si],0 ;null source

byte?

نشFFاندهنده آن اسFFت کFFه آدرس دهي غيرمسFFتقيم [Si]فرم

ثبFات مFورد اسFتفاده قFرار گرفتFه اسFت، بنFابراين عنصFري کFه در

قFرار دارد، مFورد اسFتفاده قFرار مي گFيرد و اين همFان SIآفسFت

بايت جاري رشته مبدأ است.

Page 239: اصول اساسی برنامه نويسی به زبان اسمبلی

پيشوندهاي تکرار:

o بFا دسFتورالعمل repپيشFوند و دسFتورالعمل movs معمFوال

Stos رFرح زيFه طFود کFاعث مي شFوند بFار مي رود. اين پيشFه کFب

اجرا شود:

while (CX صفر ≠شماره موجود در ) loop

;دستورالعمل اوليه را اجرا کن

;يک واحد از CX کم کن

End while;

Page 240: اصول اساسی برنامه نويسی به زبان اسمبلی

.repne و repeدو پيشوند تکرار ديگر عبارتند از

ا زمFاني کFه حFالت تسFاوي وجFود دارد، »تF بFه معFني repeفرم

يعFني »تFا زمFاني کFه صFفر اسFت تکFرار repzتکFرار کن« و فFرم

کن« مي باشد.

بFه معFني »تFا زمFاني کFه حFالت repnz و repneبه همين تFرتيب

مسFاوي وجFود نFدارد تکFرار کن« و »تFا زمFاني کFه صFفر نيسFت

تکFFرار کن« مي باشFFد. هFFر کFFدام از اين پيشFFوندهاي تکFFرار

scas و cmpsمناسFب اسFتفاده بFا دو دسFتورالعمل رشFته اي

که بر روي فلگ صفر اثر مي کنند، مي باشند.

Page 241: اصول اساسی برنامه نويسی به زبان اسمبلی

صFفر نيسFت، دسFتورالعمل CXاين پيشFوندها تFا زمFاني کFه

اوليه را تکرار مي کنند.

اسFت ZF=1 تکFرار را تFا زمFاني کFه repz و repeپيشFوندهاي

تکرار مي کنند.

اسFت ZF=0 تکFرار را تFا زمFاني کFه repnz و repneپيشFوندهاي

تکرار مي کنند.

Page 242: اصول اساسی برنامه نويسی به زبان اسمبلی

Cmps رFFا را بFFرده و فلگ هFFق کFFته اي را تفريFFر رشFFدو عنص

اسFاس آنهFا تنظيم مي کنFد؛ هيچکFدام از عملونFدها تغيFير داده

نمي شوند.

بخFواهيم بFدانيم کFه دو رشFته cmpsچنانچFه بFه وسFيله دسFتور

بFFFراي همFFFراهي بFFFا اين repeمشFFFابه هسFFFتند، پيشFFFوند

o مناسب است. دستورالعمل کامال

اغلب الزم اسFت رشFته اي کFه در درون رشFته ديگFري قFرار

دارد، جستجو کرد.

Page 243: اصول اساسی برنامه نويسی به زبان اسمبلی

SI:= آدرس رشته موردنظر;

DI:= آدرس رشته مقصد+POSITION-1;

CX:=طول رشته موردنظر ;

Forever loop

If CX=0 then از حلقه خارج شو; end if;

را مقايسFه کن و متناسFب بFا ZF را تنظيم کن

[SI] و [DI] آن

;SI را افزايش بده

;DI را افزايش بده

;CX را کاهش بده

If ZF=0 then از حلقه خارج شود; enf if;

End loop;

If ZF-1

Then

;رشته موردنظر پيدا شد

End if;

توانFد بFراي تطFبيق ميمقابFلتسFت

صورت بگيرد

Page 244: اصول اساسی برنامه نويسی به زبان اسمبلی

اضافي در انتهاي طرح آن است که:ifدليل وجود

بFوده و CX=0از آنجFايي کFه حلقFه وقFتي تمFام مي شFود کFه

باشFد، الزم اسFت اطمينFان حاصFل نمFود ZF=0يFا زمFاني کFه

که آخرين جفت کاراکترهاي مقايسه شده يکسان بوده اند.

Page 245: اصول اساسی برنامه نويسی به زبان اسمبلی

بFراي پFويش يFک رشFته جهت scasدسFتورالعمل پFويش رشFته اي

وجFود داشFتن و يFا وجFود نداشFتن يFک عنصFر رشFته اي معين بFه

کار مي رود.

از هيچ عملونFدي اسFتفاده نمي کننFد scasw و scasbفرم هFاي

زيرا فرم دستور اندازه عنصر موردنظر را تعيين مي نمايد.

Page 246: اصول اساسی برنامه نويسی به زبان اسمبلی

يFک بFايت يFا يFک کلمFه stosدسFتورالعمل ذخيره سFازي رشFته اي

بFه يFک عنصFر رشFته مقصFد کFپي AX يFا رشFته ALرا از ثبFات

مي نمايد.

اين دسFتور بFر روي هيچ فلگي اثFر نمي گFذارد. بنFابراين وقFتي کFه

تکFرار شFود، يFک مقFدار را در repاين دسFتورالعمل بFا پيشFوند

موقعيت هاي متوالي يک رشته کپي مي نمايد.

يFک عنصFر رشFته مبFدأ را lodsدسFتورالعمل بFار کFردن رشFته اي

بFر lods بFار مي نمايFد. دسFتورالعمل AX يFا ثبFات ALبFه ثبFات

روي فلگ ها هيچ اثري نمي گذارد.

Page 247: اصول اساسی برنامه نويسی به زبان اسمبلی

ترجمه کاراکترها

يFک کFاراکتر را بFه کFاراکتر ديگFري ترجمFه XlatدسFتورالعمل

مي نمايد.

اين دسFتورالعمل در تFرکيب بFا دسFتورالعمل هاي پFردازش رشFته

به راحتي مي تواند تمام کاراکترهاي يک رشته را ترجمه کند.

، کFاراکتري کFه بايFد ترجمFه XlatقبFل از اجFراي دسFتورالعمل

قFرار داده مي شFود. اين دسFتورالعمل بFراي ALشFود در ثبFات

قFرار دارد از يFک جFدول ترجمFه کFه ALترجمFه بFايتي کFه در آن

.در سگمنت داده قرار دارد استفاده مي کند

Page 248: اصول اساسی برنامه نويسی به زبان اسمبلی

از کFFاراکتري کFFه ترجمFFه مي گFFردد بعنFFوان Xlatبه طFFور کلي

آفسFت در جFدول ترجمFه اسFتفاده مي نمايFد و بFايتي را کFه در

آفست مزبور قرار دارد جايگزين آن مي کند.

داراي دو فرم زير است:Xlatدستورالعمل

Xlat

و

Xlat table_name

بايFFد جFFدول ترجمFFه را table_nameدر فFFرم دوم، عملونFFد

آدرس دهي نمايFد. البتFه اسFتفاده از اين عملونFد بFه طFور خودکFار

را مقFداردهي نمي نمايFد. اين عملونFد مي توانFد حFذف BXثبFات

اعالم صFريح ثبFات گFردد مگFر در مFوارد نFادري کFه نيFاز بFه پيشFوند

سگمنت وجود داشته باشد.

Page 249: اصول اساسی برنامه نويسی به زبان اسمبلی

ترجمFه يFک کFاراکتر بFه خFودش مجFاز اسFت. همين اتفFاق بFراي

کFه 3916تFا 3016ارقFام عFددي مي افتFد. کFدهاي اسFکي

تFا 3016 هسFتند در آفسFت هاي9معFرف اعFداد صFفر تFا

@ قFFFرار گرفته انFFFد. کFFFدهاي هفت کFFFاراکتر : تFFFا 3916

کاراکترهFاي بعFدي جFدول اسFکي هسFتند، هرکFدام از آنهFا بFه يFک

فاصله خالي ترجمه خواهند شد.

Page 250: اصول اساسی برنامه نويسی به زبان اسمبلی

تبديل يک عدد مکمل دو به يک رشته اسکي

بFراي تبFديل يFک عFدد صFحيح مکمFل دو بFه يFک itoaماکروي

رشFته شFش کFاراکتري جهت خFروجي، مFورد اسFتفاده قFرار

گرفته است.

اين دسFFFتورالعمل ها بFFFراي ارسFFFال پارامترهFFFا بFFFه روال

itoa_proc ايFاز ثبات ه AX و DI ابراينFد. بنFتفاده مي نماينFاس

کFاربر نبايFد نگFران دسFت خFوردن هيچکFدام از ثبات هFا باشFد.

ابتFدا در پشFته ذخFيره شFده و در انتهFاي DI و AXثبات هFاي

قFرار sourceبرنامFه بازيFابي مي شFوند. عFدد مکمFل دو کFه در

DI و آدرس مقصFد جهت رشFته در ثبFات AXدارد در ثبFات

قرار داده مي شود.

Page 251: اصول اساسی برنامه نويسی به زبان اسمبلی

استفاده از دستورالعملهاي رشته اي

دستورالعمل رشته ای وجود 5در زبان اسمبلی دارد

MOVSانتقال رشته ها CMPS مقایسه رشته ها

SCAS پویش رشته ها

STOS ذخیره رشته ها

LODS بارگذاری رشته ها

Page 252: اصول اساسی برنامه نويسی به زبان اسمبلی

پيشوندهاي تكرار و بقيه دستورالعملهاي رشته اي

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

وجود دارد تکرار انتقال یا ذخیره سازی

REP ( MOVS آرایهSTOS)

تکرار تا وجود حالت تساوی repz repe

تکرار تا شرط عدم وجود حالت تساوی repnz repne

پیشوند شرط تکرار

REP CX <> 0

REPE CX <> 0 and ZF=1

REPZ CX <> 0 and ZF=1

REPNZ CX <> 0 and ZF=0

REPNE CX <> 0 and ZF=0

Page 253: اصول اساسی برنامه نويسی به زبان اسمبلی

ترجمه كاراكترها

کارکترها در فرمهای نمایش متفوتی نشاندادهمیشوند

فرمebcdic بیتی است که توان 7 یک عد یک عدد کاراکتر را دارد128نمایش

فرمascii 256 یک عدد یک بایتی برای نمایش کارکتر را دارد

دستورxlat در زبان اسمبلی برای ترجمه کارکترها مورد استفاده قرار میگیرد

Page 254: اصول اساسی برنامه نويسی به زبان اسمبلی

به يك رشته 2تبديل يك عدد مكمل اسكي

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

استفاده از این ماکرو به این دلیل ضرورت دارد که همواره اعدادی که از صفحه کلید دریافت میشوند بصورت کارکتر بوده و برای ذخیره در

در آیند2رجیسترها باید بصورت عدد مکمل

Page 255: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل هشتم

ساير حالتهاي آدرس دهي

Page 256: اصول اساسی برنامه نويسی به زبان اسمبلی

مطالب اين فصل

حالتهاي آدرس دهيدستيابي غير پياپي عناصر يك آرايه ساختارها

Page 257: اصول اساسی برنامه نويسی به زبان اسمبلی

حالتهاي آدرس دهي

حالتهای آدرس دهی به اختصار در شکل زیر آمده است

ثبات غیر مستقیم

دارای مبنا

دارای اندیس

دارای مبنا و اندیس

مستقیم

غیر مستقیم

بالواسطه

ثبات

حافظه

Page 258: اصول اساسی برنامه نويسی به زبان اسمبلی

حالت هاي آدرس دهي

عملونFFدهاي دسFFتورالعمل ها، بFFه سFFه گFFروه عمFFده

تقسيم مي شوند.

بالواسطه

ثبات

حافظه

Page 259: اصول اساسی برنامه نويسی به زبان اسمبلی

: مقFاديري هسFتند کFه در داخFل دسFتورالعمل ها بالواسCطه

قرار مي گيرند.

: شFامل مقFاديري هسFتند کFه از يFک ثبFات برداشFته شFده ثبCات

و يا نتيجه دستورالعمل در يک ثبات مقصد قرار مي گيرد.

: بFFFه دو گFFFروه مسFFFتقيم و غيرمسFFFتقيم تقسFFFيم حافظCCه

مي شوند.

Page 260: اصول اساسی برنامه نويسی به زبان اسمبلی

o حFالت مسFتقيم بيشFترين مFورد از آدرس دهي حافظFه، احتمFاال

استفاده را دارد.

در برنامFه منبFع، اسFمبلر مايکروسFافت بFراي متمFايز کFردن يFک

عملونFد غيرمسFتقيم از انFواع ديگFر عملونFدها وجFود حFداقل يFک

نام ثبات در داخل کروشه را الزم مي داند.

Page 261: اصول اساسی برنامه نويسی به زبان اسمبلی

يFک عملونFد حافظFه غيرمسFتقيم را [bx]به عنFوان مثFال،

يک عملوند ثبات مي باشد.bxنشان مي دهد، در صورتي که

حالت ثبFFFات غيرمسFFFتقيم سFFFاده ترين حFFFالت غيرمسFFFتقيم

مي باشFد. بFراي حFالت ثبFات غيرمسFتقيم تنهFا چهFار قFالب کFد

، بFاين معFني کFه [bp]، [dx]، [si]، [bx]منبFع وجFود دارد، يعFني

بFFراي BP و BX، SI، DIتنهFFا مي تFFوان از چهFFار ثبFFات

آدرس دهي ثبFFات غيرمسFFتقيم اسFFتفاده کFFرده و نمي تFFوان

مقدار ديگري را به همراه اين ثبات ها ذکر نمود.

Page 262: اصول اساسی برنامه نويسی به زبان اسمبلی

افسFت DI و BX، SIدر حFالت ثبFات غيرمسFتقيم، سFه ثبFات

داده هFا در سFگمنت داده هFا را نگهFداري مي کننFد. بFه عنFوان مثFال:

شFامل DS قFرار دارد کFه ثبFات DS:SI در آدرس [SI]عملونFد

شامل افست مي باشد.SIشماره سگمنت و ثبات

بFه عملونFدهاي واقFع در BPدر آدرس دهي ثبFات غيرمسFتقيم،

پشFته اشFاره کFرده و سFه ثبFات ديگFر بFه عملونFدهاي واقFع در

سگمنت داده ها اشاره مي کنند.

Page 263: اصول اساسی برنامه نويسی به زبان اسمبلی

را DI و SI را ثبات هFاي مبنFا و ثبات هFاي BP و BXثبات هFاي

-bx] يا [bp+6]ثبات هاي انديس مي گويند. عملوندي به صورت

يFا [si+20] در حFالت مبنFا مي باشFد. عملونFدي بFه صFورت [4

[di+2] بيهFFالت خيلي شFFد. اين دو حFFديس مي باشFFالت انFFدر ح

حالت ثبات غير مستقيم مي باشند.

براي بFه دسFت آوردن افسFت عملونFد مFوردنظر، مقFدار جابجFايي

به محتواي ثبات مربوط اضافه مي شود.

Page 264: اصول اساسی برنامه نويسی به زبان اسمبلی

زمFاني کFه از يFک ثبFات مبنFا و يFک ثبFات انFديس اسFتفاده مي شFود،

BX/DI بFه انFدازه يFک سFيکل زمFاني از تFرکيب BX/SiتFرکيب

کمي سFريعتر از BP/DIسFريعتر مي باشFد. بهمين تFرتيب، تFرکيب

مي باشد.BP/SIترکيب

Page 265: اصول اساسی برنامه نويسی به زبان اسمبلی

دستيابي غيرپياپي عناصر يک آرايه

در زبFان اسFمبلي، حافظFه الزم بFراي يFک آرايFه را مي تFوان بFا

رزرو کردن يک بلوک متوالي از حافظه تخصيص داد.

Page 266: اصول اساسی برنامه نويسی به زبان اسمبلی

مرتب سFFFFازي درجي يکي از سFFFFاده ترين الگوريتم هFFFFاي

مرتب سFFازي مي باشFFد. ايFFده اصFFلي اين روش اينسFFت کFFه

عنصFر اولي آرايFه را بFه صFورت مFرتب شFده position-1تعFداد

درنظFر گرفتFه و سFپس عنصFر بعFدي را در مکFان صFحيح خFود

قFرار دارد. اگFر اين عمFل را بFراي تمFام انFديس ها تکFرار کFنيم،

يک آرايه مرتب شده نتيجه خواهد شد.

Page 267: اصول اساسی برنامه نويسی به زبان اسمبلی

اگFFر عناصFFر آرايFFه داراي تFFرتيب خاصFFي نباشFFد، در اينصFFورت

بايسFتي از جسFتجوي پيFاپي اسFتفاده نمFود؛ از عنصFر اول شFروع

کFرده و عناصFر آرايFه را يکي يکي امتحFان مي کFنيم. اگFر عناصFر

آرايFFه مFFرتب باشFFند در اين صFFورت مي تFFوان از الگFFوريتم

کارآمدتر جستجوي دودويي استفاده نمود.

Page 268: اصول اساسی برنامه نويسی به زبان اسمبلی

الگFFFوريتم جسFFFتجوي دودويي انFFFديس ميFFFاني آرايFFFه را

محاسFFبه کFFرده و مقFFدار عنصFFر ميFFاني آرايFFه را بFFا کليFFد

جسFتجو مقايسFه مي کنFد. اگFر کليFد جسFتجو برابFر مقFدار

عنصFر ميFاني آرايFه باشFد در اينصFورت الگFوريتم جسFتجو بFا

مFFوفقيت پايFFان مي يابFFد. اگFFر کليFFد جسFFتجو کوچکFFتر از

عنصFر ميFاني آرايFه باشFد، در اين صFورت اگFر کليFد جسFتجو

نصFف سFمت چFپي در آرايFه وجFود داشFته باشFد بايسFتي در

آرايFFه قFFرار داشFFته باشFFد. اگFFر کليFFد جسFFتجو بزرگFFتر از

مقFدار عنصFر ميFاني باشFد، در اينصFورت اگFر کليFد جسFتجو

در آرايFFه وجFFود داشFFته باشFFد بايسFFتي در نصFFف سFFمت

راستي آرايه قرار داشته باشد.

Page 269: اصول اساسی برنامه نويسی به زبان اسمبلی

ساختارها

يک سFاختار مجمFوعه اي از عناصFر داراي انFواع مختلFف کFه

نFام مشFترک دارنFد، مي باشFد؛ عناصFر يFک سFاختار را مي تFوان

بFFا اسFFتفاده از نFFام سFFاختار و نFFام فيلFFد عنصFFر مFFوردنظر

دستيابي نمود.

Page 270: اصول اساسی برنامه نويسی به زبان اسمبلی

را مي توان به صورت زير تعريف نمود:PartTypeنوع

Parttype STRUC

PartNbr DW ?

Description DB 20 Dup(?)

Quantity DW ?

Page 271: اصول اساسی برنامه نويسی به زبان اسمبلی

شFروع شFده و STRUCتعريFف نFوع سFاختار هميشFه بFا دسFتور

خاتمFه مي يابFد. ماننFد زبان هFاي سFطح بFاال، ENDSبFا دسFتور

تعريFFف نFFوع سFFاختار هيچ حFFافظه اي را بFFراي آن تخصFFيص

تعريFFف pARTtYPEنمي دهFFد؛ زمFFان کFFه متغFFيري ازنFFوع

مي شود، حافظه موردنياز براي آن تخصيص داده مي شود.

Page 272: اصول اساسی برنامه نويسی به زبان اسمبلی

دستيابي غير پياپي عناصر يك آرايه

برای این منظور در زبانهای سطح باال اندیسآرایه به کار میرود

در زبان اسمبلی میباید آرایه را در مکان متوالیذخیره نماییم تا بتوانیم دسترسی غیر پیاپی به آن

داشته باشیم در این حالت با محاسبه اندیس در طول آرایه و

میتوانیم به المان مورد نظر در offsetمحاسبه آرایه دسترسی داشته باشیم

Page 273: اصول اساسی برنامه نويسی به زبان اسمبلی

ساختارها

ساختار مجموعه ای از عناصر است با انواع داده ها با نام مشترک

عناصر یک ساختار را میتوان با نام مشترک ونام فیلد دستیابی کرد در پاسکال به این

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

ساختار در نظر گرفته است

Page 274: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل نهم

دستكاري بيتها

Page 275: اصول اساسی برنامه نويسی به زبان اسمبلی

مطالب اين فصل

عمليات منطقيدستورالعملهاي شيفت و دوران تبديل يك رشته اسكي به يك عدد صحيح مكمل

2

Page 276: اصول اساسی برنامه نويسی به زبان اسمبلی

عمليات منطقي

بFا مقFدار بيFتي يFک و مقFدار trueدر زبFان اسFمبلي مقFدار بFولي

با مقدار بولي صفر مشخص مي شود.falseبولي

or 1 1، حاصFل or آن اسFت کFه در xor و orتنهFا تفFاوت بين

صفر مي باشد.xor 1 1 حاصل xorيک، ولي در

بFدين معFني اسFت کFه وقFتي xorبه عبFارت ديگFر دسFتورالعمل

يکي از طFرفين برابFر يFک باشFد، خFروجي برابFر يFک اسFت ولي

نه زماني که هر دو طرف برابر يک هستند.

Page 277: اصول اساسی برنامه نويسی به زبان اسمبلی

عمليFFات منطقي را not و and، or، xorدسFFتورالعمل هاي

پياده سFازي مي نماينFد. فFرم اين دسFتورالعمل ها عبFارت اسFت

از:

And منبع، مقصد

Or منبع، مقصد

Xor منبع، مقصد

Not مقصد

Page 278: اصول اساسی برنامه نويسی به زبان اسمبلی

هيچ فلگي را تغيFFير نمي دهFFد. ولي ديگFFر notدسFFتورالعمل

ZF,SF,PF,OF,CFدسFتورالعمل هاي بFولي بFر روي فلگ هFاي

OF و فلFگ سFرريزي CF اثFر مي گذارنFد. فلFگ رقم نقلي AFو

هFر دو صFفر مي شFوند و مقFدار فلFگ رقم نقلي کمکي ممکن

اسFت تغيFير کنFد، امFا مقFدار آن تعريFف نشFده اسFت. مقFادير

بسFته بFه (ZF) و صFفر (SF)، عالمت (PF)فلگ هFاي تFوازن

مقدار حاصل عمليات يک يا صفر مي شوند

Page 279: اصول اساسی برنامه نويسی به زبان اسمبلی

همگي يکنFوع عملونFد xor و or , andاي هدسFتورالعمل

را قبFول مي کننFد و بFراي اجFرا بFه تعFداد پالس هFاي سFاعت

يکسFان نيFاز دارنFد و همينطFور تعFداد بايت هFاي کFد هFدف

آنها برابر است.

Page 280: اصول اساسی برنامه نويسی به زبان اسمبلی

شFود، حاصFل and، 1بايFد توجFه داشFت کFه هFر بيFتي کFه بFا

همFان بيت اصFلي خواهFد بFود و از طFرف ديگFر هFر بيFتي کFه بFا

0 ،and .شود، حاصل صفر خواهد بود

اي مFFوردنظر در يFFک بFFايت يFFا کلمFFه هFFبه همين دليFFل بيت

شFدن بFا الگFويي از بيت هFا کFه داراي andمي تواننFد بFه وسFيله

در محل هFFايي کFFه نبايFFد تغيFFير کننFFد و صFFفر در 1مقFFدار

محل هايي که بايد تغيير کنند، صفر شوند

Page 281: اصول اساسی برنامه نويسی به زبان اسمبلی

o بFا دسFتورالعمل هاي منطقي بFراي تغيFير مقFداردهي کFه معمFوال

ناميده مي شود.(mask)مقدار بيت ها به کار مي رود، پوشش

بFراي يFک کFردن بيت هFاي مFوردنظر در يFک orدسFتورالعمل

بFايت يFا کلمFه بFدون تغيFير بيت هFاي ديگFر مفيFد اسFت. بايFد توجFه

شFود، آنگFاه حاصFل or ديگFر 1 يFا 0 بFا 1داشFت کFه اگFر مقFدار

باشFد، آنگFاه نتيجFه 0 خواهFد بFود ولي اگFر يکي از عملونFدهاي 1

همان مقدار عملوند ديگر خواهد بود.orعمل

Page 282: اصول اساسی برنامه نويسی به زبان اسمبلی

بيت هFاي مFوردنظر يFک بFايت يFا يFک کلمFه را xorدسFتورالعمل

بFدون تغيFير بيت هFاي ديگFر معکFوس مي کنFد. دليFل اين امFر اين

اسFت. اين 0 مسFاوي 1xor1 بFوده و 1 مسFاوي xor 1 0اسFت کFه

xorبFدان معFني اسFت کFه هFر بيFتي را کFه بFه وسFيله دسFتورالعمل

ترکيب کنيم حاصل معکوس بيت اوليه خواهد بود.1با بيت

قFرار دارد بFراي ذخFيره کFردن هشFت flagsاگFر بFايتي کFه در

مقFدار بFولي مFورد اسFتفاده قFرار گرفتFه باشFد، آنگFاه دسFتورالعمل

or اديرFوان مقFمي ت (true )1 بتFوردنظري نسFر بيت مFه هFرا ب

دهد.

Page 283: اصول اساسی برنامه نويسی به زبان اسمبلی

کاربردهاي ديگر دستورالعمل هاي منطقي

انجام عمليات مشخص رياضي به جاي دستورالعمل هاي رياضي

دستکاري کدهاي اسکي

حيح بينFدد صFک عFديل يFا 0تبFط 9 نFاظر آن توسFکي متنFد اسFه کFب

orدستورالعمل

طFکي توسFدول اسFا در جFزرگ الفبFروف بFک و حFروف کوچFديل حFتب

xorدستورالعمل

Page 284: اصول اساسی برنامه نويسی به زبان اسمبلی

آن است که فلگ ها را تنظيم کند.testوظيفه دستورالعمل

در وارسFي يFک بيت مFوردنظر از يFک testيک کFاربرد دسFتورالعمل

بايت يا کلمه مي باشد.

انFد بFراي بFه دسFت آوردن اطالعFات در مFورد تو مي testدسFتورالعمل

يک مقدار در يک ثبات مورد استفاده قرار گيرد.

Page 285: اصول اساسی برنامه نويسی به زبان اسمبلی

دستورالعمل هاي شيفت و دوران

برنFFامه نويس بFFه کمFFک دسFFتورالعمل هاي شFFيفت ودوران

مي تواند موقعيت بيت هاي يک کلمه يا بايت را تغيير دهد.

دسFتورالعمل هاي شFيفت، بيت هFاي واقFع در مFوقعيت داده

شFده بFه وسFيله عملونFد مقصFد را بFه طFرف چپ يFا راسFت

حFرکت مي دهنFد. جهت شFيفت مي توانFد از آخFرين کFاراکتر

Shl و Sal–نFام دسFتورالعمل شFيفت تشFخيص داده شFود

شFيفت بFه طFرف Shr و SarشFيفت بFه طFرف چپ هسFتند،

دو دسFته منطقي و رياضFي راسFت مي باشFند. شFيفت ها بFه

دسته بندي مي شوند

Page 286: اصول اساسی برنامه نويسی به زبان اسمبلی

Shl و Shr وده وFيفت هاي منطقي بFش Sal و Sar يفت هايFش

رياضي مي باشند.

Shl ÂُShr

Sal Sar

چپ راست

منطقي

رياضي

Page 287: اصول اساسی برنامه نويسی به زبان اسمبلی

فرم کد منبع هر دستورالعمل شيفت به صورت زير مي باشند:

S-- تعداد، مقصد

براي عملوند تعداد دو نگارش وجود دارد.

تک بيتي:

S-- 1,مقصد

اين نFوع دسFتورالعمل بFاعث مي شFود کFه فقFط يFک شFيفت در عملونFد

مقصد صورت گيرد

چند بيتي:

S-- و مقصد cl

عFدد بFدون بFه عنFوان يFکCLدر اين فFرم، مقFدار موجFود در ثبFات

عالمت تفسFير مي گFردد و بFراي دسFتور شFيفت مشFخص مي کنFد کFه

مقدار موجود در عملوند مقصد را چند بيت شيفت مي دهد.

Page 288: اصول اساسی برنامه نويسی به زبان اسمبلی

بيت هFFايي کFFه از طFFرف چپ بFFيرون مي رونFFد بFFدور ريختFFه

ذخFيره CFمي شFوند بغFير از آخFرين بيت کFه در فلFگ رقم نقلي

مي گردد.

بسFته بFه آخFرين مقFداري کFه در عملونFد مقصFد قFرار مي گFيرد،

تعFFيين (PF) و تFFوازن (ZF)، صFFفر (SF)فلگهFFاي عالمت

مي گردنFد. فلFگ سFرريزي بFراي يFک شFيفت چنFدبيتي تعريFف

نشFده بFاقي مي مانFد، امFا بFراي يFک شFيفت تک بيFتي چنانچFه بيت

عالمت حاصFل هماننFد بيت عالمت مقFدار اوليFه عملونFد مقصFد

باشFد، برابFر صFفر شFده و چنانچFه متفFاوت باشFند، برابFر يFک

تعريFFف نشFFده AFخواهFFد گرديFFد. فلFFگ رقم نقلي کمکي

نمي باشد.

Page 289: اصول اساسی برنامه نويسی به زبان اسمبلی

بFه PF و SF، ZFهماننFد شFيفت بFه طFرف چپ، مقFادير

تعريFف نشFده AFنتيجFه عمليFات بسFتگي خواهنFد داشFت و

در يFک شFيفت چنFدبيتي تعريFف OF خواهFد بFود. فلFگ سFرريزي

نشده خواهد بود.

، (Shr)براي يFک شFيفت تک بيFتي منطقي بFه طFرف راسFت

چنانچFه بيت عالمت حاصFل هماننFد بيت عالمت مقFدار اوليFه

برابFر OFعملونFد مقصFد باشFد، در اينصFورت فلFگ سFرريزي

صFفر شFده و در غFير اينصFورت برابFر يFک خواهFد شFد. در

OF، (Sar)شFFيفت رياضFFي بFFه طFFرف راسFFت چنFFدبيتي

هميشه صفر مي گردد.

Page 290: اصول اساسی برنامه نويسی به زبان اسمبلی

دسFتورالعمل هاي شFيفت از دسFتورالعمل هاي پFايه اي هسFتند،

اما داراي کاربردهاي زيادي مي باشند.

وقFتي قFرار باشFد کFه عFددي در دو ضFرب شFود، يFک شFيفت

تک بيFتي بFه طFرف چپ عFدد اوليFه مي تFوان حاصلضFرب صFحيح

را در اختيار بگذارد.

Page 291: اصول اساسی برنامه نويسی به زبان اسمبلی

يک شFيفت تک بيFتي بFه طFرف چپ عملونFدهاي عالمت دار را نFيز

دو برابر مي کند.

يک عمFل شFيفت تک بيFتي بFه طFرف راسFت مي توانFد بFه صFورت

مFؤثري بFراي تقسFيم کFردن يFک عملونFد بFدون عالمت بFر دو،

مورد استفاده قرار گيرد.

Page 292: اصول اساسی برنامه نويسی به زبان اسمبلی

شيفت بFه طFرف راسFت بFراي اعFداد منفي، بFه طFور کامFل هماننFد

تقسيم بر دو نيست.

اگFر مقسFوم يFک عFدد فFرد منفي باشFد آنگFاه خFارج قسFمت بFه

صورت نقصاني گرد خواهد شد.

Page 293: اصول اساسی برنامه نويسی به زبان اسمبلی

دسFFتورالعمل هاي دوران خيلي شFFبيه دسFFتورالعمل هاي شFFيفت

هسFتند. در دسFتورالعمل هاي شFيفت، بيت هFا از يFک طFرف شFيفت

داده شFده و بFه دور ريختFه مي شFوند، در حاليکFه جاهFاي خFالي از

اي هطFFرف ديگFFر بFFا صFFفر پFFر مي شFFوند. ولي در دسFFتورالعمل

دوران، بيت هFFايي کFFه از يFFک طFFرف بFFه بFFيرون شFFيفت داده

مي شوند، از طرف ديگر فضاهاي خالي را پر مي کنند.

Page 294: اصول اساسی برنامه نويسی به زبان اسمبلی

يک دستورالعمل دوران تک بيني داراي فرم زير مي باشند:

r-- مقصد,l ;rotate 1 bit

چندبيتي:

r-- CL,مقصد ;rotate number of bits given by CL

، دوران بFه طFرف چپrol ( rotate left )در دسFتورالعمل هاي

)rorو rotate right وان ازFت( مي تFرف راسFه طFدوران ب ،

عملوندهاي بايت يا کلمه در ثبات يا حافظه استفاده کرد.

Page 295: اصول اساسی برنامه نويسی به زبان اسمبلی

آخFرين بيت کFه بFه طFرف ديگFر عملونFد کFپي مي شFود در فلFگ

نFFيز منعکس مي گFFردد؛ اين »آخFFرين بيت« تنهFFا CFرقم نقلي

تنهFا OFبFراي دوران حFالت تک بيFتي مي باشFد. فلFگ سFرريزي

فلFگ ديگFري اسFت کFه از دسFتورالعمل هاي دوران اثFر مي پFذيرد.

در دوران هاي چندبيتي فلگ سرريزي تعريف نشده است.

Page 296: اصول اساسی برنامه نويسی به زبان اسمبلی

مثال:

اسFت و D25E حFاوي مقFدار DXبعنFوان مثFال فFرض کنيFد ثبFات

دستورالعمل

Rol dx,1

اجرا مي شود، اجرا به صورت دودويي به شکل زير است:

اسFت. فلFگ رقم نقلي A4BD برابFر عFدد DXو نتيجFه در ثبFات

از انتهFاب چپ بFه طFرف 1برابFر يFک مي گFردد، زيFرا يFک بيت

راست رفته است.

Page 297: اصول اساسی برنامه نويسی به زبان اسمبلی

يک جفت دسFتورالعمل دوران ديگFر وجFود دارنFد کFه هFر کFدام بFه

قسFFمتي از CFي عمFFل مي کننFFد کFFه فلFFگ رقم نقلي اگFFونه

عملوند مقصد است:

Rcl , rcr

دسFتورالعمل هاي دوران بFا اسFتفاده از فلFگ رقم نقلي کFه بFه

نFFيز اثFFر OF را تغيFFير مي دهنFFد بFFر روي CFطFFور مشFFخص

مي گذارند ولي هيچ تغييري در فلگ هاي ديگر نمي دهند.

Page 298: اصول اساسی برنامه نويسی به زبان اسمبلی

تبديل يک رشته اسکي به يک عدد صحيح مکمل دو

بFه منظFور پFويش نFاحيه اي از حافظFه کFه حFاوي atoiماکروي

يFک رشFته اسFکي کFه نشFاندهنده يFک عFدد صFحيح اسFت بFه کFار

بFرده شFده اسFت وحاصFل آن يFک عFدد صFحيح مکمFل دو در

است.AXثبات

Page 299: اصول اساسی برنامه نويسی به زبان اسمبلی

اين مFاکرو مي توانFد بFه مجموعFه دسFتورالعمل هاي زيFر بسFط

پيدا کند:

Push si ;;save SI

Lea si,source ;;source address to SI

Call atoi_proc ;;call procedure

Pop si ;;restore SI

اين دسFتورالعمل ها بFراي ارسFال آفسFت رشFته اسFکي بFه روال

atoi_proc اتFاز ثب SI اتFه ثبFدار اوليFد. مقFتفاده مي کننFاس SI

در پشFته ذخFيره مي گFردد تFا برنFامه نويس بتوانFد از اين ثبFات بFه

کFاربر و نFه sourceمنظورهFاي ديگFري اسFتفاده نمايFد. شناسFه

، در مFاکروي بسFط يافتFه مFورد اسFتفاده قFرار sourceاسFم

مي گيرد.

Page 300: اصول اساسی برنامه نويسی به زبان اسمبلی

دستورالعملهاي شيفت و دوران

در زبان اسمبلی هر شیفت به منعنای چرخش بیتهادرون یک رجیستر است

است2هر چرخش به چپ معادل ضرب در عدد است2هر چرخش به راست معادل تقسیم عدد به عمل دوران باعث میشود بیتی که از یک طرف خارج

میشود از سمت دیگر وارد شود دستورات SHL , SHR شیفتهای منطقی هستند دستوراتSAL , SAR شیفتهای ریاضی هستند

Page 301: اصول اساسی برنامه نويسی به زبان اسمبلی

تبديل يك رشته اسكي به يك عدد 2صحيح مكمل

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

استفاده از این ماکرو به این دلیل ضرورت دارد که همواره اعدادی که از صفحه کلید دریافت میشوند بصورت کارکتر بوده و برای ذخیره در

در آیند2رجیسترها باید بصورت عدد مکمل

Page 302: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل دهم

ساير حالتهاي آدرس دهي

Page 303: اصول اساسی برنامه نويسی به زبان اسمبلی

مطالب اين فصل

دستورالعملهايint و جدول بردار وقفه درخواست توابعDOS ورودي خروجي فايلهاي پياپي با استفاده از

DOS ورودي / خروجي با دستوراتin , out بدون(

استفاده از سيستم عامل(

Page 304: اصول اساسی برنامه نويسی به زبان اسمبلی

و جدول بردار وقفه هاintدستورالعمل

بعضFFي مواقFFع از فراخFFواني معمFFولي روال هFFا اسFFتفاده

و بسFياري از سيسFتم عامل هاي ديگFر از DOSمي شFود. ولي

نFوع بخصFوص فراخFواني روال اسFتفاده مي کننFد؛ يFک وقفFه

نرم افFزاري کFه بعضFي مواقFع آن را يFک تلFه يFا يFک اسFتثناء

مي گويند.

Page 305: اصول اساسی برنامه نويسی به زبان اسمبلی

intبراي فعFال کFردن يFک وقفFه مي تFوان از دسFتورالعمل

استفاده نمود.

توليFد PCبعالوه، بعضFي وقفه هFاي توسFط خFود سFخت افزار

مي شوند.

Page 306: اصول اساسی برنامه نويسی به زبان اسمبلی

o داراي يFک پردازنFده وقفFه مي باشFد کFه بلFوکي يک وقفFه عمال

o ماننFد يFک روال معمFولي مي باشFد. از کFد مي باشFد کFه تقريبFا

توسFFط CallيFFک پردازنFFده وقفFFه بFFه جFFاي دسFFتورالعمل

فراخFواني مي شFود. بFراي برگشFتن از يFک intدسFتورالعمل

بFراي retپردازنFده وقفFه، بFه جFاي اسFتفاده از دسFتورالعمل

iret( interrupt return)يFک روال معمFولي از دسFتورالعمل

استفاده مي شود.

Page 307: اصول اساسی برنامه نويسی به زبان اسمبلی

داراي قالب زير است:Intدستورالعمل

Int interrupt_type

مي باشد.255 تا 0 برابر يک عدد صحيح از Interrupt_typeکه

وقFFتي اين دسFFتورالعمل اجFFرا مي شFFود، ابتFFدا محتFFواي ثبFFات

IFنشFFانه ها را روي پشFFته اضFFافه کFFرده و سFFپس نشFFانه هاي

)نشانه تله( خاموش مي گردند.TF)نشانه فعال سازي وقفه( و

Page 308: اصول اساسی برنامه نويسی به زبان اسمبلی

بFFدون عملونFFد iretدسFFتورالعمل برگشFFت از وقفFFه يعFFني

مي باشد.

اين دسFFتورالعمل ابتFFدا ماننFFد يFFک دسFFتورالعمل برگشFFت دور

را از روي پشFته CS و IPعمFل مي کنFد يعFني اينکFه ثبات هFاي

برداشFته و سFپس مقFادي رنشFانه ها را از روي پشFته بFرمي دارد.

در نتيجFه تمFام نشFانه ها برابFر مقFاديري کFه توسFط دسFتورالعمل

Int.روي پشته ذخيره شده بودند، مي گردد

Page 309: اصول اساسی برنامه نويسی به زبان اسمبلی

o دسFتورالعمل بعFد از دسFتورالعملي کFه احتمFال بFه intoمعمFوال

وجود آمدن حالت سرريزي وجود داشته باشد، به کار مي رود.

بعضFي از اين وقفه هFاي بFراي پFردازش وقفه هFاي سFخت افزاري

به کار مي روند.

Page 310: اصول اساسی برنامه نويسی به زبان اسمبلی

DOSدرخواست توابع

يFک پردازنFده وقفFه int 21hتمFام توابFع فراخFواني شFده توسFط

معيFني را فراخFواني مي کننFد. تFابع مFورد نظFر بFا قFرار دادن

انتخاب مي شود. AHشماره تابع مربوطه در ثبات

و intبا توجFه بFه اينکFه تمFام نشFانه ها توسFط دسFتورالعمل هاي

iret داFير پيFانه ها تغيFادير نشFد، مقFظ مي گردنFته حفFروي پش

نمي کنند.

Page 311: اصول اساسی برنامه نويسی به زبان اسمبلی

DOSورودي/خروجي فايل هاي پياپي با استفاده از

فراخFواني مي شFوند، در int 21h کFه از طريFق DOSاکFثر توابFع

مFورد عمليFات روي فايل هFاي ديسFک مي باشFند. از جملFه توابFع

زير مي باشند.

تشکيل دادن يک فايل جديد

باز کردن يک فايل

بستن يک فايل

خواندن داده از يک فايل

نوشتن داده روي يک فايل

حذف کردن يک فايل

Page 312: اصول اساسی برنامه نويسی به زبان اسمبلی

16 از يFک عFدد DOSبراي شناسFايي يFک فايFل، اکFثر توابFع

بيFتي بFه نFام هنFدل فايFل اسFتفاده مي کننFد. در زمFان بFاز

انتقFال يافتFه و هنFدل DOSکFردن يFک فايFل، نFام بFه سيسFتم

DOSفايFFFل مزبFFFور بFFFراي اسFFFتفاده هاي آتي توسFFFط

برگردانFده مي شFود. بFراي خوانFدن از فايFل، نوشFتن روي

يFک فايFل يFا بسFتن يFک فايFل، هنFدل فايFل مFوردنظر بFه

انتقال مي يابد.DOSسيستم

Page 313: اصول اساسی برنامه نويسی به زبان اسمبلی

شFامل اطالعFاتي در مFورد نحFوه بFاز کFردن فايFل ALثبFات

موردنظر مي باشد:

چهFار بيت پFائيني شFامل يFک عFدد بFدون عالمت بFه شFرح زيFر

مي باشد.

0000براي باز کردن فايل به صورت فقط خواندن

0001براي باز کردن فايل به صورت فقط نوشتن

0010براي باز کردن فايل به صورت خواندن و نوشتن

Page 314: اصول اساسی برنامه نويسی به زبان اسمبلی

را بFه صFورت AL، مي تFوان ثبFات PCبراي يFک محيFط سFاده

زير مقداردهي کرد:

0براي خواندن از فايل

1براي نوشتن روي فايل

2براي خواندن و نوشتن فايل

Page 315: اصول اساسی برنامه نويسی به زبان اسمبلی

کدهاي خطا:

کدهايي بFراي وجFود داشFتن يFک مقFدار نادرسFت در ثFابت

AL

وجود نداشتن يک فايل•

تعداد فايل هاي باز بيش از اندازه مجاز بودن•

Page 316: اصول اساسی برنامه نويسی به زبان اسمبلی

ورودي/خCCروجي بCCدون سيسCCتم عامل )بCCا اسCCتفاده از

(out و intدستورالعمل هاي

بFراي انجFام DOSدر اين دور مFورد اسFتفاده از روال هFا و توابFع

عمليFات ورودي و خFروجي تأکيFد شFده اسFت. بFاين تFرتيب برنامه هFا

مي تواننFد از يFک سيسFتم کFامپيوتري بFه سيسFتم ديگFري تFا انFدازه اي

قابFل حمFل باشFند بFا وجFود اين، در پFائين ترين سFطح اجFرا، ورودي و

صFورت out و InخFروجي بايسFتي بFا اسFتفاده از دسFتورالعمل هاي

گيرد.

)يFک AL )يFک کلمFه( يFا AX بايسFتي ثبFات outمنبFع دسFتورالعمل

بايسFتي برابFر inبFايت( باشFد. بهمين تFرتيب، مقصFد دسFتورالعمل

باشد.AL يا AXثبات

Page 317: اصول اساسی برنامه نويسی به زبان اسمبلی

از درگFاه کنFترل چFاپگر بFراي هFدايت عمليFات مختلFف چFاپگر

استفاده مي شود.

o برابرب0Fبيت مي باشFد. ولي بFراي مطلFع سFاختن 0 ا معمFوال

چFاپگر از اينکFه يFک بFايت داده بFا آن ارسFال شFده اسFت، اين

قرار داده مي شود.1بيت براي مدت زمان کوتاهي برابر

Page 318: اصول اساسی برنامه نويسی به زبان اسمبلی

قبFFل از فرسFFتادن يFFک کFFاراکتر بFFه چFFاپگر، برنامFFه بايسFFتي

اطمينFان حاصFل کنFد کFه چFاپگر مشFغول نمي باشFد. اينکFار بFا

7خوانFدن يFک بFايت از درگFاه وضFعيت چFاپگر و کنFترل بيت

وضFFعيت را نشFFان مي أهFFد، صFFورت مي گFFيرد. اين عمFFل تFFا

مي باشد تکرار مي گردد.0زماني که اين بيت برابر

به محض آزاد شFدن چFاپگر، کFاراکتر مFوردنظر در داخFل ثبFات

AL اتFل ثبFا در داخFاه داده هFو آدرس درگ DX ه وFرار گرفتFق

بايت مربوط را ارسال مي کند.outدستورالعمل

Page 319: اصول اساسی برنامه نويسی به زبان اسمبلی

همچFنين مي توانFد از طريFق درگاه هFاي ورودي/خFروجي PCيک

سFريال بFا دسFتگاه هاي جFانبي ارتبFاط برقFرار نمايFد. تفFاوت بين

ارتبFاط مFوازي و سFريال اينسFت کFه در ارتبFاط مFوازي هشFت بيت

بFه طFور همزمFان از طريFق هشFت سFيم منتقFل مي شFود، در حFالي

اي شFروع و هFبيت هFاي يFک بFايت باضFافه بيت کFه در ارتبFاط سFريال،

توقFف بFه صFورت يFک بيت در هFر زمFان از طريFق يFک سFيم منتقFل

مي شوند.

Page 320: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل يازدهم

پردازش اسمبلي

Page 321: اصول اساسی برنامه نويسی به زبان اسمبلی

مطالب اين فصل

اسمبلي دو گذري 8088كد كردن دستورالعملهايدستورات اسمبلر

Page 322: اصول اساسی برنامه نويسی به زبان اسمبلی

اسمبلي دوگذري

وظيفFه يFک اسFمبلر آن اسFت کFه کFد منبFع زبFان اسFمبلي را بFه

کد هدف تبديل نمايد.

مايکرو اسFمبلر مايکروسFافت يFک اسFمبلر دوگFذري اسFت. اين

بFه آن معFني اسFت کFه يFک برنامFه منبFع زبFان اسFمبلي دوبFار بFه

پFويش مي شFود تFا فايFل کFد هFدف آن ايجFاد MASMوسFيله

شFود. مي تFوان يFک اسFمبلر را بFه صFورت يFک گFذري طFرح کFرد و

بعضFFي اسFFمبلرها برنامFFه منبFFع را سFFه بFFار يFFا بيشFFتر پFFويش

مي کنند اما بيشتر اسمبلرها از دو گذر بهره مي برند.

Page 323: اصول اساسی برنامه نويسی به زبان اسمبلی

يک مFزيت نوشFتن برنامFه بFه زبFان اسFمبلي نسFبت بFه زبFان ماشFين

آن اسFت کFه در آن مي تFوان از شناسFه ها يFا نمادهFا بFراي رجFوع بFه

داده هFا در سFگمنت داده و دسFتورالعمل ها در سFگمنت کFد اسFتفاده

نمود.

يک وظيفFه اسFمبلر آن اسFت کFه يFک جFدول عالئم در ارتبFاط بFا هFر

شناسه با مشخصه هاي مختلف را تشکيل داده و آن را حفظ کند.

Page 324: اصول اساسی برنامه نويسی به زبان اسمبلی

يک مشخصه برابر نوع يک نماد است.

اين انواع شامل موارد زير مي باشد:

برچسب داده ها و دستورالعمل ها

نمادهايي که مساوي ثبات ها درنظر گرفته شده اند

اسامي روال ها

اسامي ماکروها

اسامي سگمنت ها

Page 325: اصول اساسی برنامه نويسی به زبان اسمبلی

چنانچFه نمFادي مربFوط بFه داده يFا دسFتورالعمل باشFد،

آنگFاه مFوقعيت آن در جFدول عالئم وارد مي شFود. اسFمبلر

داراي يFFک شFFمارنده مFFوقعيت اسFFت کFFه اين مقFFدار را

o در يFFک اسFFمبلر شFFمارنده محاسFFبه مي کنFFد. معمFFوال

مFوقعيت در ابتFداي برنامFه يFا در ابتFداي بخش هFاي مهمي

از برنامه، صفر مي گردد.

Page 326: اصول اساسی برنامه نويسی به زبان اسمبلی

چنانچFه اسFمبلر بخواهFد از اين قاعFده پFيروي کنFد کFه داده هFا

قبFل از دسFتورالعمل هاي اجFرايي بايFد مشFخص باشFند، آنگFاه

جFدول عالئم ورودي هFايي را بFراي داده هFا در حين گFذر اول در

نظFر مي گFيرد. ممکن اسFت بFدين تFرتيب بFه نظFر برسFد کFه

اسFمبلي يFک گFذري سFاده اسFت. البتFه در چFنين مFواردي پFرش

بFه دسFتورالعمل هاي اجFرايي جلFوتر بFا مشFکالتي مواجFه خواهFد

شد.

اسFمبلرهاي مختلFف مقFدار کFار متفFاوتي را در حين گFذر اول

انجFام دهنFد. بعضFي بFراي ايجFاد جFدول عالئم فقFط از شFمارنده

مFوقعيت اسFتفاده مي نماينFد. بعضFي ديگFر در حين گFذر اول هم

o کFاملي را جFدول عالئم را ايجFاد مي کننFد و هم کFد هFدف تقريبFا

توليFد مي نماينFد. مFاکرو اسFمبلر مايکروسFافت جFزء دسFته دوم

است.

Page 327: اصول اساسی برنامه نويسی به زبان اسمبلی

وظيفFه اصFلي يFک اسFمبلر، توليFد کFد هFدف اسFت. البتFه

اسFFمبلرها کارهFFاي بسFFيار زيFFاد ديگFFري را نFFيز انجFFام

مي دهند. يک وظيفه، ذخيره کردن فضا است.

اسFمبلر عالوه بFر ذخFيره کFردن حافظFه مي توانFد فضFاي

ذخيره شده را با مقادير معيني مقداردهي کند.

Page 328: اصول اساسی برنامه نويسی به زبان اسمبلی

اکFثر اسFمبلرها مي تواننFد فايFل ليسFت را توليFد کننFد، اين فايFل

کFد منبFع اصFلي را بهمFراه کFد هFدف مربوطFه عرضFه مي کنFد.

مسFئوليت ديگFر يFک اسFمبلر آن اسFت کFه وقFتي اشFتباهي در کFد

منبFع وجFود دارد پيغام هFاي خطFا را توليFد کنFد. اسFمبلرهاي اوليFه

فقFط بFراي هFر اشFتباه فقFط شFماره خFط و کFدخطا را نمFايش

مي دادنFFد. نسFFل هاي بعFFدي اسFFمبلرها يFFک صFFفحه مجFFزا بFFا

اکFثر اسFمبلرها شFماره خFط و پيغFام خطFا ايجFاد مي کردنFد.

مي تواننFد پيغFام خطFا را در فايFل ليسFت در محلي کFه خطFا

وجFود دارد قFرار دهنFد. مFاکرو اسFمبلر مايکروسFافت پيغFام

خطFا را در فايFل ليسFت قFرار مي دهFد و آنهFا را بFرروي صFفحه

نمايش نيز نمايش مي دهد.

Page 329: اصول اساسی برنامه نويسی به زبان اسمبلی

عالوه بFFر ليسFFتي کFFه برنامFFه منبFFع و کFFد هFFدف را نشFFان

مي دهFFد، اغلب اسFFمبلرها مي تواننFFد ليسFFت عالئم مFFورد

اسFتفاده در برنامFه را نFيز توليFد نماينFد. چFنين ليسFتي ممکن

اسFت اطالعFاتي را دربFاره مشخصFه هFر نمFاد و همينطFور

جFدول ارجFاع را کFه مشFخص کننFده خطي اسFت کFه يFک نمFاد

در آنجFا تعريFف شFده اسFت و خطFوطي کFه بFه آن رجFوع

کرده اند، در برگيرد.

Page 330: اصول اساسی برنامه نويسی به زبان اسمبلی

ماکرو اسFمبلر مايکروسFافت يFک اسFمبل دوگFذري اسFت. اين

اسFمبلر قFادر اسFت کFدهاي هFدفي را ايجFاد کنFد کFه بFه محلهFايي

در فايلهFاي ديگFر رجFوع نماينFد و همينطFور حFاوي عالئمي باشFد

MS-DOS در LINKکFه قابFل جابجFايي مي باشFند. برنامFه کمکي

فايلهFFايي را کFFه داراي کFFدهاي هFدف مجFFزا هسFFتند دريکFديگر

تFرکيب کFرده و رجFوع بFه فايل هFاي ديگFر را ممکن مي سFازد.

کFه بFه طFور خودکFار بFا وارد کFردن اسFم فايFل MS-DOSلFودر

برنامFه اجFرايي صFدا مي شFود، قسFمت نهFايي کFار ترجمFه فايFل را

انجFام مي دهFد، يعFني قبFل از آماده سFازي اجFرا آن را در درون

.حافظه بار مي کند

Page 331: اصول اساسی برنامه نويسی به زبان اسمبلی

چند دستور اسمبلر

هر کFدام از دسFتورات اسFمبلر از اسFمبلر مي خواهFد کFه وظيفFه

خاصي را انجام دهد.

داراي فرم زير است:ASSUMEدستور اسمبلر

ASSUME segment_register:segment_name,…

ES,DS,CS مي تFوان هرکFدام از ثبات هFا segment_nameکه

برچسFب دسFتور اسFمبلر SEGMENT_NAME بFوده و SSيFا

SEGMENT.است

Page 332: اصول اساسی برنامه نويسی به زبان اسمبلی

بFه عالمFتي برخFورد نمايFد کFه در سFگمنتي کFه MASMچنانچFه

معFرفي شFده اسFت، ASSUMEاسFم آن در دسFتور اسFمبلر

وجFود نداشFته بشFاد، آنگFاه اسFمبلر يFک پيغFام خطFا توليFد خواهFد

نمود.

يک برنامFه کFد منبFع زبFان اسFمبلي ممکن اسFت داراي چنFدين

باشFFد. اين مطلب بخصFFوص در ASSUMEدسFFتور اسFFمبلر

مFورد برنامه هFاي طFوالني کFه حFاوي روال هFاي بسFياري هسFتند

صFحيح اسFت. همFانطور کFه دسFتورات پFويش مي شFوند، اسFمبلر

از جديFدترين اطالعFاتي کFه بFه ثبFات سFگمنت نسFبت داده شFده

است، استفاده مي کند.

Page 333: اصول اساسی برنامه نويسی به زبان اسمبلی

خواسFFته شFFود کFFه از MASMگاهي اوقFFات الزم اسFFت کFFه از

فFرض قبلي در مFورد ثبFات سFگمنت صFرفنظر کنFد و هيچ فFرض

جديFدي هم در نظFر گرفتFه نشFود، در چFنين حFالتي مي تFوان از

به صورت زير استفاده نمود:ASSUMEدستور اسمبلر

Segment_register: NOTHING

Page 334: اصول اساسی برنامه نويسی به زبان اسمبلی

يک اسFمبلر بFه طFور معمFول شFمارنده مFوقعيت را از ابتFداي هFر

سFگمنت از صFفر شFورع کFرده و آن را بFه تعFداد بايت هFاي الزم

بFFراي هFFر دسFFتورالعمل افFFزايش مي دهFFد. مي تFFوان از اسFFمبلر

خواسFFت کFFه بFFراي مقFFدار ابتFFدايي شFFمارنده مFFوقعيت، مقFFدار

و بسFياري از اسFمبلرهاي ديگFر MASMخاصFي را درنظFر بگFيرد.

اسFFتفاده مي نماينFFد. OrgبFFراي اين منظFFور از دسFFتور اسFFمبلر

شکل کلي اين دستور اسمبلر به صورت زير است:

ORG value

بFه MASM يFک آفسFت را مشFخص مي کنFد. وقFتي valueکه در آن

برخFورد مي نمايFد، شFمارنده مFوقعيت را بFا ORGدسFتور اسFمبلر

مقدار مشخص شده پرمي نمايد.

Page 335: اصول اساسی برنامه نويسی به زبان اسمبلی

MASM مبلرFتورات اسFدس EVEN و ALIGN ،دFه مي کنFرا عرض

اين دسFFFتورات اسFFFمبلر بFFFر روي شFFFمارنده مFFFوقعيت اثFFFر

مي گذارند.

o دسFتور اسFمبلر بFه DW همFراه بFا دسFتور اسFمبلر EVENمعمFوال

کFار مي رود تFا يFک کلمFه را تعريFف نمايFد. اگFر شFمارنده مFوقعيت

هيچ اثFري نخواهFد داشFت EVENزودج باشFد دسFتور اسFمبلر

يFFFک MASMولي اگFFFر شFFFمارنده مFFFوقعيت فFFFرد باشFFFد،

( را درج مي کنFFد تFFا 90 )بFFايت تکي برابFFر nopدسFFتورالعمل

زوج باشد.DWشمارنده موقعيت در زمان اسمبل شدن

Page 336: اصول اساسی برنامه نويسی به زبان اسمبلی

باشFد. TITLEهر فايFل منبFع مي توانFد داراي يFک دسFتور اسFمبلر

اين دستور داراي ساختار زير است:

TITLE text

کFاراکتر 60 هFر رشFته اي از کاراکترهFا تFا حFداکثر textکه در آن

اسFFت. رشFFته اي کFFه بFFه وسFFيله اين دسFFتور اسFFمبلر مشFFخص

مي شFFود در دومين خFFط هFFر صFFفحه از فايFFل ليسFFت اسFFمبلي

نوشته مي شود.

Page 337: اصول اساسی برنامه نويسی به زبان اسمبلی

فصل دوازدهم

ماكروها و اسمبلي شرطي

Page 338: اصول اساسی برنامه نويسی به زبان اسمبلی

مطالب اين فصل

تعريف و بسط ماكروهااسمبلي شرطي ماكروهايIO.H

Page 339: اصول اساسی برنامه نويسی به زبان اسمبلی

تعريف و بسط دادن ماکروها

اي تشFFکيل دهنFFده هاسFFمبلر يFFک مFFاکرو را بFFه دسFFتورالعمل

مFاکروي مزبFور بسFط داده و سFپس اين دسFتورالعمل هاي جديFد

را اسمبل مي کند.

Page 340: اصول اساسی برنامه نويسی به زبان اسمبلی

تعريFف يFک مFاکرو شFبيه تعريFف يFک روال در يFک زبFان سFطح بFاال

مي باشد.

خط اول، نFFام مFFاکروي مFFوردنظر و ليسFFت پارامترهFFا را ذکFFر

مي کنFFFد؛ قسFFFمت اصFFFلي تعريFFFف يFFFک مFFFاکرو متشFFFکل از

دسFFتورالعمل هايي اسFFت کFFه طFFرز عمFFل مFFاکروي مربFFوط را

برحسب پارامترهاي آن بيان مي کند.

يک مFFاکرو همچFFنين ماننFFد يFFک روال زبان هFFاي سFFطح بFFاال

فراخFواني مي شFود. نFام مFاکروي مFوردنظر و بFه دنبFال آن ليسFت

آرگومان ها ذکر مي گردد.

Page 341: اصول اساسی برنامه نويسی به زبان اسمبلی

تفاوت روال و ماکرو:

فراخFواني يFک روال در يFک زبFان سFطح بFاال بFه تعFدادي دسFتورالعمل هاي

، callمربFوط بFه انتقFال دادن آرگومان هFاي ذکFر شFده در دسFتورالعمل

کامپايل مي شود.

o بFFه دسFFتورالعملهاي داده شFFده در تعريFFف فراخFFواني يFFک مFFاکرو عمال

مFFاکروي مزبFFور بسFFط داده شFFده و آرگومان هFFا جFFايگزين پارامترهFFاي

استفاده شده در تعريف ماکروي مربوط مي گردد.

کد يFک مFاکرو بFا هFر بFار فراخFواني آن تکFرار مي شFود، امFا تنهFا يFک نسFخه

از کد يک روال وجود دارد.

با توجFه بFه اينکFه هيچگونFه بFاال سFري بFراي انتقFال دادن پارامترهFا يFا بFراي

o ماکروهFا سFريعتر از ret و callدسFتورالعمل هاي وجFود نFدارد، معمFوال

o بFه بهFاي طFوالني تFر فراخFواني روال هFا اجFرا مي شFوند ولي اين معمFوال

شدن کد هدف در مورد فراخواني ماکروها، صورت مي گيرد.

Page 342: اصول اساسی برنامه نويسی به زبان اسمبلی

ENDM و MACROتعريFف يFک مFاکرو در بين دسFتورات

قرار داده مي شود.

شکل تعريف يک ماکرو به صورت زير مي باشد.

نام MACRO ليست پارامترها

دستورالعملهاي زبان اسمبلي

ENDM

تعريFف يFک مFاکرو مي توانFد در هFر جFاي برنامFه اسFمبلي ذکFر

شFود بFه شFرط اينکFه اين تعريFف قبFل از فراخواني هFاي آن

.بيايد

Page 343: اصول اساسی برنامه نويسی به زبان اسمبلی

اسمبلي شرطي

مواردي که مورد استفاده مي تواند قرار بگيرد:

o متفFاوتي • مواقعي کFه برنFامه نويس مي خواهFد کFه اشFکال نسFبتا

از يک برنامه يا يک روال را توليد نمايد.

زمFاني کFه برنFامه نويس بخواهFد در سFطح زبFان ماشFين عمليFات •

ورودي يFا خFروجي را انجFام دهFد کFه تنهFا آدرس درگاه هFاي مFورد

استفاده در ماشين هاي مختلف تغيير کند.

زمFاني کFه بسFط يFک مFاکرو برحسFب تعFداد و نFوع آرگومان هFا

تغيير پيدا مي کند.

Page 344: اصول اساسی برنامه نويسی به زبان اسمبلی

مي گويFد کFه يFک پيغFامي را روي MASM بFه OUT%دسFتور

o صFفحه نمFايش مي باشFد، دسFتگاه خFروجي اسFتاندارد کFه معمFوال

چاپ نمايد:

%OUT message

مي توانFFد مجمFFوعه اي از کاراکترهFFا از جملFFه messageکه

کFFاراکتر خFFالي و عالئم اماليي باشFFد. اسFFتفاده از دسFFتور

%out.منحصر به ماکروها يا اسمبلي شرطي نيست

Page 345: اصول اساسی برنامه نويسی به زبان اسمبلی

IO.Hماکروها فايل

بFراي ارائFه دسFتيابي صFحيح و آسFان بFه IO.HماکروهFاي فايFل

دستگاه هاي ورودي و خروجي استاندارد، طراحي شده اند.

بFاعث جلوگFيري از ليسFت شFدن تمFام کFد منبFع XLISTدسFتور

مي گردد.IO.Hبه ويژه محتواي فايل

روال هFاي خFارجي فراخFواني شFده توسFط EXTRNدسFتور

ماکروها را معرفي مي کند.