【问题标题】:Mips Assembly code conversion to machine codeMips 汇编代码转换为机器码
【发布时间】:2013-11-06 08:15:20
【问题描述】:

我必须编写将 mips 指令转换为二进制的程序,就像在这个网站上所做的那样: http://www.mipshelper.com/mips-converter.php

请人帮忙。 我需要写一个mips代码

如果我在控制台上写:

添加$t0、$t1、$t2

应该是结果

00000001001010100100000000100000

【问题讨论】:

  • 你了解 MIPS 指令是如何编码的吗?如果是,那么您将能够将任何指令转换为机器代码。如果答案是否定的,那么您应该阅读 MIPS 书籍,然后查看指令编码和操作码。您必须展示您尝试过的内容以及您在哪里遇到问题,这就是 stackoverflow 的工作方式
  • 是的,我知道如何使用说明书手动转换。但是我现在必须用指令表在 mips 中创建一个矩阵来纠正这个程序,这是我不知道的

标签: assembly type-conversion mips instructions machine-code


【解决方案1】:

您可以看到我仍在开发的一个程序,用于将 MIPS 汇编指令解析为适合 verilog 的 $readmemb() 格式的二进制表示。看一下这个。该程序是用 C 语言编写的。

https://www.dropbox.com/sh/vkmfcytlc01yqwf/AACmLEBsN3rhjo9TBVO0RPUCa?dl=0

但它解析 R 格式指令(add、sub、or、and、slt)、I 格式(beq、bne、lw、sw),但还不能解析 J 格式。实现它们很简单。

我还没有刷新自述文件,但是您可以使用 -c 选项执行它,该选项将已解析的指令作为注释传输到编码行之后 (./masmbin -c input.masm ouput.mbin)。

关键是要了解每条指令的属性。例如。在 lw/sw 中,我们有

                                lw rt, #n(rs)

请注意,寄存器的顺序是相反的,与应以二进制表示形式编码的顺序相反:

                     [opcode][ rs ][ rt ][immediate]

祝你好运!

编辑:还有一项工作正在进行中(我重拍)here

【讨论】:

    【解决方案2】:

    该死,我倒读了这个问题,并想出了一个很酷的方法来将二进制文件转换为操作码。但它可能会为您指明正确的方向(呵呵):使用指针数组作为一堆字符串的索引。我将首先描述(更简单的)二进制到操作码的概念,然后调整操作码到二进制的想法。

    首先,你没问的问题:binary into opcode。考虑将指令字的每个部分的位用作数组的位移(指针),然后将您指向适当的字符串。至少,我认为我会这样做。

    让我们看看如何翻译 R 型指令的最后 6 位(使用 Green Sheet)。我只做前四个:0 = sll,1 = 无效,2 = srl,3 = sra。这是数据段,我在其中定义了字符串(不一定按顺序)和向量表(按顺序)。

    .data
    
    .functNames
    f_invalid: .asciiz "invalid_funct"
    f_sll: .asciiz "sll"
    f_srl: .asciiz "srl"
    f_sra: .asciiz "sra"
    
    .align 2
    .functXref
    .word f_sll # 0
    .word f_invalid # 1
    .word f_srl # 2
    .word f_sra # 3
    

    现在是代码。对于“函数”,我们想要屏蔽除我们正在查看的 6 位之外的所有位,然后左移两次以使其成为字指针。 (对于其他人,您需要向右移动。)

    .text
    # assume $s0 contains the 32-bit MIPS instruction
    andi $t0, $s0, 0x0000003F
    sll $t0, $t0, 2
    # get pointer to the string
    lw $t1, functxref($t0)
    # get address of the string
    lw $t2, 0($t1)
    

    现在您有了详细说明指令的字符串的地址(对于操作码为 0 的 R 类型)。

    最后,您问的问题:如何开始将文本转换为二进制文件?也许您可以使用类似的字符串数组和指向字符串的指针。循环遍历可能的字符串,直到找到匹配项(或用完要比较的字符串)。您需要设置一个并行数组来指示它是什么类型的操作码,以及相关的位模式是什么:

    .opcodeNames
    f_add: .asciiz "add"
    f_addi: .asciiz "addi"
    f_j: .asciiz "j"
    
    .align 2
    .opcodeXref
    .word f_add
    .word f_addi
    .word f_j
    
    .opcodeTypes
    ft_add: .byte 'R'
    ft_addi: .byte 'I'
    ft_j: .byte 'J'
    
    .opcodeVals
    fv_add: .byte 0x20
    fv_addi: .byte 0x08
    fv_j: .byte 0x02
    

    opcodeXref获取指针,用它从opcodeNames获取字符串,看看是否匹配。如果没有,请转到opcodeXref 中的下一个单词。

    如果匹配,则使用与opcodeXref 相同的索引从.opcodeTypes 获取格式,然后从.opcodeVals 获取位模式。

    希望这足以开始。听起来像是一个相当大的项目,尤其是所有字符串操作(不是 Assembler 真正直观的东西)。

    【讨论】:

      猜你喜欢
      • 2014-09-01
      • 1970-01-01
      • 2019-08-03
      • 2013-11-21
      • 1970-01-01
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 2014-08-16
      相关资源
      最近更新 更多