首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将MIPS转换为机器码

将MIPS转换为机器码
EN

Stack Overflow用户
提问于 2012-08-15 23:28:46
回答 1查看 2.9K关注 0票数 0
代码语言:javascript
复制
    .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手册中阅读它吗?

更新

前四条指令是immediate类型,因此应该使用字段形式。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 (?)

这是一个正确的开始吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-16 01:40:37

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

您需要阅读mips指令集参考才能了解真正的mips指令,这些参考文献中通常描述了伪指令。就movi而言,load to对于控制高位是比较明显的,而and或or是设置低位的一种明显的方法。如果值很小,那么您只需要and或or,并使用r0作为其中一个操作数(将高位设为零)。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11972320

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档