วันศุกร์ที่ 4 กุมภาพันธ์ พ.ศ. 2554

Exersice 5 - cs621

การแปลง code จาก C Function เป็น MIPS Assembly code
Code C Function

int factorial( int n ){
int f = 1;
if(n == 0) return 1;
do{
f = f * n;
n--;
while( n != 0 );
return f;
}

แปลง code จาก C Function ให้เป็น MIPS assembly code

fact:
add $a0 , $zero , 5
addi $v0 , $zero , 1
jal loop
jal exit

loop:
mul $v0 , $v0 , $a0
addi $a0 , $a0 , -1
bne $a0 , $zero , loop
jr $ra

exit:






Code C Function

int fact( int n ){
if ( n == 0 ) return 1;
else return n * fact( n – 1 );
}

แปลง code จาก C Function ให้เป็น MIPS assembly code

จาก Source code ของ MIPS ทำการประกาศ ฟังก์ชั่นชื่อว่า fact ภายในฟังก์ชั่น จะกำหนด stack เพื่อ save ค่า ของ ตัวแปรที่รับเข้ามา คือ n และ register ที่จะ return กลับไป

fact:
          addi    $sp, $sp, -8   
          sw      $ra, 4($sp)
          sw      $a0, 0($sp)

เทียบค่าค่าที่รับเข้ามาถ้าไม่เท่ากับ 0 ให้ไปี่ L1

            bne     $t0, $zero, L1

ถ้าค่าที่รับเข้ามาเท่ากับ 0 จะทำการ return ค่า 1 เก็บค่า 2 ค่าเข้ามาใน stack และคืนค่าไปที่ function

            addi    $v0, $zero, 1
          addi    $sp, $sp, 8    
          jr        $ra              

ถ้า n ไม่เทากับ 0 ให้ n เท่ากับ n-1 จากนั้น reurn ค่าไปที่ function fact

L1:      addi    $ao, $ao, -1
          jal      fact
            lw       $ao, 0($sp)
          lw       $ra, 4($sp)
          addi    $sp, $sp, 8

คูณค่า return n * Fact(n-1)

            mul     $v0, $a0, $v0

return ค่าไปที่ function
           
            jr        $ra


ไม่มีความคิดเห็น:

แสดงความคิดเห็น