سلام
من چطوری میتومنم از دستورات FPU در emu8086 برای اعداد ریاضی که اعشاری هستند استفاده کنم
سلام
من چطوری میتومنم از دستورات FPU در emu8086 برای اعداد ریاضی که اعشاری هستند استفاده کنم
emu8086 اعداد اعشاری رو ساپورت نمیکنه ( در حقیقت emu فقط دستورات 8086 رو ساپورت میکنه ولی اعداد اعشاری جز دستورات 8087 هستند ) باید از یک اسمبلر دیگه استفاده کنید
با NASM میشه ( مطمئن نیستم ولی چون با MASM میشه حتما با اینم میشه )
اینکه گفتم ساپورت نمیکنه اینه که یه دستور خاص برای محاسبه دو عدد اعشاری نداره
fadd هست تو 8087 که میاد دوتا floating point رو باهم جمع میکنه
هرجا هم که دیدی عدد اعشاری رو داره روش عملیات انجام میده در emu
کاری که میکنه اینه که وقتی به دات رسید ( DOT ) اونو ذخیره نمیکنه و ایندکس دات رو یه جا ذخیره میکنه و ادامه عدد رو میگیره بعد عملیاتو روش انجام میده اخرشم میاد اون دات رو جای مناسب قرار میده
یعنی تو emu چیزی مثل اینو 20.1 , 10.4 رو جمع کنی باهم اول باید بشه 201 , 104 بعد اینارو جمع کنی
بعدشم بیایی جای مناسب دات رو پیدا کنی
الان من عدد را بدون اعشار محاسبه کردم و نتیجه را داخل یک متغییر قرار دادم.
من چطوری میتونم دات را در جای مناسب بذارم
مثلا برای جمع یا ضرب توجه کنید
در مورد با کار با رشته که چطوری بین دو تا عدد یک دات بگذارم را نیز راهنمایی بدید
12.6 + 16.9
int:295
float:29.5
==============================================
12.6 * 16.9
int:21294
float:212.94
آخرین ویرایش به وسیله Collector : دوشنبه 13 خرداد 1392 در 08:32 صبح
اینکه چجوری دات رو پیدا کنید یه متغییر میزارید جای دات اول و یه متغییر هم میزارید جای دات دوم رو پیدا میکنید ( پیدا کردنش هم یا همون موقع که کاربر رشته رو وارد میکنه یا اینکه پس از اینکه رشته رو وارد کرد میگردید پیداش میکنید ) بعد حالا اخرش بسته به اینکه دارید ضرب یا جمع یا غیره رو انجام میدید میایید جای دات رو پیدا میکنید
مثلا برای ضرب محل دات میشه : ایندکس دات اول + ایندکس دات دوم که تو مثالی که شما زدین میشه 1 + 1 = 2 از انتها !!!
این لینک رو ببینید فکر میکنم بهتون کمک کنه هرچند که باگ داره ولی تو مفهوم فکر کنم راه گشا باشه براتون :)
برای ضرب که روشن شده است من اون لینک را نگاه کردم اما برای + - / هنوز متوجه نشدم که جای دات کجاست
آخرین ویرایش به وسیله Collector : سه شنبه 14 خرداد 1392 در 08:53 صبح
جای مناسبه تو جمع میشه : مکان دات اول و مکان دات دوم رو مقایسه میکنی هرکدوم که بزرگتر بود میشه محل دات در رشته نهایی ( حال اینجا ممکنه بعضی جاها به این بربخوری که طول رشته بعد از ممیز برای هر دو یکسان نباشه یعنی 101.2 رو با 10.21 جمع کنی الگوریتمی که گفتم دیگه جواب نمیده باید عددی که ایندکس دات کوچکتری داره رو ضرب در 10 کنی تا جایی که طول رشته بعد از دات ها باهم برابر بشن یعنی تو مثالی که زدم میشه 10.21 و 101.20 حالا باز مثل قبل دات رو حذف کن جمع رو انجام بده محل دات هم میشه محل دات بزرگتر )
تفریق و تقسیم هم مشابه همین حالته با یکم تفاوت های جزمی
در مورد منها که گفتید مشابه جمع هست. ولی الان مشخص نیست که کجا باید دات بزارم
و یا در مثال زیر که صحیح و اعشاری آن هیچ ربطی به هم ندارند که بخواهیم از دات استفاده کنیم46.6 = 144.6 - 191.5
176.9 = 14.6 - 191.5
و همچنین در مورد با این ضرب که در مثال زیر تا ضرب در 7 درست کار میکند ولی از آن بیشتر خیر2.41 - 642.7
int:6186
float:640.29
در مورد با تقسیم مثلا 5/2 که میشود 2.5 من چطوری باید قسمت اعشار را بدست آوریم؟87.50 = 7 * 12.5
100 = 10.00 = 8 * 12.5
آخرین ویرایش به وسیله Collector : سه شنبه 14 خرداد 1392 در 20:56 عصر
حالا محل دات چون تعداد ارقام بعد از اعشار هر دو یکسان است ( برای هر دو یک رقم بعد از اعشار داریم .6 , .5 ) میشه محل محل دات یکی از اونا یعنی 1191.5-144.6 ====> 1915-1446 = 469
حالا چون تو این یکی تعداد ارقام بعد از اعشار یکی نیست ( 0.41 , .7 ) اون رقمی که تعداد اعشارش کمتره رو صفر به انتهاش اضافه میکنی یعنی .7 رو صفر به انتهاش اضافه میکنی میشه .70 حالا باز مثل قبل دات ها رو حذف میکنی و نتیجه رو حساب میکنی642.7-2.41
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 در 16:13 عصر
برای اینکار دوتا متغییر اضافی باید تعریف کنی یکی xSign یکی ySign که یکیش واسه علامت x یکیش برای علامت y هست
حالا درصورتی که عددی که داری وارد میکنی با - منفی شروع شد xSign رو 1 قرار میدی ( درحالت پیش فرض صفر میزاری که یعنی مثبته )
خوب حالا 4تا حالت رو چک میکنی
اولی مثبت دومی مثبت
اولی مثبت دومی منفی
اولی منفی دومی مثبت
اولی منفی دومی منفی
حالا عملیاتتو با توجه به اینا بدون در نظر گرفتن علامت انجام میدی و در اخر علامت رو تاثیر میدی