0

我正在Assembly中做一些事情,它需要一个字符串作为指令,例如

add $t1, $t0, $t1 

并以十六进制打印出指令。

我逐个扫描字符串,首先识别添加。Add 的操作码为 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
4

1 回答 1

1

是的,您的答案是位移和逻辑 OR'ing。您将指令组件指示的各个部分移动到生成的指令字中的适当位置,并将它们逻辑或在一起。(假设其他位为 0,相加将是等效的。

意识到你正在做的是编写一个汇编程序(一个小例子)。

于 2012-04-27T21:49:58.223 回答