Сборка MIPS - строка инструкций для Hex
Я работаю над чем-то в сборке, где требуется строка для инструкции, например,
add $t1, $t0, $t1
и распечатывает инструкцию в шестнадцатеричном виде.
Я сканирую строку по частям, а добавление распознается первым. Добавить имеет код операции 001000 (6 бит)
t1 сканируется, сравнивается с разделом данных и имеет значение 5 битов 01001, то же самое с t0 с 01000 и снова t1 с 01001. Все они сканируются по порядку, поэтому приоритет не так важен, насколько как я могу сказать.
С тех пор я знаю, что мне нужно как-то смешать их, а затем преобразовать из двоичного в шестнадцатеричное. Моя проблема в том, что я не уверен, как я должен хранить эти двоичные значения, когда они читаются. Хранить ли их в разделе данных, что кажется неправильным из-за их нечетных размеров, или есть более простой способ.
Честно говоря, я не знаю много о сдвиге битов, поэтому ответ может лежать там.
Вот мой код Это очень много WIP
#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
1 ответ
Да, ваш ответ заключается в сдвиге битов и логическом ИЛИ. Вы сдвигаете различные части, указанные компонентами инструкции, в их соответствующие позиции в результирующем слове инструкции и логически ИЛИ их вместе. (Предполагая, что другие биты равны 0, добавление будет эквивалентным.
Поймите, что вы пишете (тривиальный случай) ассемблер.