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:
Vi?t b?ng MIPS:
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
Đăng nhận xét