• 寄存器指令MIPS 寄存器介绍


    之前朋友几篇文章介绍了改寄存器指令的文章. 关联文章的地址

        MIPS有32个通用寄存器($0-$31),各寄存器的功能及汇编程序中应用约定如下:

        下表描述32个通用寄存器的别名和用处

        

    REGISTER

    NAME

    USAGE

    $0

    $zero

    常量0(constant value 0)

    $1

    $at

    保留给汇编器(Reserved for assembler)

    $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)

    $31

    $ra

    返回地址(return address)

        每日一道理
    人的生命似洪水奔流,不遇着岛屿和暗礁,难以激起美丽的浪花。

        
    下面赐与具体说明:
    $0:即$zero,该寄存器总是返回零,为0这个有效常数供给了一个简洁的编码形式。
     

                  move$t0,$t1
           现实为
               add$t0,$0,$t1
           应用伪指令可以简化任务,汇编程序供给了比硬件更丰富的指令集。
    $1:即$at,该寄存器为汇编保留,由于I型指令的立即数字段只有16位,在加载大常数时,编译器或汇编程序须要
           把大常数拆开,然后重新组合到寄存器里。比如加载一个32位立即数须要 lui(装入高位立即数)和addi两条
           指令。像MIPS程序撮合和重装大常数由汇编程序来实现,汇编程序必须一个临时寄存器来重组大常数,这
           也是为汇编 保留$at的原因之一。
    $2..$3:($v0-$v1)用于子程序的非浮点结果或返回值,对于子程序如何传递参数及如何返回,MIPS范围有一套约
           定,堆栈中多数几个位置处的内容装入CPU寄存器,其响应内存位置保留未做定义,当这两个寄存器不敷存
           放返回值时,编译器通过内存来实现。
    $4..$7:($a0-$a3)用来传递前四个参数给子程序,不敷的用堆栈。a0-a3和v0-v1以及ra一起来支撑子程序/过程
           调用,分别用以传递参数,返回结果和寄存返回地址。当须要应用更多的寄存器时,就须要堆栈(stack)
           了,MIPS编译器总是为参数在堆栈中留有空间以防有参数须要存储。
    $8..$15:($t0-$t7)临时寄存器,子程序可以应用它们而不用保留。
    $16..$23:($s0-$s7)保存寄存器,在过程调用过程当中须要保留(被调用者保存和恢复,还包括$fp和$ra),MIPS
           供给了临时寄存器和保存寄存器,这样就减少了寄存器溢出(spilling,即将不经常使用的变量放到存储器的过程),
           编译器在编译一个叶(leaf)过程(不调用其它过程的过程)的时候,总是在临时寄存器分配完了才应用须要
           保存的寄存器。
    $24..$25:($t8-$t9)同($t0-$t7)
    $26..$27:($k0,$k1)为操作系统/异常处理保留,至少要预留一个。异常(或中断)是一种不须要在程序中表现
           调用的过程。MIPS有个叫异常程序计数器(exception program counter,EPC)的寄存器,属于CP0寄存器,
           用于保存造成异常的那条指令的地址。查看控制寄存器的独一方法是把它复制到通用寄存器里,指令mfc0(move from system control)可以将EPC中的地址复制到某个通用寄存器中,通过跳转语句(jr),程序可以
           返回到造成异常的那条指令处继承执行。MIPS程序员都必须保留两个寄存器$k0和$k1,供操作系统应用。
           发生异常时,这两个寄存器的值不会被恢复,编译器也不应用k0和k1,异常处理函数可以将返回地址放到这
           两个中的任何一个,然后应用jr跳转到造成异常的指令处继承执行。
    $28:($gp)为了简化静态数据的访问,MIPS软件保留了一个寄存器:全局指针gp(global pointer,$gp),全局指针
           只想静态数据区中的运行时决定的地址,在存取位于gp值上下32KB范围内的数据时,只须要一条以gp为基
           指针的指令即可。在编译时,数据须在以gp为基指针的64KB范围内。
    $29:($sp)MIPS硬件并不直接支撑堆栈,你可以把它用于别的目标,但为了应用别人的程序或让别人应用你的程
           序, 还是要遵守这个约定的,但这和硬件没有关系。
    $30:($fp)GNU MIPS C编译器应用了侦指针(frame pointer),而SGI的C编译器没有应用,而把这个寄存器当作保
           存寄存器应用($s8),这节省了调用和返回开销,但增加了代码生成的复杂性。
    $31:($ra)寄存返回地址,MIPS有个jal(jump-and-link,跳转并链接)指令,在跳转到某个地址时,把下一条指令的
           地址放到$ra中。用于支撑子程序,例如调用程序把参数放到$a0~$a3,然后jal X跳到X过程,被调过程实现后
           把结果放到$v0,$v1,然后应用jr $ra返回。
    另外,MIPS对CPU的控制通过协处理器0(CP0)来实现。

    文章结束给大家分享下程序员的一些笑话语录: Google事件并不像国内主流媒体普遍误导的那样,它仅仅是中国Z府和美国公司、中国文化和美国文化甚至中国人和美国人之间的关系,是民族主义和帝国主义之间的关系;更重要的是,它就是Z府和公司之间的关系,是权力管制和市场自由之间的关系。从这个意义上说,过度管制下的受害者,主要是国内的企业。Google可以抽身而去,国内的企业只能祈望特区。www.ishuo.cn

  • 相关阅读:
    C#图形编程
    深入浅出话事件(上)
    .NET名称空间对应的类集
    Equals() 和运算符 == 的重写准则(C# 编程指南)
    Implement EventArgs
    CLS(公共语言规范)的CLSCompliant(跨语言调用)
    学习MSCOREE.dll是托管程序的入口点
    设计模式之原型模式代码示例
    The disk cannot be added to Cluster Shared Volumes because it does not have any suitable partitions
    RAID小结
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3074188.html
Copyright © 2020-2023  润新知