Assembly 机器码转换

Assembly 机器码转换,assembly,mips,machine-code,mars-simulator,Assembly,Mips,Machine Code,Mars Simulator,我正在尝试将大约25行MIPS程序从机器代码转换为指令 当我转换0x1620fff9的机器代码时,它会产生以下结果: 0001011000001111111111111111001 我知道这是I格式,指令是BNE,目标寄存器为$17,源代码为$0,但我对立即数/地址感到困惑 由于11111111111001是一个有符号的数字,它的两个补码产生-7的结果。我只是不知道该怎么处理这个结果。火星模拟器需要一个标签来标明它的分支方向,但我不清楚该怎么做。我正在转换的程序只有一个主功能和一个打印功能 谢谢

我正在尝试将大约25行MIPS程序从机器代码转换为指令

当我转换
0x1620fff9
的机器代码时,它会产生以下结果:
0001011000001111111111111111001

我知道这是I格式,指令是
BNE
,目标寄存器为
$17
,源代码为
$0
,但我对立即数/地址感到困惑

由于
11111111111001
是一个有符号的数字,它的两个补码产生
-7
的结果。我只是不知道该怎么处理这个结果。火星模拟器需要一个标签来标明它的分支方向,但我不清楚该怎么做。我正在转换的程序只有一个主功能和一个打印功能


谢谢

结果表明,MARS和QTSpim处理这些指令的方式不同:

  • MARS总是在分支指令之后从指令跳转,这正是流水线机器应该做的

  • QtSPIM从分支指令跳转,这更容易理解

  • 在MARS下,bne指令是0x1620fff8,而在QtSPIM下,它是0x1620fff9


我们的教授对不同的结果做出了让步,但我认为这可能对将来的某个人有用

在正确的指令处添加标签,或使用当前地址的符号,通常为
$
*
(取决于汇编程序)。您可以编写类似于
bne$s0,$t0,.-7的代码(根据需要调整偏移量)。分支指令中的偏移量是一个字偏移量,因此需要乘以4得到字节偏移量,即
bne$s0,$t0,.-28
谢谢大家的支持。每当MARS看到bne命令时,它都会说它期待“bne$t1,$t2,label”,因此上述两种解决方案似乎都不适用于MARS。还有其他想法吗?一些人认为在ISA中暴露管道细节(例如分支延迟时隙,或者基本上是关于IA64的一切)是一个很大的设计错误。例如,这是一个不便之处,它对将来执行无序执行的体系结构的实现没有任何好处。Linus Torvalds已经在论坛上发布了类似的内容(但它们不可搜索,xD)。