Я пишу простой код для теста.
#include <stdio.h>
int funadd(int a, int b){
int x = 0;
x = a + b;
return x;
}
int fun(int a, int b){
int y = 17;
int returnvalue = 0;
returnvalue = funadd(a, b);
returnvalue = returnvalue - y;
return returnvalue;
}
int main(){
int a = 32;
int b = 24;
int c = 0;
c = fun(a, b);
printf("%d\n", c);
return c;
}
И затем собираю его.
После сборки я понимаю, что в начале каждой функции есть какой-то раздел.
funadd:
.frame $fp,24,$31 # vars= 8, regs= 1/0, args= 0, gp= 8
.mask 0x40000000,-4
.fmask 0x00000000,0
.set noreorder
.set nomacro
...
fun:
.frame $fp,40,$31 # vars= 8, regs= 2/0, args= 16, gp= 8
.mask 0xc0000000,-4
.fmask 0x00000000,0
.set noreorder
.cpload $25
.set nomacro
...
main:
.frame $fp,48,$31 # vars= 16, regs= 2/0, args= 16, gp= 8
.mask 0xc0000000,-4
.fmask 0x00000000,0
.set noreorder
.cpload $25
.set nomacro
Я хочу знать, что означает каждый раздел, как использовать эти разделы и почему они здесь. И почему они отличаются в разных функциях, таких как main и funadd.
И что Больше всего меня волнует, если я сам добавлю некоторые функции с помощью формы сборки в файл .s, который делает g cc, могу ли я игнорировать эти разделы и напрямую написать инструкции, например, начать с addiu $sp,$sp,-48
.
Может кто-нибудь объяснить это подробно или просто дать мне ссылку с подробным объяснением.
Я не знаком с MIPS. Спасибо.