---------------> 重新开一个,讨论这个汇编。
实在是很菜,问的问题很初级,见笑拉 :)///////////////////////////////////////////////////////////////
main()
{
int x =100 ;
}
////////////////////////////////////////////////////////////////
反汇编后:
00000000 <main> :
0: lui gp , 0x0 //发现一个问题,为什么每个汇编都有 0,4 ,8 这3段代码 ?
//t9 此时里面是什么数据 ? 就直接与gp相加,是什么目的呢 ?
4: addiu gp , gp, 0
8: addu gp , gp , t9
c: addiu sp , sp, -24
10: sw s8, 16(sp) // $16-----$23 对应 s0-----s7 , 那么 s8是什么 ?
14: move s8 ,sp
18: li v0,100
1c: sw v0,8( s8 ) //s8 是一个寄存器的话,它偏移8字节是什么意思 ?
20: move sp,s8
24: lw s8, 16(sp)
28: jr ra
2c: addiu sp,sp,24
[ 本帖最后由 xpdsq 于 2008-1-9 11:25 编辑 ] MIPS体系结构提供了32个GPR(GENERAL PURPOSE REGISTER)。这32个寄存器的用法大致如下:
REGISTER NAME USAGE
$0 $zero 常量0(constant value 0)
$1 编译器保留
$2-$3 $v0-$v1 函数调用返回值(values for results and expression evaluation)
$4-$7 $a0-$a3 函数调用参数(arguments)
$8-$15 $t0-$t7 暂时的(或随便用的)
$16-$23 $s0-$s7 保存的(或如果用,需要SAVE/RESTORE的)(saved)
$24-$25 $t8-$t9 暂时的(或随便用的)
$28 $gp 全局指针(Global Pointer)
$29 $sp 堆栈指针(Stack Pointer)
$30 $fp 帧指针(Frame Pointer)
(BNN:fp is stale acutally, and can be simply used as $t8)
$31 $ra 返回地址(return address)
对一个CPU的寄存器约定的正确用法是非常重要的。当然对C语言开发者不需要关心,因为COMPILER会TAKE CARE。但对于KERNEL的开发或DRIVER开发的人就**必须**清楚。
一般来讲,你通过objdump -d可以清醒的看到寄存器的用法。 有一本书将mips,还不错> see mips run
页:
[1]