2011-03-24 11 views
0

그래서 MIPS 어셈블리 코드로 부동 소수점 추가가 어떻게 작동하는지 이해하는 데 도움이되는 프로그램을 작성하려고합니다. 부동 소수점 숫자가 1 비트 부호, 8 비트 지수 및 23 비트 분수로 어떻게 분리되는지 이해합니다. 나는 사용자로부터 두 개의 입력을 얻는 프로그램을 작성했고, mtc1과 mfc1 (입력과 출력을위한 것)을 제외한 부동 소수점 명령을 사용하지 않고 그것들을 더한다. 내 코드는 버그가 있습니다. 왜냐하면 1 + 2를 더하면 2.74804688이 생기기 때문입니다. 나는 여전히 코드를 디버깅하려고하지만 문제를 파악하지 못하는 것 같습니다. 누구든지 도울 수 있다면 크게 감사하겠습니다. Mips 부동 소수점 추가

THIS

는 MY 코드 (사용자 입력을 제외한 ... 제 부동 소수점 값은 $의 S0이며, 및 $ S1에서 두 번째) 특히 MIPS 약

#Integer implementation of floating-point addition 
#Initialize variables 
add $s0,$t0,$zero #first integer value 
add $s1,$t1,$zero #second integer value 
add $s2,$zero,$zero #initialize sum variable to 0 
add $t3,$zero,$zero #initialize SUM OF SIGNIFICANDS value to 0 

#get EXPONENT from values 
sll $s5,$s0,1 #getting the exponent value 
srl $s5,$s5,24 #$s5 = first value EXPONENT 

sll $s6,$s1,1 #getting the exponent value 
srl $s6,$s6,24 #$s6 = second value EXPONENT 

#get SIGN from values 
srl $s3,$s0,31 #$s3 = first value SIGN 
srl $s4,$s1,31 #$s4 = second value SIGN 

#get FRACTION from values 
sll $s7,$s0,9 
srl $s7,$s0,9 #$s7 = first value FRACTION 
sll $t8,$s1,9 
srl $t8,$s1,9 #$t8 = second value FRACTION 

#compare the exponents of the two numbers 
compareExp: ###################### 

beq $s5,$s6, addSig 
blt $s5,$s6, shift1 #if first < second, go to shift1 
blt $s6,$s5, shift2 #if second < first, go to shift2 
j compareExp 

shift1: #shift the smaller number to the right 
srl $s7,$s7,1 #shift to the right 1 
addi $s5,$s5,1 
j compareExp 

shift2: #shift the smaller number to the right 
#srl $s0,$s0,1 #shift to the right 1 
#j compareExp 
srl $t8,$t8,1 #shift to the right 1 
addi $s6,$s6,1 
j compareExp 

addSig: 

add $t3,$s7,$t8 #Add the SIGNIFICANDS 

li $v0, 4 
la $a0, sum 
syscall 

li $v0, 1 
move $a0, $t3 
syscall 

j result 

result: 
li $v0, 4 
la $a0, newline 
syscall 

sll $t4,$s3,31 #SIGN 
#FRACTION 
sll $t5,$s6,23 #EXPONENT 
add $t6,$t4,$t5 
add $t6,$t6,$t3 

li $v0, 4 
la $a0, sum2 
syscall 

li $v0, 1 
move $a0, $t6 
syscall 

li $v0, 4 
la $a0, newline 
syscall 

li $v0, 4 
la $a0, sum2 
syscall 

li $v0,2 
mtc1 $t6,$f12 
syscall 
jr $31 
# END OF PROGRAM 

답변

0

확실하지, 그러나 종종 부동 포인트 값은 분수의 최상단 비트 바로 앞에 암시 된 "1"비트를 갖습니다. 0은 묵시적인 비트가없는 특별한 경우입니다.