|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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的值存进去了呢?
还望高人能够解答! 不胜感激啊~ ~ |
|