【问题标题】:Translating MIPS to machine code将 MIPS 转换为机器码
【发布时间】:2012-08-15 15:28:45
【问题描述】:
    .text
    .align 2
    .global main
    .equ val,0x4712         # 16-bit binary code for 0x4712: 0100 0111 0001 0010
                            # Program code starts now
main:                          
        movi r16,val
        movi r17,0
loop:   addi r17,r17,1
        subi r16,r16,1 
        bne  r16,r0,loop
stop:   br   stop

我应该如何将以上内容翻译成机器码?除了实际代码之外,我还需要知道如何进行翻译。我想我可以尝试获取指令的操作码,但 movi 是伪指令,我不知道在哪里可以得到它。我应该在 Nios II 手册中阅读它吗?

更新

前四个指令是立即类型,因此应该使用字段形式。 movi 和 subi 都是在 addi 中实现的伪指令,因此将使用 addi 的操作码。我得到了帮助,我知道指令 movi r16, val 将转换为

00000100000100011100010010000100

所以操作码是 000100 二进制,即 0x04 以十六进制表示,手册还指出是 addi 的操作码。所以我认为我们有前四个操作码,它们都是 000100。

更新 2

我想我现在知道大部分指令的操作码和直接字段:

序列 0100011100010010 是 0x4712,它是用 .equ, 声明的变量 val 所以前四个操作码应该是 000100,因为它们都是 addi 并且 addi 说它是 0x04。如何翻译我现在不知道但可以查看手册的寄存器的两个五位字段。它说'brhas opcode 0x06 so it should say 000110 in the opcode for br.bne`有opkod 0x1E,二进制是011110 = 30(?)

这是一个正确的开始吗?

【问题讨论】:

  • 伪指令可以简化为多条标准指令。你可以在一行旁边写几条指令吗?

标签: assembly mips machine-code nios


【解决方案1】:

首先,您为什么不至少尝试使用汇编程序来查看生成的内容?

您需要阅读 mips 指令集参考才能看到真正的 mips 指令,这些参考中通常描述了伪指令。就 movi 而言, load upper 对于控制高位有点明显,而 and or or or or 是设置低位的明显方法。如果该值是一个小数字,那么您只需要 and or or and 使用 r0 作为操作数之一(将高位归零)。

mips 中这些伪指令的问题在于,您必须小心不要在分支影子中使用伪指令(除非它转换为单个指令)。我建议先不使用任何伪指令学习汇编语言,然后再让你的生活更轻松,一旦你理解了指令集和规则,然后使用伪指令使代码更具可读性或可维护性等。我个人倾向于坚持纯指令,提供一对一的体验(asm 指令到机器指令)。

【讨论】:

  • 我的环境是 Nios II,我可以编译和运行程序集,但是我没有找到机器码在哪里。我调查了精灵文件,但结果对我来说是垃圾。据我了解,您认为我应该使用程序来翻译它,但我需要能够通过手动查看 Nios II 手册 google.se/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 2019-08-03
相关资源
最近更新 更多