• MIPS汇编指令集


    mips

    MIPS汇编

    MIPS指令集

    MIPS指令集属于精简指令集

    MIPS的所有指令都是32位,指令格式简单,而X86的指令长度不是固定的。

    简单的指令和格式易于译码和流水线操作,但是代码密度不高,导致二进制文件大

    MIPS有32个通用寄存器REG,为什么是32个而不是更多呢?
    因为更多的寄存器需要更多的指令空间对寄存器编码,也会增加上下文切换的负担。

    MIPS指令格式

    R格式

    655556
    op rs rt rd shamt funct

    用处:
    寄存器-寄存器ALU操作
    读写专用寄存器

    I格式

    65516
    op rs rt 立即数操作

    用处:
    加载/存储字节,半字,字,双字
    条件分支,跳转,跳转并链接寄存器

    J格式

    626
    op 跳转地址

    用处:
    跳转,跳转并链接
    陷阱和从异常中返回

    各字段含义:
    op:指令基本操作,称为操作码。
    rs:第一个源操作数寄存器。
    rt:第二个源操作数寄存器。
    rd:存放操作结果的目的操作数。
    shamt:位移量;
    funct:函数,这个字段选择op操作的某个特定变体。

    例:

    add $t0,$s0,$s1  

    表示$t0=$s0+$s1,即16号寄存器(s0)的内容和17号寄存器(s1)的内容相加,结果放到8号寄存器(t0)。
    指令各字段的十进制表示为:

    016178032

    op=0和funct=32表示这是加法,
    16=$s0表示第一个源操作数(rs)在16号寄存器里,

    17=$s1表示第二个源操作数(rt)在17号寄存器里,
    8=$t0表示目的操作数(rd)在8号寄存器里。
    把各字段写成二进制,为:

    00000010000100010100000000100000

    这就是上述指令的机器码(machine code),可以看出是很有规则性的。

    MIPS指令

    MIPS没有栈操作指令 ,调用子程序时没有自动压栈的call指令,只能用jal。

    MIPS的内存映射、中断等功能都做到了协处理器0(cp0)中,浮点运算做到了协处理器1(cp1)中。

    MIPS的寻址方式最简单,仅有寄存器加偏移寻址方式。

    MIPS常用指令集

    lb/lh/lw: 从存储器中读取一个byte/half word/word的数据到寄存器中.如lb $1, 0($2)
    sb/sh/sw: 把一个byte/half word/word的数据从寄存器存储到存储器中.如 sb $1, 0($2)
    add/addu:把两个定点寄存器的内容相加add $1,$2,$3($1=$2+$3);u为不带符号加。  

    addi/addiu:把一个寄存器的内容加上一个立即数add $1,$2,#3($1=$2+3);u为不带符号加。
    sub/subu:把两个定点寄存器的内容相减。
    div/divu:两个定点寄存器的内容相除。
    mul/mulu:两个定点寄存器的内容相乘。
    and/andi:与运算,两个寄存器中的内容相与and $1,$2,$3($1=$2 & $3);i为立即数。
    or/ori:或运算。
    xor/xori:异或运算。
    beq/beqz/benz/bne:条件转移eq相等,z零,ne不等。
    j/jr/jal/jalr:j直接跳转;jr使用寄存器跳转;
    lui:把一个16位的立即数填入到寄存器的高16位,低16位补零。
    sll/srl:逻辑左移/右移sll $1,$2,#2。
    slt/slti/sltui:如果$2的值小于$3,那么设置$1的值为1,否则设置$1的值为0。slt $1,$2,$3。
    mov/movz/movn:复制,n为负,z为零。mov $1,$2; movz $1,$2,$3($3为零则复制$2到$1)。
    trap:根据地址向量转入管态。
    eret:从异常中返回到用户态。

    32个通用寄存器

    0($zero): 永远返回值为0
    1($at): 用做汇编器的暂时变量
    2-3($v0-$v1): 子函数调用返回结果
    4-7($a0-$a3): 子函数调用的参数
    8-15($t0-$t7): 暂时变量,子函数使用时不需要保存与恢复
    16-23($s0-$s7): 子函数寄存器变量。子函数必须保存和恢复使用过的变量在函数返回之前,从而调用函数知道这些寄存器的值没有变化。
    24-25($t8-$t9): 暂时变量,子函数使用时不需要保存与恢复
    26-27($k0-$k1): 通常被中断或异常处理程序使用作为保存一些系统参数
    28($gp): 全局指针。一些运行系统维护这个指针来更方便的存取“static“和”extern”变量。
    29($sp): 堆栈指针
    30($s8/$fp): 第9个寄存器变量。子函数可以用来做桢指针
    31($ra): 子函数的返回地
    cp0:协处理器0,MIPS对CPU的控制用cp0完成

  • 相关阅读:
    Xen原理
    KVM系统镜像制作
    KVM原理及使用
    virsh使用总结
    libvirt原理
    虚拟化原理介绍
    TCP协议深度刨析
    TCP Socket通信详细过程
    firewall-cmd 使用总结
    PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项
  • 原文地址:https://www.cnblogs.com/yanghong-hnu/p/5635245.html
Copyright © 2020-2023  润新知