xpdsq 发表于 2008-01-09 11:23

---------------> 重新开一个,讨论这个汇编。

实在是很菜,问的问题很初级,见笑拉 :)


///////////////////////////////////////////////////////////////

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 编辑 ]

jamesr 发表于 2008-01-09 18:21

watsonts 发表于 2008-01-09 21:01

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可以清醒的看到寄存器的用法。

watsonts 发表于 2008-01-09 21:03

有一本书将mips,还不错> see mips run
页: [1]
查看完整版本: ---------------> 重新开一个,讨论这个汇编。