You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MARS环境下根据地址获取MIPS指令立即数字段十进制值方法

获取MIPS指令立即数字段十进制值的方法

针对你在MARS中遇到的两个问题,我来一步步拆解解答:

1. 通用方法:获取任意MIPS指令立即数字段的十进制值

MIPS里带立即数的指令大多是I型指令(比如addilwbeq等),它们的机器码结构是[6位opcode][5位rs][5位rt][16位立即数]。要拿到十进制值,按以下步骤来:

  • 第一步:获取指令的机器码
    在MARS中,编译你的程序后,可以通过两种方式查看机器码:

    • 切换到「Execute」窗口,在「Instructions」列表里,每条指令右侧会显示对应的十六进制机器码;
    • 切换到「Memory」窗口,选择地址格式为「Decimal」,找到指令所在地址对应的十六进制值(注意MIPS指令是4字节对齐的,每个指令占一个内存单元,对应4个十六进制字符)。
  • 第二步:提取16位立即数字段
    把机器码的低16位(也就是最后4个十六进制字符)单独拿出来。比如机器码是0x2008FFFB,低16位就是0xFFFB

  • 第三步:转换为有符号十进制值
    MIPS的立即数是有符号16位整数,所以要考虑符号扩展:

    • 如果16位二进制的最高位(第15位,从0开始计数)是0,直接把这16位转成十进制即可;
    • 如果最高位是1,说明是负数,需要将这16位符号扩展到32位(也就是前面补16个1),再转成十进制。
      举个例子:0xFFFB转二进制是1111111111111011,最高位是1,符号扩展后是11111111111111111111111111111011,转十进制就是-5

2. 针对已知地址的beq指令:获取立即数字段的十进制值

beq属于I型指令,它的立即数字段是相对偏移量(以字为单位,每个字4字节),但获取其十进制值的核心步骤和上面一致,再结合地址场景补充细节:

假设你要查看十进制地址08处的beq $t0, $t1, someLabel指令:

  • 第一步:定位指令的机器码
    在MARS的「Memory」窗口中,地址选「Decimal」,找到地址08对应的十六进制机器码(比如可能是0x11090004)。

  • 第二步:提取低16位偏移字段
    取机器码的最后4个十六进制字符,比如上面的例子就是0x0004

  • 第三步:转换为有符号十进制值
    同样按有符号16位整数处理:

    • 如果是0x0004,二进制最高位是0,转十进制就是4
    • 如果是0xFFFC,二进制最高位是1,转十进制就是-4

    这里要注意:beq的偏移量是相对于下一条指令的地址(当前指令地址+4)的跳转距离,实际跳转地址是(当前指令地址+4) + 偏移量*4,但如果你只是要立即数字段本身的十进制值,只需要完成上面的转换就可以了。

内容的提问来源于stack exchange,提问作者John

火山引擎 最新活动