Сборка MIPS, преобразовать подписанный номер в основание 4 с 16 цифрами и подписать - PullRequest
0 голосов
/ 17 ноября 2018

Итак, проблема в том, что я хочу взять два массива и напечатать числа, которые появляются в них обоих, в основание 10 и основание 4 с 16 цифрами и знак в каскадный порядок .

проблема в том, что я не знаю, как преобразовать его в основание 4 и напечатать из 16 цифр и знака (-, если отрицательный).

это то, что мне удалось сделать сейчас:

find_eq:
fori:
    ble $t1,0,print4        #branch to print 4 when done printing in     decimal
    addi    $t1,$t1,-1      #i--
    add     $a1,$a1,-4      #next number in array1
    addi    $t2,$t2,10      #j=10 again
    add     $a2,$a2,40      #start of the array 2
forj:
    addi    $sp,$sp,-64     #add 16 words places in the stack
    ble     $t2,0,fori      #if t2 ==0 branch to fori
    lw      $t3,($a1)       #t3 = array1[i]
    lw      $t4,($a2)       #t4 = array2[j]
    addi    $t2,$t2,-1      #j--
    add     $a2,$a2,-4      #next number in array2
    bne     $t3,$t4,forj        #if array1[i] != array2[j] branch to forj
    beq     $a3,4,base4     #if the wanted base if 4 (wanted base kept in $a3) , branch to base4
    li      $v0,1           #print number
    add     $a0,$t3,$zero
    syscall
    li      $v0,4           #print comma
    la      $a0,comma
    syscall
    beq     $t2,0,fori      #if j ==0 return to fori
    j       forj            #return to forj

base4:
      ble   $sp,0,printem       #if the stack is on top , print number
abso: bltz  $t3,makeAbs     #if the number is negative branch to makeAbs
      div   $t3,$t3,4       #divide number by 4
      mfhi  $t8         #store the reminder of the division in t8
      sw    $t8,($sp)       #store the reminder in the stack
      add   $sp,$sp,4       #add to the stack 4 (in order to go to the next cell in the stack)
      j     base4           #jump back to base4
printem:
    ble     $t5,0,forj      #if t5 (started at 16) is 0 , go to forj
    lw      $t3,($sp)       #load to t3 the current word in the stack
    add     $sp,$sp,-4      #go to next cell in stack
    addi    $t5,$t5,-1      #t5 --
    li      $v0,1           #print number
    add     $a0,$t3,$zero
    syscall
    j       printem         #back to print the next number
makeAbs:
    abs     $t3,$t3         #make the number positive
    li      $v0,4           #printing minus sign
    la      $a0,minus
    syscall
    j       abso            #back to abso label

так, если заданные массивы: 1,2,3,4,5,6,7,8,9,10 а также 2,4,6,8,10,12,14,16,18,20

вывод должен быть:

10,8,6,4,2, в десятичном виде а также 0000000000000022,0000000000000020,0000000000000012,0000000000000010,0000000000000002 в базе 4

в случае, если число отрицательное, оно то же самое, но перед 16 цифрами стоит -.

Надеюсь, кто-нибудь может мне здесь помочь, я действительно не знаю, как решить эту проблему: (

Спасибо!

...