برنامه فیبوناچی در اسمبلی

HO3EINBABAIE

New Member
دوستان سلام وقت بخیر ، مشه راجب اتفاقی که تو حلقه برنامه زیر داره میفته بهم توضیح بدین ؟ ممنون

Capture.PNG
 

the_king

مدیرکل انجمن
دوستان سلام وقت بخیر ، مشه راجب اتفاقی که تو حلقه برنامه زیر داره میفته بهم توضیح بدین ؟ ممنون

مشاهده پیوست 114696
ابتدا آدرس شروع سگمنت داده (DATA) به AX منتقل شده. این آدرس شروع حافظه ای است که داده ها (مثلا اعداد سری فیبوناچی) در اون قرار میگیره :
کد:
MOV     AX, @DATA
که در ادامه با دستور بعدی در DS قرار میگیره. AX این وسط فقط یک واسطه برای انتقال مقدار به DS شده.
کد:
MOV     DS, AX
دلیل واسطه قرار دادن AX اینه که نمیشه با یک دستور مستقیم MOV DS, @DATA در DS مقدار اون آدرس حافظه رو قرار داد.
برای همین اول آدرس به AX منتقل میشه و بعد مقدار AX در DS قرار میگیره.
حالا که آدرس سگمنت برای DS تنظیم شده، آدرس آفست آرایه RES که در سگمنت DATA قرار داره رو در SI قرار می دهیم :
کد:
LEA     SI, RES
یعنی الان DS:SI که ترکیب سگمنت و آفست هستند به ابتدای حافظه آرایه RES اشاره می کنند.
تعداد تکرار حلقه ای که اعداد فیبوناچی را تولید می کند یک عدد است و از قبل در CNT مشخص شده، آنرا در CX قرار می دهیم :
کد:
MOV     CX, CNT
دو عدد آغازین سری فیبوناچی ارقام 0 و 1 هستند. آنها را در AX و BX قرار می دهیم.
توجه کنید که آخرین عدد سری فیبوناچی که فعلا تولید شده BX ئه که یک است و AX عدد قبل از اونه :
کد:
MOV     AX, 00H
MOV     BX, 01H
این قاعده رو در ادامه رعایت می کنیم، BX آخرین عدد تولید شده و AX عددی که قبل از اون تولید شده بود.
در ادامه حلقه ای شروع میشه که مدام دو عدد آخر سری فیبوناچی که AX و BX خواهند بود رو جمع می کنه تا عدد بعدی رو بسازه.
اسم برچسبی که موقعیت شروع حلقه رو مشخص می کنه L1 قرار می دهیم :
کد:
L1:
دو عدد با هم جمع می شوند تا عدد جدید موقتا در AX ایجاد بشه، در BX ایجادش نمی کنیم چون مقدار BX رو هنوز لازم داریم :
کد:
ADD     AX, BX
این عدد جدید باید در انتهای آرایه RES ثبت بشه، یعنی جایی که DS:SI اشاره می کنه، نیازی نیست که در دستور به DS اشاره بشه :
کد:
MOV     [SI], AX
عدد BX قبلا آخرین عدد تولید شده بود، ولی الان که عدد جدید رو در AX ایجاد کرده ایم دیگه آخرین نیست و باید در AX (که عدد قبل از آخرین ئه) قرار بگیره :
کد:
MOV     AX, BX
و در BX هم که همیشه باید آخرین عدد تولید شده باشه :
کد:
MOV     BX, [SI]
ما عدد جدید رو در خانه ای از آرایه که DS:SI آدرس حافظه اون بود قرار دادیم که میخواهیم حفظ بشه، ولی حالا اگر مقدار SI رو در همین موقعیت نگه داریم، دفعه بعدی که حلقه اجرا شد، عدد جدیدی که میسازه روی همین عدد قبلی ذخیره میشه، که همچین چیزی رو نمیخواهیم.
ما SI رو یک واحد افزایش می دهیم تا عدد بعدی در خانه بعدی آرایه ذخیره بشه، نه روی عدد قبلی :
کد:
INC     SI
و حلقه رو تکرار می کنیم تا عدد بعدی در سری فیبوناچی ساخته بشه. LOOP بصورت خودکار مقدار CX رو یک واحد کم می کنه و تا وقتی اجرا میشه که CX به صفر برسه. یعنی حلقه نهایتا به تعداد CNT تکرار میشه :
کد:
LOOP    L1
وقتی حلقه تموم شد، CNT تا عدد از سری فیبوناچی (بعد از 0 و 1 ابتدایی) ساخته شده و در آرایه RES قرار گرفته اند.
 

جدیدترین ارسال ها

بالا