在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 9374|回复: 4

[求助] GCC中关于MIPS的函数调用的栈分配

[复制链接]
发表于 2010-11-24 12:25:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
下面是一个简单的C程序:
int max(int,int,int,int,int);
void main()
{
  int a=5;
  int b=6;
  int x=1;
  int y=2;
  int z=3;
  int c;
  c=max(a,b,x,y,z);
}
int max(int a,int b,int x,int y,int z)
{
  if(a>b)
    return a;
  else if(x>y)
    return x;
  else if (y>z)
    return y;
  else return z;
}


下面是GCC翻译成汇编后的主要代码:
main:
.frame $fp,56,$31  # vars= 24, regs= 2/0, args= 24, extra= 0
.mask 0xc0000000,-4
.fmask 0x00000000,0
subu $sp,$sp,56
sw $31,52($sp)
sw $fp,48($sp)
move $fp,$sp
jal __main
li $2,0x00000005  # 5
sw $2,24($fp)
li $2,0x00000006  # 6
sw $2,28($fp)
li $2,0x00000001  # 1
sw $2,32($fp)
li $2,0x00000002  # 2
sw $2,36($fp)
li $2,0x00000003  # 3
sw $2,40($fp)
lw $2,40($fp)
sw $2,16($sp)
lw $4,24($fp)
lw $5,28($fp)
lw $6,32($fp)
lw $7,36($fp)
jal max
sw $2,44($fp)


max:
.frame $fp,8,$31  # vars= 0, regs= 1/0, args= 0, extra= 0
.mask 0x40000000,-8
.fmask 0x00000000,0
subu $sp,$sp,8
sw $fp,0($sp)
move $fp,$sp
sw $4,8($fp)
sw $5,12($fp)
sw $6,16($fp)
sw $7,20($fp)
lw $2,8($fp)
lw $3,12($fp)
slt $2,$3,$2
beq $2,$0,$L3
lw $2,8($fp)
j $L2
j $L4
$L3:
lw $2,16($fp)
lw $3,20($fp)
slt $2,$3,$2
beq $2,$0,$L5
lw $2,16($fp)
j $L2
j $L6
$L5:
lw $2,20($fp)
lw $3,24($fp)
slt $2,$3,$2
beq $2,$0,$L7
lw $2,20($fp)
j $L2
j $L8
$L7:l
lw $2,24($fp)
j $L2
$L8:
$L6:
$L4:
$L2:
move $sp,$fp   # sp not trusted here
lw $fp,0($sp)
addu $sp,$sp,8
j $31
.end max


mips中用$4~$7来存储传递的参数,在这里存储的是a,b,x,y,多余的要压到堆栈中,程序中的变量z放在了40($fp)和16($fp)的位置,
我在这里有两点疑问,一个是在max中的堆栈只有8个字节的空间,那么max中的红色的诸如 sw $5,12($fp)操作,是不是就超出了max的栈的范围而对main中的变量进行了修改呢?
第二点:在最后z和y的比较,在max的栈空间中,y是放在20($fp)中的,z是由语句 lw $3,24($fp)读取的,在之前,没有对24($fp)的位置进行操作啊,怎么就把z的值存进去了呢?
还望高人能够解答! 不胜感激啊~ ~
发表于 2010-11-25 20:49:48 | 显示全部楼层
谢谢了
发表于 2011-1-21 14:20:06 | 显示全部楼层
看汇编,在main函数中,
a: 24($fp)
b: 28($fp)
x: 32($fp)
y: 36($fp)
z: 40($fp)
这是编译器决定的;
发表于 2011-10-10 22:43:45 | 显示全部楼层
问题1: 首先a,b,c等等的值再main函数中通过给立即数的形式存进去。在max函数中这些值会被lw出来
mips的一个地址是索引一个Byte的,所以每4个地址就是一个word。你红色的部分是把寄存器里面的原值给放入到内存中,在读出新值。
问题2:要看你的j指令跳转之后的指令,也就是你的l2 l8等等所对应的地址的指令
发表于 2011-12-21 15:46:25 | 显示全部楼层
thanks
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-22 15:32 , Processed in 0.020020 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表