这是一个用于 MIPS 指令处理、汇编/反汇编、仿真与自动评测的小型工具集合。代码用 Go 语言实现:
mips2hex:将 MIPS 汇编代码(.s)汇编为每行 32-bit 十六进制指令文件(无0x前缀)。hex2mips:把十六进制/二进制/十进制的机器码行反汇编为可读的汇编指令。mipsim:一个简单的逐条指令仿真器,会打印每步的寄存器写入与存储器写入信息judger:针对 Logisim 的评测封装(-mode logisim),用于用 Logisim 的仿真结果与本地仿真比较并输出差异。
以下说明基于仓库 src 目录下的源码(已包含 go.work,建议在 src 下执行构建/运行命令)。
src/mips2hex:汇编器,入口main.go,内部包含parser,assembler,emitter。src/hex2mips:反汇编器,入口main.go,使用hex2mips/disassembler进行指令解码。src/mipsim:仿真器,入口main.go,核心位于cpu包(cpu.Run将指令装入内存并逐步执行)。src/judger:评测器(Logisim 集成),入口main.go。
建议在 src 目录下运行下面的命令(仓库根目录有 src/go.work):
cd .\src
go run .\mips2hex -input .\mips2hex\test\code0.s -output .\out_instr.txt -base 0x3000
-input:输入 MIPS 汇编源文件(支持 .text/.word、标签、li、常见指令等)-output:输出每行 8 字节(32-bit)大写十六进制字符串(无 0x 前缀),由emitter.WriteHexLines生成-base:指定.text段基址(十进制或0x..)。分支与跳转会按该基址进行 PC 与目标地址计算。
使用 hex2mips 可以对一个 hex 行或文件进行反汇编。
go run .\hex2mips -input .\out_instr.txt
或者对单个 hex 字符串:
go run .\hex2mips -ih 0x012a4020
默认最大执行步数 10000(防止死循环),可用 -limit 覆盖。
go run .\mipsim -f .\out_instr.txt
限制步数示例:
go run .\mipsim -f .\out_instr.txt -limit 500
- 从 PC 基址 0x3000 开始将指令装入内存(见 cpu.New 初始化)
- 按顺序执行,每步打印反汇编文本、PC、寄存器写入与内存写入信息
go run .\judger -mode logisim <logisim_jar> <circuit.circ> <hex_path> <output_path>
其中 <hex_path> 为被评测的 hex 文件,评测结果会写入 <output_path>(不一致时会在输出目录写 detail.log)
- 汇编器:
mips2hex使用两遍解析(parser.ParseLines):第一遍收集标签地址,第二遍生成指令/数据项。.text段起始地址被假定为 0(汇编时以偏移计数),指令大小通常为 4 字节,li会被扩展为两条指令(8 字节)。 - 指令编码在
mips2hex/assembler中实现,支持常见的 R/I/J 类型指令、移位、分支等。特殊伪指令li与nop被单独处理。 - 输出格式:
emitter.WriteHexLines会将每个 uint32 按字节写为 8 位十六进制小写字符串(每行一条指令)。 - 反汇编:
hex2mips可接受二进制串(32 位)、十六进制(包含/不包含0x前缀)或十进制,且支持从 stdin、文件或单个输入字符串反汇编。 - 仿真器:
mipsim的cpu从 PC 基址 0x3000 装载指令并执行(参见cpu.New()),打印每步状态,适用于步进观察指令效果。cpu中包含signExtend16、通用寄存器数组、Hi/Lo 寄存器和内存映射(map)。