Сборка MIPS - строка инструкции в шестнадцатеричный формат

Я работаю над чем-то в сборке, где для инструкции требуется строка, например

add $t1, $t0, $t1 

и распечатывает инструкцию в шестнадцатеричном формате.

Я просматриваю строку по частям, причем сначала распознается add. Добавить имеет код операции 001000 (6 бит).

t1 сканируется, и он сравнивает себя с разделом данных, и он имеет значение 5 бит 01001, то же самое с t0 с 01000 и t1 снова на 01001. Все они сканируются в определенном порядке, поэтому приоритет не так важен. как я могу судить.

С тех пор я знаю, что мне нужно как-то соединить их вместе, а затем преобразовать из двоичного в шестнадцатеричный. Моя проблема в том, что я не уверен, как я должен хранить эти двоичные значения по мере их чтения. Хранить ли их в разделе данных, что кажется неправильным из-за их нечетных битовых размеров, или есть более простой способ.

Честно говоря, я мало что знаю о сдвиге битов, поэтому ответ может лежать в этом.

Вот мой код. Это очень просто незавершенная работа

#text segement
    .text
    .globl main

main:
    li $t0, 0   #pointer for input
    li $t1, 0   #pointer for storing
    li $t2, 0   #parser
    li $t3, 0   #temp hold t0
    li $t4, 0   #hold reg num
    li $t8, 0   #number of reg

    li $v0, 8
    la $a0, input
    li $a1, 32
    syscall

    la $a0, input

    li $v0, 10  #end
    syscall


scan:
    lb $t2, input($t0)
    #beq $t2,'$',pass
    beq $t2,' ',pass

    beq $t2,'*',next
    beq $t2,',',next

    beq $t2,10,end

    sb $t2, inst($t1)

    addi $t1,1
    addi $t1,1

    j scan

next:
    move $t3, $t0 #store in t3 temporarily
    move $t0, $0
    move $t1, $0
    move $t2, $0
next2:
    lb $t2, inst($t0)
    beq $t2,'$',register    #t2 = $, reg
    bge $t2,65,funct        #t2 >= 65, funct
    ble $t2,57,num          #57 >= t2, num

funct:
    lb $t2, inst($t0)
    beq $t2, 'a', afunct
    beq $t2, 's', sfunct
    beq $t2, 'm', afunct
afunct:
    lb $t2, inst($t0)

sfunct:

mfunct:

num:
    lb $t2, inst($t0)


register:
    addi $t0, 1
    lb $t2, inst($t0)   #get reg type

    addi $t0, 1         #increase pointer

    lb $t4, inst($t0)   #find reg num and convert to t4
    addi $t4, -48

    beq $t2, 't', treg
    beq $t2, 'a', sreg
    beq $t2, 'v', vreg

treg:
    mult $t4,4
    mflo $t4
    lw $t2, tr($t4)
areg:
    mult $t4,4
    mflo $t4
    lw $t2, ar($t4)

vreg:
    mult $t4,4
    mflo $t4
    lw $t2, vr($t4)

.data
input:  .space 32
inst:   .space 32
tr: 01000,01001,01010,01011,01100,01101,01111
sr: 00100
vr: 00010

a:  001000

person mooooooose    schedule 27.04.2012    source источник
comment
После некоторого чтения я понимаю, как и что происходит смещение битов, но я не смог применить его к моей проблеме. Есть ли у кого-нибудь еще руководство?   -  person mooooooose    schedule 28.04.2012


Ответы (1)


Да, ваш ответ - сдвиг бит и логическое ИЛИ. Вы перемещаете различные части, указанные компонентами инструкции, на их соответствующие позиции в результирующем командном слове и логически ИЛИ их вместе. (Предполагая, что другие биты равны 0, добавление будет эквивалентным.

Поймите, что вы пишете (тривиальный случай) ассемблера.

person Chris Stratton    schedule 27.04.2012
comment
В любом случае вы можете немного подробнее рассказать о том, что вы только что сказали, возможно, на примере? Я очень ценю вашу помощь! - person mooooooose; 28.04.2012
comment
См. Примечания к лекциям хорошего старшеклассника курса CS, например, начиная со страницы 14 в 6004.csail.mit.edu/Fall09/handouts/L11-4up.pdf Другой процессор, но та же общая идея. - person Chris Stratton; 28.04.2012