Assembly 将MIPS转换为机器代码

Assembly 将MIPS转换为机器代码,assembly,mips,machine-code,nios,Assembly,Mips,Machine Code,Nios,我应该如何将上面的代码翻译成机器代码?除了实际代码,我还需要知道如何翻译。我想我可以试着得到指令的操作码,但是movi是一个伪指令,我不知道从哪里可以得到它。我应该在Nios II手册中阅读吗 更新 前四条指令是立即输入的,因此应该使用字段形式。movi和subi都是addi中实现的伪指令,因此将使用addi的操作码。我得到了帮助,我知道指令movi r16,val将转换为 00000100000001100010000100 因此,操作码为000100二进制,即十六进制0x04,手册中还说明了

我应该如何将上面的代码翻译成机器代码?除了实际代码,我还需要知道如何翻译。我想我可以试着得到指令的操作码,但是movi是一个伪指令,我不知道从哪里可以得到它。我应该在Nios II手册中阅读吗

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

00000100000001100010000100

因此,操作码为000100二进制,即十六进制0x04,手册中还说明了addi的操作码。所以我认为我们有前四个操作码,它们都是000100

更新2 我想我现在知道了大多数指令的操作码和立即字段:

序列0100011100010010是0x4712,它是用
.eq,
所以前四个操作码应该是000100,因为它们都是addi,addi说是0x04。如何翻译寄存器的两个五位字段,我现在不知道,但可能正在使用手册进行检查。它说“br
有操作码0x06,所以在br的操作码中应该是000110。
bne`有opkod 0x1E,二进制是011110=30(?)


这是一个正确的开始吗?

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

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


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

伪指令可以简化为多条标准指令。您可以在一行旁边编写多条指令吗?我的环境是Nios II,我可以编译和运行汇编,但我没有找到机器代码。我调查了elf文件,但结果对我来说是垃圾。据我所知,您没有hink我应该使用一个程序来翻译它,但我需要能够通过查看NIOSII手册来手动完成
    .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