Gọi hàm nhiều cấp trong MIPS

G?i hàm trong hàm, đ?i các ngôn ng? b?c cao th? quá d?, c?ng tương t? như g?i hàm ? chương tr?nh chính, nhưng trong MIPS th? không đơn gi?n như v?y, chúng ta ph?i x? lí trư?ng h?p thanh ghi $ra b? thay đ?i sau m?i l?n g?i hàm. Cách gi?i quy?t dùng 1 thanh ghi t?m đ? lưu tr? l?i giá tr? $ra t? ra không kh? quan, s? lư?ng thanh ghi trong MIPS là có h?ng (ch? 32 thanh ghi), do đó chúng ta s? lưu nó trên b? nh? nh? stack. V?y th? có g?i hàm n c?p th? v?n không s? b? "l?c l?i" v? thanh ghi $ra b? thay đ?i. Chúng ta l?y 1 ví d? như sau:


 Viêt b?ng C:

#include <conio.h> 
#include <stdio.h>  
int Nhan (int a, int b) 

  int n=0; // O day chi xet don gian la a, b cung duong.   while (b>0)   {     n +=a;     b--;   }   return n; 
}  
int TongBinhPhuong(int a, int b) 

  int n = Nhan (a,a);// Goi ham Nhan   
int m = Nhan (b,b); // Goi ham Nhan  
 return n+m; 

void main() 

  int n,m;  
 printf ("Nhap vao so n:");  
 scanf ("%d", &n);  
 printf ("Nhap vao so m:");  
 scanf ("%d", &m);  
 printf ("Tong binh phuong nhan duoc la: %d", TongBinhPhuong(n,m)); 


Vi?t b?ng MIPS:


.data  
 st_Nhapi:.asciiz "Nhap vao n: "  
 st_Nhapj:.asciiz "Nhap vao m: " 
.text 
main:   
la $a0, st_Nhapi   
addi $v0, $0, 4   
syscall  
 addi $v0, $0, 5  
 syscall   
addi $s0, $v0, 0   
  la $a0, st_Nhapj  
 addi $v0, $0, 4  
 syscall  
 addi $v0, $0, 5  
 syscall 
  addi $s1, $v0, 0   
  add $a0, $s0, 0   
add $a1, $s1, 0  
 jal SumS   
  addi $a0, $v0, 0  
 addi $v0, $0, 1  
 syscall 
exit:    addi $v0, $0, 10 
  syscall 
SumS:   
#luu lai thang $a1, $ra  
 addi $sp, $sp, -8  
 sw $a1, 4($sp)   
sw $ra, 0($sp)  
 #Luu xong   
addi $a1, $a0, 0  
 jal Nhan  
 #phuc hoi thang $a1, $ra  
 addi $sp, $sp, -4  
 sw $v0, 0($sp)  
 lw $a1, 8($sp)  
 addi $a0, $a1, 0  
 jal Nhan   
addi $a1, $v0, 0  
 lw $a0, 0($sp)  
 lw $ra, 4($sp) 
  addi $sp, $sp, 12 
  add $v0, $a0, $a1  
 jr $ra 
Nhan:  
 addi $sp, $sp, -4  
 sw $ra, 0($sp)  
 addi $v0, $0, 0  
 LapNhan:    
 slt $t0, $0, $a1    
 beq $t0, $0,KTLapNhan    
 add $v0, $v0, $a0  
   addi $a1, $a1, -1  
   j LapNhan  
 KTLapNhan:   
lw $ra, 0($sp)   
addi $sp, $sp, 4  
 jr $ra

Nhận xét

Bài đăng phổ biến từ blog này

Đệ quy trong MIPS