• MIPS汇编入门


    寄存器种类

    • MIPS共有32个通用寄存器
    • 在汇编中,寄存器标志由$符号开头
    • 寄存器表示共有两种方法
      • 直接使用该寄存器对应编号,例如:$0,$31
      • 使用对应的寄存器名称,例如:$t1, $sp(名称见下列表格)
    寄存器编号寄存器名寄存器用途
    0zero永远返回0
    1$at汇编保留寄存器
    2-3$v0 - $v1存储表达式或者函数的返回值
    4-7$a0 - $a3存储子程序的前4个参数,在子程序调用过程中释放
    8-15$t0 - $t7临时变量,同上调用时不保存
    16-23$s0 - $s7调用时保存
    24-25$t8 - $t9临时变量,同上调用时不保存
    26-27$k0 - $k1中断函数返回值,不可做其他用途
    28$gp(Global Pointer)保存静态或外部变量
    29$sp栈指针,指向栈顶
    30$ s8 ($ fp)帧指针
    31$ra返回地址

    指令种类

    • R型指令
    000000RsRtRdshamtfunct
    6bits5bits5bits5bits5bits6bits
    • I型指令
    OPRsRt立即数
    6bits5bits5bits16bits
    • J型指令
    OP立即数
    6bits26bits

    寻址方式

    立即数寻址

    • I型指令
      addi s1,s2, 10 相当于 $s1 = $s2 + E(10)
    OPRsRt立即数
    6bits$s2$s116bits

    寄存器寻址

    • R型指令
      add $t0, $s1, $s2 相当于 $t0 = $s1 + $s2
    000000RsRtRdshamtfunct
    6bits$s1$s2$t0000006bits

    基址寻址

    • I型指令
      Rs 中存放基址寄存器,因为立即数只有16位,所以我们将其带符号拓展为32位,然后与基址相加,就可以得到目标数的地址。
    • 常见的基址寻址指令:lw, sw, lh, sh, lb, lbu等

    相对寻址

    • I型指令
      将16位的立即数带符号拓展为32位后,将其左移两位(此时它的最低两位就是0),然后与PC寄存器地址相加,所得为目标值的地址
    • 常见相对寻址指令有:beq,bne

    伪直接寻址

    • J型指令
      对于26位的立即数直接左移两位,此时它为28位,而且它的最低两位为0,这时我们取PC的高四位地址做为目标地址的高四位,其余28位为得到的立即数,这个地址为目标值的地址。

    指令总览

    类别指令含义备注
    算数add $s1,$s2,$s3$s1 = $s2 + $s3三个操作数;检测溢出
    算数sub $s1,$s2,$s3$s1 = $s2 - $s3三个操作数;检测溢出
    算数加立即数addi $s1,$s2,100$s1 = $s2 + 100加常数;检测溢出
    算数无符号加addu $s1,$s2,$s3$s1 = $s2 + $s3三个操作数;不检测溢出
    算数无符号减subu $s1,$s2,$s3$s1 = $s2 - $s3三个操作数;不检测溢出
    算数无符号加立即数addiu $s1,$s2,100$s1 = $s2 + 100加常数;不检测溢出
    算数从协处理器寄存器中获得mfc0 $s1,$epc$s1 = $epc复制异常PC到专用处理器
    算数mult $s2,$s3Hi,Lo = $s2 × $s364位有符号积存在Hi,Lo中
    算数无符号乘multu $s2,$s3Hi,Lo = $s2 × $s364位无符号积存在Hi,Lo中
    算数div $s2,$s3Lo = $s2 / $s3;Hi = $s2 mod $s3Lo = 商;Hi = 余数
    算数无符号除div $s2,$s3Lo = $s2 / $s3;Hi = $s2 mod $s3无符号商和余数
    算数从Hi中获得mfhi $s1$s1 = Hi用来获得Hi的副本
    算数从Lo中获得mflo $s1$s1 = Lo用来获得Lo的副本
    数据传输取字lw $s1,20($s2)$s1 = Memory[$s2 + 20]将一个字从内存中取到寄存器中
    数据传输存字sw $s1,20($s2)Memory[$s2 + 20] = $s1将一个字从寄存器中取到内存中
    数据传输取无符号半字lhu $s1,20($s2)$s1 = Memory[$s2 + 20]将半字从内存中取到寄存器中
    数据传输存半字sh $s1,20($s2)Memory[$s2 + 20] = $s1将半字从寄存器中取到内存中
    数据传输取无符号字节lbu $s1,20($s2)$s1 = Memory[$s2 + 20]将一个字节从内存中取到寄存器中
    数据传输存字节sb $s1,20($s2)Memory[$s2 + 20] = $s1将一个字节从寄存器中取到内存中
    数据传输取链接字ll $s1,20($s2)$s1 = Memory[$s2 + 20]取字作为原子交换的前半部
    数据传输存条件字sc $s1,20($s2)Memory[$s2 + 20] = $s1或$s1 = 0/1存字作为原子交换的后半部
    数据传输立即数读入高16位lui $s1,100$s1 = 100 ×2^16取立即数并放在高16位
    逻辑运算AND $s1,$s2,$s3$s1 = $s2 & $s3三个寄存器操作数按位与
    逻辑运算OR $s1,$s2,$s3$s1 = $s2 | $s3三个寄存器操作数按位或
    逻辑运算或非NOR $s1,$s2,$s3$s1 = ~($s2 | $s3)三个寄存器操作数按位或非
    逻辑运算与立即数ANDi $s1,$s2,100$s1 = $s2 & 100和常数按位与
    逻辑运算或立即数ORi $s1,$s2,100$s1 = $s2 | 100和常数按位或
    逻辑运算逻辑左移sll $s1,$s2,10$s1 = $s2 << 10根据常数左移相应位
    逻辑运算逻辑右移srl $s1,$s2,10$s1 = $s2 >> 10根据常数右移相应位
    条件跳转相等时跳转beq $s1,$s2,25if($s1 == $s2)跳至PC + 4 + 100相等检测;和PC相关的跳转
    条件跳转不相等时跳转bne $s1,$s2,25if($s1 != $s2)跳至PC + 4 + 100不相等检测;和PC相关的跳转
    条件跳转小于时置位slt $s1,$s2,$3if($s2 < $s3) $s1 = 1;否则等于0比较是否小于;补码形式
    条件跳转小于立即数时置位slti $s1,$s2,100if($s2 < 100) $s1 = 1;否则等于0比较是否小于常数
    条件跳转无符号数比较小于时置位sltu $s1,$s2,$3if($s2 < $s3) $s1 = 1;否则等于0比较是否小于
    条件跳转无符号数比较小于立即数时置位sltiu $s1,$s2,100if($s2 < 100) $s1 = 1;否则等于0比较是否小于常数
    无条件跳转跳转j 2500跳至10000跳转到目标地址
    无条件跳转跳转至寄存器所指地址jr $ra跳至$ra用于switch语句,以及过程调用的返回
    无条件跳转跳转并链接jal 2500$ra = PC + 4; 跳至10000用于过程调用
  • 相关阅读:
    Go语言中向[]byte数组中增加一个元素
    Apifox简单了解——WEB端测试的集大成者
    CentOS安装/卸载Anaconda(图文详解)
    java计算机毕业设计计算机组成原理教学演示软件源码+数据库+系统+lw文档+mybatis+运行部署
    iNavFlight之MSP Sensor报文格式
    基于样本平衡策略的多源迁移学习方法及其在乙烯精馏塔质量指标预测的应用
    风光储一体化能源中心 | 数字孪生智慧能源
    自定义View5 -塔防小游戏:第二篇防御塔随意放置
    眼睛状态识别
    python报错 UnicodeDecodeError
  • 原文地址:https://blog.csdn.net/fyrrr/article/details/136315794