تنفيذ عدد صحيح لإضافة النقطة العائمة في MIPS [مغلق]
سؤال
الخلاصة هدفك لهذا المشروع هو تنفيذ محاكاة البرمجيات لإضافة النقطة العائمة لأرقام النقاط العائمة 32 بت (الدقة الفردية) في MIPs.
الإدخال/الإخراج سوف يطالب البرنامج المستخدم برقمين نقطتين عائم.بعد ذلك سيحسب ويعرض المبلغ.فيما يلي مثال I/O من أربعة أشواط (تحتاج فقط إلى المطالبة مرة واحدة لكل عملية تنفيذ):
أدخل قيمة الفاصلة العائمة:1 أدخل قيمة نقطة عائمة:1 2.0000000000000000
أدخل قيمة الفاصلة العائمة:2.2 أدخل قيمة الفاصلة العائمة:1.4 3.599999904632568400
قضايا حل هنا بعض القضايا: كيف ستتعامل مع القيم السلبية؟ كيف ستعمل خوارزمية التطبيع الخاصة بك؟ ما هي أسهل طريقة للوصول إلى حقول البت داخل الكلمة؟
*لا يجوز لك استخدام أي تعليمات الفاصلة العائمة لهذا المشروع !!*
لقد فعلت الشيء نفسه في الأعداد الصحيحة ولكني بحاجة إلى بعض المساعدة في النقطة العائمة دون استخدامها!.Data ST1:.asciiz " nin binary: n" st2:.asciiz " nenter 1st integer:" ST3:.asciiz " nenter 2nd integer:" ST4:.asciiz " إجابتك هي:"ST5:.asciiz " n ---------------------------------- n" st6:.اسكيز " "
.text
main:
مطالبة المستخدم بإدخال العدد الصحيح الأول
la $a0,st2 # Put the address of the string in $a0
li $v0, 4
syscall
li $v0, 5 # Code for input integer
syscall
move $s1, $v0 #storing first integer in s1
مطالبة المستخدم بإدخال العدد الصحيح الأول
la $a0,st3 # Put the address of the string in $a0
li $v0, 4
syscall
li $v0, 5 # Code for input integer
syscall
move $s2, $v0 #storing second integer in s2
إضافة الأعداد الصحيحة
add $s0,$s2,$s1 #add and store in t3
عرض النتيجة
la $a0,st4 #text to display
li $v0,4
syscall
li $v0,1 #for printing int
move $a0,$s0 # move s0 to a0 to print s0
syscall
la $a0,st1
li $v0,4
syscall
التحرك في السجلات المؤقتة
move $t3,$s0
move $t2,$s2
move $t1,$s1
عداد للرقم الأول المراد طباعته بالنظام الثنائي
li $s5,32 # set up counter
loop1:
rol $t1,$t1,1 #roll the bit left by on bit high to low
and $t0,$t1,1 #mask off low bit
add $t0,$t0,48 #combine t0 with 48 to form 1 or 0
move $a0,$t0 #output ascii character
li $v0,11
syscall
li $t5,1
sub $s5,$s5,$t5 #decrement counter
bne $s5,$zero,loop1 #keep loop if not zero
طباعة خط
la $a0,st6
li $v0,4
syscall
عداد للرقم الثاني في ثنائي
li $s5,32
loop2:
rol $t2,$t2,1 #roll the bit left by on bit high to low
and $t0,$t2,1 #mask off low bit
add $t0,$t0,48 #combine t0 with 48 to form 1 or 0
move $a0,$t0 #output ascii character
li $v0,11
syscall
li $t5,1
sub $s5,$s5,$t5 #decrement counter
bne $s5,$zero,loop2 #keep loop if not zero
طباعة خط منقط
la $a0,st5 #line
li $v0,4
syscall
عداد للنتيجة في ثنائي
li $s5,32
loop:
rol $t3,$t3,1 #roll the bit left by on bit high to low
and $t0,$t3,1 #mask off low bit
add $t0,$t0,48 #combine t0 with 48 to form 1 or 0
move $a0,$t0 #output ascii character
li $v0,11
syscall
li $t5,1
sub $s5,$s5,$t5 #decrement counter
bne $s5,$zero,loop #keep loop if not zero
أغلق البرنامج
li $v0,10 #close the program
syscall
.النهاية الرئيسية
المحلول
1- استخدم IEEE 754 لتمثيل أرقام نقاط العائمة 2- إضافة ما يصل إلى الأسس ، ثم أضف ما يصل إلى الأهمية ، تحقق مما إذا كنت بحاجة إلى زيادة الأسس 3- التعامل مع العلامات السلبية (مكملة 2 ، بت واحد واحد يمثل علامة الأولى)
هذه مشكلة سهلة للغاية وأنا أتفق مع التعليقات المذكورة أعلاه ، لقد اعتقدت فقط أنه يمكنك استخدام بعض التلميحات الجيدة حظًا سعيدًا!
نصائح أخرى
.data
st1: .asciiz "\nIn binary:\n"
st2: .asciiz "\nEnter 1st Integer:"
st3: .asciiz "\nEnter 2nd Integer:"
st4: .asciiz "\nYour answer is: "
st5: .asciiz "\n--------------------------------\n"
st6: .asciiz "\n"
.text
main:
مطالبة المستخدم بإدخال العدد الصحيح الأول
la $a0,st2 # Put the address of the string in $a0
li $v0, 4
syscall
li $v0, 5 # Code for input integer
syscall
move $s1, $v0 #storing first integer in s1
مطالبة المستخدم بإدخال العدد الصحيح الأول
la $a0,st3 # Put the address of the string in $a0
li $v0, 4
syscall
li $v0, 5 # Code for input integer
syscall
move $s2, $v0 #storing second integer in s2
إضافة الأعداد الصحيحة
add $s0,$s2,$s1 #add and store in t3
عرض النتيجة
la $a0,st4 #text to display
li $v0,4
syscall
li $v0,1 #for printing int
move $a0,$s0 # move s0 to a0 to print s0
syscall
la $a0,st1
li $v0,4
syscall
التحرك في السجلات المؤقتة
move $t3,$s0
move $t2,$s2
move $t1,$s1
عداد للرقم الأول المراد طباعته بالنظام الثنائي
li $s5,32 # set up counter
loop1:
rol $t1,$t1,1 #roll the bit left by on bit high to low
and $t0,$t1,1 #mask off low bit
add $t0,$t0,48 #combine t0 with 48 to form 1 or 0
move $a0,$t0 #output ascii character
li $v0,11
syscall
li $t5,1
sub $s5,$s5,$t5 #decrement counter
bne $s5,$zero,loop1 #keep loop if not zero
طباعة خط
la $a0,st6
li $v0,4
syscall
عداد للرقم الثاني في ثنائي
li $s5,32
loop2:
rol $t2,$t2,1 #roll the bit left by on bit high to low
and $t0,$t2,1 #mask off low bit
add $t0,$t0,48 #combine t0 with 48 to form 1 or 0
move $a0,$t0 #output ascii character
li $v0,11
syscall
li $t5,1
sub $s5,$s5,$t5 #decrement counter
bne $s5,$zero,loop2 #keep loop if not zero
طباعة خط منقط
la $a0,st5 #line
li $v0,4
syscall
عداد للنتيجة في ثنائي
li $s5,32
loop:
rol $t3,$t3,1 #roll the bit left by on bit high to low
and $t0,$t3,1 #mask off low bit
add $t0,$t0,48 #combine t0 with 48 to form 1 or 0
move $a0,$t0 #output ascii character
li $v0,11
syscall
li $t5,1
sub $s5,$s5,$t5 #decrement counter
bne $s5,$zero,loop #keep loop if not zero
أغلق البرنامج
li $v0,10 #close the program
syscall
.النهاية الرئيسية