将MIPS转换为机器代码

时间:2012-08-15 15:28:46

标签: assembly mips machine-code nios

    .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中实现的pseudoinstruktions,因此将使用addi的操作码。我得到了帮助,我知道指令movi r16, val将转换为

00000100000100011100010010000100

所以操作码是000100二进制,在十六进制基数为0x04,手册也说明是addi的操作码。所以我认为我们有前四个操作码,它们都是000100.

更新2

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

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

这是一个正确的开始吗?

1 个答案:

答案 0 :(得分:2)

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

您需要读取mips指令集引用以查看实际mips指令,通常在这些引用中描述伪指令。就movi而言,load upper对于控制高位来说有点明显,而且或者或者或者是或者是设置低位的明显方法。如果该值是一个小数,那么您只需要和或或使用r0作为操作数之一(将高位置零)。

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