-----------> 几个汇编问题,请教大家
int addFunc(int,int);int subFunc(int);
void main()
{
int x,y,z;
x= 1;
y=2;
z = addFunc(x,y);
}
int addFunc(int x,int y)
{
int value1 = 5;
int value2;
value2 = subFunc(value1);
return (x+y+value2);
}
int subFunc(int value)
{
return value--;
}
以上代码反汇编以后,如下: 有一些地方不明白,请大家帮忙看看
///////////////////////////////////////////////////////////////////////////
/* main Function */
0000000000000000 :
0: 27bdfff8 addiu $sp,$sp,-8
4: afbf0000 sw $ra,0($sp)
8: 0c000000 jal 0 // 这样又跳回0,不就死循环了 ???后面的代码如何执行?
c: 00000000 nop
10: 24040001 li $a0,1
14: 0c00000a jal 28 //同样问题,又跳到28,那后面的18 等指令 如何运行?
18: 24050002 li $a1,2
1c: 8fbf0000 lw $ra,0($sp)
20: 03e00008 jr $ra
24: 27bd0008 addiu $sp,$sp,8
28: 27bdfff0 addiu $sp,$sp,-16
2c: afbf0008 sw $ra,8($sp)
30: afb10004 sw $s1,4($sp)
34: afb00000 sw $s0,0($sp)
38: 0080802d move $s0,$a0
3c: 00a0882d move $s1,$a1
40: 0c000019 jal 64 // 又是乱跳,如何理解?
44: 24040005 li $a0,5
48: 02118021 addu $s0,$s0,$s1
4c: 02021021 addu $v0,$s0,$v0
50: 8fbf0008 lw $ra,8($sp)
54: 8fb10004 lw $s1,4($sp)
58: 8fb00000 lw $s0,0($sp)
5c: 03e00008 jr $ra
60: 27bd0010 addiu $sp,$sp,16
64: 03e00008 jr $ra
68: 0080102d move $v0,$a0 MIPS内部无互锁机制,为了避免冲突,只有在软件上做手脚。个人意见,仅供参考。 但关键是这样的跳跃
如何保证执行顺序?? 哪个哥们帮忙说一下啊
呵呵
谢谢拉 mips的跳转延迟只有一个。我觉得是你使用了优化,你可以去掉优化使用objdump -S 看看汇编和c的对照了 jamesr你好,
先谢谢你的解答,
但我还是有些疑惑,
没有看懂你的意思,
可以再详细说一下吗? 如果有时间的话,谢谢了 :) watsonts 谢谢你拉 LZ的MIPS汇编怎么学的
jal相当于是call,要返回的,1c到24返回后执行。
MIPS的跳转延时槽应该是1,不是3
从48-4c的功能来看,是return (x+y+value2); 它的执行时间是jal返回之后。
第8行确实没看懂。
页:
[1]