ورود

View Full Version : حرفه ای: عدد اعشاری در emu8086



Collector
شنبه 11 خرداد 1392, 17:50 عصر
سلام
من چطوری میتومنم از دستورات FPU در emu8086 برای اعداد ریاضی که اعشاری هستند استفاده کنم

topcoder
شنبه 11 خرداد 1392, 23:07 عصر
emu8086 اعداد اعشاری رو ساپورت نمیکنه ( در حقیقت emu فقط دستورات 8086 رو ساپورت میکنه ولی اعداد اعشاری جز دستورات 8087 هستند ) باید از یک اسمبلر دیگه استفاده کنید

Collector
یک شنبه 12 خرداد 1392, 07:15 صبح
emu8086 اعداد اعشاری رو ساپورت نمیکنه ( در حقیقت emu فقط دستورات 8086 رو ساپورت میکنه ولی اعداد اعشاری جز دستورات 8087 هستند ) باید از یک اسمبلر دیگه استفاده کنید

کامپایلر NASM چی (نسخه 16 بیت) من فقط باید با همین دوتا کامپایلر استفاده کنم
یعنی استاد این طوری گفته
من چطوری میتونم این کار را انجام بدم

Collector
یک شنبه 12 خرداد 1392, 07:55 صبح
پس این کد Float که در examples های emu8086 هست چی؟ این چکار انجام میده
و همچنین این (http://forum.ustmb.ir/thread1133.html) و این (http://forum.ustmb.ir/thread1132.html) کد که مربوط به اعشاری هست.البته از هیچ کدام نتونستم استفاده کنم

topcoder
یک شنبه 12 خرداد 1392, 18:10 عصر
کامپایلر NASM چی (نسخه 16 بیت) من فقط باید با همین دوتا کامپایلر استفاده کنم
یعنی استاد این طوری گفته
من چطوری میتونم این کار را انجام بدم

با NASM میشه ( مطمئن نیستم ولی چون با MASM میشه حتما با اینم میشه )
اینکه گفتم ساپورت نمیکنه اینه که یه دستور خاص برای محاسبه دو عدد اعشاری نداره
fadd هست تو 8087 که میاد دوتا floating point رو باهم جمع میکنه
هرجا هم که دیدی عدد اعشاری رو داره روش عملیات انجام میده در emu
کاری که میکنه اینه که وقتی به دات رسید ( DOT ) اونو ذخیره نمیکنه و ایندکس دات رو یه جا ذخیره میکنه و ادامه عدد رو میگیره بعد عملیاتو روش انجام میده اخرشم میاد اون دات رو جای مناسب قرار میده

یعنی تو emu چیزی مثل اینو 20.1 , 10.4 رو جمع کنی باهم اول باید بشه 201 , 104 بعد اینارو جمع کنی
بعدشم بیایی جای مناسب دات رو پیدا کنی

Collector
یک شنبه 12 خرداد 1392, 20:15 عصر
الان من عدد را بدون اعشار محاسبه کردم و نتیجه را داخل یک متغییر قرار دادم.
من چطوری میتونم دات را در جای مناسب بذارم
مثلا برای جمع یا ضرب توجه کنید
در مورد با کار با رشته که چطوری بین دو تا عدد یک دات بگذارم را نیز راهنمایی بدید


12.6 + 16.9
int:295
float:29.5
==============================================
12.6 * 16.9
int:21294
float:212.94

topcoder
دوشنبه 13 خرداد 1392, 20:19 عصر
اینکه چجوری دات رو پیدا کنید یه متغییر میزارید جای دات اول و یه متغییر هم میزارید جای دات دوم رو پیدا میکنید ( پیدا کردنش هم یا همون موقع که کاربر رشته رو وارد میکنه یا اینکه پس از اینکه رشته رو وارد کرد میگردید پیداش میکنید ) بعد حالا اخرش بسته به اینکه دارید ضرب یا جمع یا غیره رو انجام میدید میایید جای دات رو پیدا میکنید
مثلا برای ضرب محل دات میشه : ایندکس دات اول + ایندکس دات دوم که تو مثالی که شما زدین میشه 1 + 1 = 2 از انتها !!!
این لینک (https://sites.google.com/site/sqlqassem/Home/dpi/dpi-exercise/assembly/prwzhhtkmylshdhmashynhsabasharytkmylshdhbatqrybatw dyhatfarsytmamykhtwt13901024)رو ببینید فکر میکنم بهتون کمک کنه هرچند که باگ داره ولی تو مفهوم فکر کنم راه گشا باشه براتون :)

Collector
سه شنبه 14 خرداد 1392, 08:37 صبح
برای ضرب که روشن شده است من اون لینک را نگاه کردم اما برای + - / هنوز متوجه نشدم که جای دات کجاست

topcoder
سه شنبه 14 خرداد 1392, 10:11 صبح
جای مناسبه تو جمع میشه : مکان دات اول و مکان دات دوم رو مقایسه میکنی هرکدوم که بزرگتر بود میشه محل دات در رشته نهایی ( حال اینجا ممکنه بعضی جاها به این بربخوری که طول رشته بعد از ممیز برای هر دو یکسان نباشه یعنی 101.2 رو با 10.21 جمع کنی الگوریتمی که گفتم دیگه جواب نمیده باید عددی که ایندکس دات کوچکتری داره رو ضرب در 10 کنی تا جایی که طول رشته بعد از دات ها باهم برابر بشن یعنی تو مثالی که زدم میشه 10.21 و 101.20 حالا باز مثل قبل دات رو حذف کن جمع رو انجام بده محل دات هم میشه محل دات بزرگتر )
تفریق و تقسیم هم مشابه همین حالته با یکم تفاوت های جزمی

Collector
سه شنبه 14 خرداد 1392, 10:29 صبح
در مورد منها که گفتید مشابه جمع هست. ولی الان مشخص نیست که کجا باید دات بزارم



46.6 = 144.6 - 191.5
176.9 = 14.6 - 191.5

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


2.41 - 642.7
int:6186
float:640.29

و همچنین در مورد با این ضرب که در مثال زیر تا ضرب در 7 درست کار میکند ولی از آن بیشتر خیر


87.50 = 7 * 12.5
100 = 10.00 = 8 * 12.5


در مورد با تقسیم مثلا 5/2 که میشود 2.5 من چطوری باید قسمت اعشار را بدست آوریم؟

topcoder
چهارشنبه 15 خرداد 1392, 12:00 عصر
191.5-144.6 ====> 1915-1446 = 469
حالا محل دات چون تعداد ارقام بعد از اعشار هر دو یکسان است ( برای هر دو یک رقم بعد از اعشار داریم .6 , .5 ) میشه محل محل دات یکی از اونا یعنی 1

642.7-2.41
حالا چون تو این یکی تعداد ارقام بعد از اعشار یکی نیست ( 0.41 , .7 ) اون رقمی که تعداد اعشارش کمتره رو صفر به انتهاش اضافه میکنی یعنی .7 رو صفر به انتهاش اضافه میکنی میشه .70 حالا باز مثل قبل دات ها رو حذف میکنی و نتیجه رو حساب میکنی
642.70-2.41 ====> 64029= 64270 - 241 =====> چون دو رقم بعد از اعشار داریم میشه 640.29
در مورد ضرب هم کاملا درسته :|
12.5 * 8 ==> 125*8 ==> 1000 چون رقم اول اعشار نداره و رقم دومت یک رقم اعشار داره پس میشه یک 1+0 یعنی یک رقم اعشار که نتیجه میشه 100.0


درتقسیم هم نتیجه باقیمانده تو ah یا dx ذخیره میشه دیگه
پس ah یا dx ( بسته به نوع پیاده سازی ) در 10 ضربش میکنی و یک شمارشگر هم میزاری ببینی چند بار در 10 ضرب میکنی عددتو و تعداد رقم های اعشارت میشه تعداد ضرب هایی که در 10 انجام دادی
مثلا 5/2
باقیمانده در ah ذخیره میشه 1 هست
یکبار در 10 ضرب میکنی میشه 10
حالا 10 رو تقسیم بر 2 میکنی چون ah برابر صفر میشه ( یعنی باقیمانده برابر صفر میشه ) دیگه عملیات تموم میشه و چون یکبار در 10 ضرب شده پس میشه یک رقم اعشار

Collector
پنج شنبه 16 خرداد 1392, 11:05 صبح
مشکل تقسیم حل شد
الان یک سوال داشتم برای عملیات روی اعداد منفی
اگر خروجی منفی شد میتونم تشخیص و نمایش بدم ولی نمیدونم چطوری عملیات روی دو تا عدد منفی انجام بدم
یعنی اگر اولین کاراکتر منفی بود چی چیزی را باید تغییر بدم

topcoder
پنج شنبه 16 خرداد 1392, 19:17 عصر
برای اینکار دوتا متغییر اضافی باید تعریف کنی یکی xSign یکی ySign که یکیش واسه علامت x یکیش برای علامت y هست
حالا درصورتی که عددی که داری وارد میکنی با - منفی شروع شد xSign رو 1 قرار میدی ( درحالت پیش فرض صفر میزاری که یعنی مثبته )
خوب حالا 4تا حالت رو چک میکنی
اولی مثبت دومی مثبت
اولی مثبت دومی منفی
اولی منفی دومی مثبت
اولی منفی دومی منفی
حالا عملیاتتو با توجه به اینا بدون در نظر گرفتن علامت انجام میدی و در اخر علامت رو تاثیر میدی