• MIPS指令集摘要


    目录

    MIPS指令R I J三种格式

    MIPS五种寻址方式

    WinMIPS64汇编指令

    助记 

    从内存中加载数据

    lb rd,imm(rs)

    lbu rd,imm(rs)

    lh rd,imm(rs)

    lhu rd,imm(rs)

    lw rd,imm(rs)

    lwu rd,imm(rs)

    ld rd,imm(rs)

    l.d freg,imm(rs)

    lui reg,imm

    存储数据到内存

    sb rs,imm(rd)

    sh rs,imm(rd)

    sw rs,imm(rd)

    sd rs,imm(rd)

    s.d freg,imm(rd)

    算术运算指令

    daddi rd,rs,imm

    daddi rd,rs,imm

    dadd rd,rs,rt

    daddu rd,rs,rt

    dsub rd,rs,rt

    dsubu rd,rs,rt

    dmul rd,rs,rt

    dmulu rd,rs,rt

    ddiv rd,rs,rt

    ddivu rd,rs,rt

    add.d freg1,freg2,freg3

    sub.d freg1,freg2,freg3

    mul.d freg1,freg2,freg3

    div.d freg1,freg2,freg3

    逻辑运算指令

    and rd,rs,rt

    or rd,rs,rt

    xor rd,rs,rt

    andi rd,rs,imm

    ori rd,rs,imm

    andi rd,rs,imm

    置位指令

    slt rd,rs,rt

    sltu rd,rs,rt

    slti rd,rs,imm

    sltiu rd,rs,imm

    分支指令

    beq rs,rt,label

    bne rs,rt,label

    beqz rs,label

    bnez rs,label

    跳转指令

    j label

    jr rs

    jal label

    jalr rs

    移位指令

    dsll rd,rs,imm

    dsrl rd,rs,imm

    dsra rd,rs,imm

    dsllv rd,rs,rt

    dsrlv rd,rs,rt

    dsrav rd,rs,rt

    移动指令

    movz rd,rs,rt

    movn rd,rs,rt

    mov.d freg1,freg2

    mtcl rs,freg

    mfcl rd,freg

    其他指令

    halt

    nop

    cvt.d.l

    cvt..l.d

    c.lt.d

    c.le.d

    c.eq.d

    bclf

    bclt

    终端交互

    内存映射 

    示例①输出hello world

    示例②读取两个数计算乘积


    MIPS指令R I J三种格式

    op

    操作码opcode

    rs

    第一个源寄存器编号

    rt

    第二个源寄存器编号

    rd

    目的寄存器编号

    shamt

    移位位数

    funct

    功能码 

    寄存器

    MIPS五种寻址方式

    立即数寻址

    操作数为指令自身中的常数立即数

    addi r2,r1,1

    r2=r1+1 

    寄存器寻址

    操作数为寄存器中的值

    add r2,r1,r0

    r2=r1+r0 

    基址寻址

    以基址寄存器中的值和立即数常数之和作为地址,该地址指向的内存的值作为操作数 

    lw r2,8(r1)

    r2=M[r1+8] 

    PC相对寻址

    以PC程序计数器和指令中常数之和作为地址,即16位地址左移2位(即乘以4)与PC计数器相加

    beq r2,r1,label

    如果r2==r1则程序跳到label处 

    伪直接寻址

    跳转地址由指令中26位地址左移两位(即乘以4)与PC计数器的高4位相连所组成

    j label

    WinMIPS64汇编指令

    助记 

    从内存中加载数据

    lb rd,imm(rs)

    lb rd,imm(rs)

    基址偏移寻址,加载一个字节8位,rd=M[rs+imm]

    lbu rd,imm(rs)

    lbu rd,imm(rs)

    基址偏移寻址,加载一个无符号字节8位,rd=M[rs+imm]

    lh rd,imm(rs)

    lh rd,imm(rs)

    基址偏移寻址,加载一个半字16位,rd=M[rs+imm]

    lhu rd,imm(rs)

    lhu rd,imm(rs)

    基址偏移寻址,加载一个无符号半字16位,rd=M[rs+imm]

    lw rd,imm(rs)

    lw rd,imm(rs)

    基址偏移寻址,加载一个字32位,rd=M[rs+imm]

    lwu rd,imm(rs)

    lwu rd,imm(rs)

    基址偏移寻址,加载一个无符号字32位,rd=M[rs+imm]

    ld rd,imm(rs)

    ld rd,imm(rs)

    基址偏移寻址,加载一个64位,rd=M[rs+imm]

    l.d freg,imm(rs)

    l.d freg,imm(rs)

    基址偏移寻址,加载一个64位浮点数,freg=M[rs+imm]

    lui reg,imm

    lui reg,imm

    将立即数装在寄存器的高16位

    存储数据到内存

    sb rs,imm(rd)

    sb rs,imm(rd)

    基址偏移寻址,存储一个字节8位,M[rd+imm]=rs

    sh rs,imm(rd)

    sh rs,imm(rd)

    基址偏移寻址,存储一个半字16位,M[rd+imm]=rs

    sw rs,imm(rd)

    sw rs,imm(rd)

    基址偏移寻址,存储一个字32位,M[rd+imm]=rs

    sd rs,imm(rd)

    sd rs,imm(rd)

    基址偏移寻址,存储一个64位,M[rd+imm]=rs

    s.d freg,imm(rd)

    s.d freg,imm(rd)

    基址偏移寻址,存储一个64位浮点数,M[rd+imm]=freg

    算术运算指令

    daddi rd,rs,imm

    daddi rd,rs,imm

    立即数寻址,加法操作,rd=rs+imm

    daddi rd,rs,imm

    daddi rd,rs,imm

    立即数寻址,无符号加法操作,rd=rs+imm

    dadd rd,rs,rt

    dadd rd,rs,rt

    寄存器寻址,加法操作,rd=rs+rt

    daddu rd,rs,rt

    daddu rd,rs,rt

    寄存器寻址,无符号加法操作,rd=rs+rt

    dsub rd,rs,rt

    dsub rd,rs,rt

    寄存器寻址,减法操作,rd=rs-rt

    dsubu rd,rs,rt

    dsubu rd,rs,rt

    寄存器寻址,无符号减法操作,rd=rs-rt

    dmul rd,rs,rt

    dmul rd,rs,rt

    寄存器寻址,乘法操作,rd=rs*rt

    dmulu rd,rs,rt

    dmulu rd,rs,rt

    寄存器寻址,无符号乘法操作,rd=rs*rt

    ddiv rd,rs,rt

    ddiv rd,rs,rt

    寄存器寻址,除法操作,rd=rs/rt

    ddivu rd,rs,rt

    ddivu rd,rs,rt

    寄存器寻址,无符号除法操作,rd=rs/rt

    add.d freg1,freg2,freg3

    add.d freg1,freg2,freg3

    寄存器寻址,浮点数加法,freg1=freg2+freg3

    sub.d freg1,freg2,freg3

    sub.d freg1,freg2,freg3

    寄存器寻址,浮点数减法,freg1=freg2-freg3

    mul.d freg1,freg2,freg3

    mul.d freg1,freg2,freg3

    寄存器寻址,浮点数乘法,freg1=freg2*freg3

    div.d freg1,freg2,freg3

    div.d freg1,freg2,freg3

    寄存器寻址,浮点数除法,freg1=freg2/freg3

    逻辑运算指令

    and rd,rs,rt

    and rd,rs,rt

    寄存器寻址,与操作,rd=rs&rt

    or rd,rs,rt

    or rd,rs,rt

    寄存器寻址,或操作,rd=rs|rt

    xor rd,rs,rt

    xor rd,rs,rt

    寄存器寻址,异或操作,rd=rs^rt

    andi rd,rs,imm

    andi rd,rs,imm

    立即数寻址,与操作,rd=rs&imm

    ori rd,rs,imm

    ori rd,rs,imm

    立即数寻址,或操作,rd=rs|imm

    andi rd,rs,imm

    andi rd,rs,imm

    立即数寻址,异或操作,rd=rs^imm

    置位指令

    slt rd,rs,rt

    slt rd,rs,rt

    寄存器寻址,如果rs

    sltu rd,rs,rt

    sltu rd,rs,rt

    寄存器寻址,无符号比较,如果rs

    slti rd,rs,imm

    slti rd,rs,imm

    立即数寻址,如果rs

    sltiu rd,rs,imm

    sltiu rd,rs,imm

    立即数寻址,无符号比较,如果rs

    分支指令

    beq rs,rt,label

    beq rs,rt,label

    PC相对寻址,如果rs==rt,那么程序跳转到label

    bne rs,rt,label

    bne rs,rt,label

    PC相对寻址,如果rs!=rt,那么程序跳转到label

    beqz rs,label

    beqz rs,label

    PC相对寻址,如果rs==0,那么程序跳转到label

    bnez rs,label

    bnez rs,label

    PC相对寻址,如果rs!=0,那么程序跳转到label

    跳转指令

    j label

    j label

    伪直接寻址,程序直接跳转到label

    jr rs

    jr rs

    伪直接寻址,程序直接跳转到rs中的地址

    jal label

    jal label

    伪直接寻址,程序直接跳转到label并保存程序当前下一条指令地址到r31

    jalr rs

    jalr rs

    伪直接寻址,程序直接跳转到rs中的地址并保存程序当前下一条指令地址到r31

    移位指令

    为什么没有算术左移,因为算术左移和逻辑左移效果一样,都是右边补0,但是逻辑右移和算术右移不一样,逻辑右移左边直接补0,而算术右移左边需要补符号位,即负数补1,非负数补0

    dsll rd,rs,imm

    dsll rd,rs,imm

    立即数寻址,逻辑左移,rd=rs<

    dsrl rd,rs,imm

    dsrl rd,rs,imm

    立即数寻址,逻辑右移,rd=rs>>imm

    dsra rd,rs,imm

    dsra rd,rs,imm

    立即数寻址,算术右移,rd=rs>>imm

    dsllv rd,rs,rt

    dsllv rd,rs,rt

    寄存器寻址,逻辑左移,rd=rs<

    dsrlv rd,rs,rt

    dsrlv rd,rs,rt

    寄存器寻址,逻辑右移,rd=rs>>rt

    dsrav rd,rs,rt

    dsrav rd,rs,rt

    寄存器寻址,算术左移,rd=rs<

    移动指令

    movz rd,rs,rt

    movz rd,rs,rt

    寄存器寻址,如果rt==0那么rd=rs

    movn rd,rs,rt

    movn rd,rs,rt

    寄存器寻址,如果rt!=0那么rd=rs

    mov.d freg1,freg2

    mov.d freg1,freg2

    寄存器寻址,freg1=freg2

    mtcl rs,freg

    mtcl rs,freg

    寄存器寻址,freg=rs

    mfcl rd,freg

    mfcl rd,freg

    寄存器寻址,rd=freg

    其他指令

    halt

    halt

    程序结束

    nop

    nop

    没有操作

    cvt.d.l

    cvt.d.l freg,freg

    convert 64-bit integer to a double FP format

    cvt..l.d

    cvt.l.d freg,freg

    convert double FP to a 64-bit integer format

    c.lt.d

    c.lt.d freg,freg

    set FP flag if less than

    c.le.d

    c.le.d freg,freg

     set FP flag if less than or equal to

    c.eq.d

    c.eq.d freg,freg

     set FP flag if equal to

    bclf

    bclf label

    branch to address if FP flag is FALSE

    bclt

    bclt label

     branch to address if FP flag is TRUE

    终端交互

    内存映射 

    CONTROL: .word 0x10000
    DATA:    .word 0x10008

    WinMIPS64 模拟器支持内存映射 IO 模型,用于写入 或 从 WinMIPS64 终端读取。

    要写入终端:

    1. 将内存地址设置为要写入的值DATA

    2. 将适当的值写入内存地址CONTROL

    要从终端读取:

    1. 将适当的值写入内存地址CONTROL

    2. 从内存地址读取输入DATA

    CONTROL用法

    写入操作

    1

    设置为输出的无符号整数DATA

    2

    设置为输出的有符号整数DATA

    3

    设置为输出的浮点值DATA

    4

    设置为用于输出的字符串的内存地址DATA

    5

    设置为像素的坐标、坐标和 RGB 颜色(分别使用字节、字节和 word32 存储)DATA+5xDATA+4yDATA

    读取操作

    8

    从终端/键盘读取(整数或浮点值)DATA

    9

    从中读取一个字节,没有字符被回显DATA

    其他操作

    6

    清除终端屏幕

    7

    清除图形屏幕

    示例①输出hello world

    1. .data
    2. CONTROL: .word32 0x10000
    3. DATA: .word32 0x10008
    4. mes: .asciiz "Hello World!\n"
    5. .text
    6. daddi r1,r0,mes
    7. lw r2,DATA(r0)
    8. sd r1,0(r2)
    9. daddi r1,r0,4
    10. lw r2,CONTROL(r0)
    11. sd r1,0(r2)
    12. halt

    示例②读取两个数计算乘积

    1. .data
    2. CONTROL: .word32 0x10000
    3. DATA: .word32 0x10008
    4. cue1: .asciiz "please enter two numbers:\n"
    5. cue2: .asciiz "results:\n"
    6. cue3: .asciiz "warning: result overflow\n"
    7. .text
    8. daddi r1,r0,cue1 # please enter two numbers
    9. lw r2,DATA(r0)
    10. sd r1,0(r2)
    11. daddi r1,r0,4
    12. lw r2,CONTROL(r0)
    13. sd r1,0(r2)
    14. daddi r1,r0,8 # r3=a
    15. lw r2,CONTROL(r0)
    16. sd r1,0(r2)
    17. lw r2,DATA(r0)
    18. lw r3,0(r2)
    19. daddi r1,r0,8 # r4=b
    20. lw r2,CONTROL(r0)
    21. sd r1,0(r2)
    22. lw r2,DATA(r0)
    23. lw r4,0(r2)
    24. dadd r5,r0,r0 # r5=0 for r5=a*b
    25. daddi r1,r0,32
    26. loop: andi r2,r4,1 # r4[-1]
    27. beq r2,r0,zero # r4[-1]==1?
    28. dadd r5,r5,r3
    29. zero: dsll r3,r3,1
    30. dsra r4,r4,1
    31. daddi r1,r1,-1
    32. bne r1,r0,loop
    33. daddi r1,r0,cue2 # results
    34. lw r2,DATA(r0)
    35. sd r1,0(r2)
    36. daddi r1,r0,4
    37. lw r2,CONTROL(r0)
    38. sd r1,0(r2)
    39. lw r2,DATA(r0) # output a*b
    40. sd r5,0(r2)
    41. daddi r1,r0,2
    42. lw r2,CONTROL(r0)
    43. sd r1,0(r2)
    44. dsra r1,r5,16 # r1=r5[0:31]
    45. dsra r1,r1,16
    46. beq r1,r0,end
    47. daddi r1,r0,cue3 # output overflow
    48. lw r2,DATA(r0)
    49. sd r1,0(r2)
    50. daddi r1,r0,4
    51. lw r2,CONTROL(r0)
    52. sd r1,0(r2)
    53. end: halt
  • 相关阅读:
    计算机毕业设计Python+djang的药物管理系统
    [附源码]计算机毕业设计springboot吾悦商城管理系统
    2024全国水科技大会暨土壤和地下水污染防治与修复技术创新论坛(七)
    2022年湖北应急管理厅特种作业操作证报名需要什么资料?甘建二
    【博客494】K8s TLS Bootstrap机制
    【MFC】tab控件 仿任务管理器 枚举窗口和进程
    线性代数贯串全书各章节的隐含关系(以秩为中心)
    电子电气架构 --- 关于DoIP的一些闲思 下
    SpringBoot工程中Dubbo多协议使用方式
    搞懂 MySql 的架构和执行流程
  • 原文地址:https://blog.csdn.net/weixin_62264287/article/details/133968027