Napisz mały podprogram, który konwertuje liczby w zakresie 0 do 15 do drukowanego znaku oznaczonego ASCII: "0" przez "9", lub "A" przez "F", w zależności od liczby. Dla liczb nie w zakresie od 0 do 15, niektóre bity zostaną zignorowane.

Nazwa: Podprogram musi być nazywany Hexasc. Parametr: Jeden, w rejestrze $ A0. 4 najmniej znaczących bitów określają liczbę, od 0 do 15. Wszystkie inne bity w rejestrze $ A0 mogą mieć dowolną wartość i musi być ignorowane. Wartość powrotowa: 7 najmniej znaczących bitów w rejestrze V0 musi być kodem ASCII, jak opisano poniżej. Wszystkie inne bity muszą być zero, gdy twoja funkcja powraca. Wymagane działanie: Funkcja musi konwertować wartości wejściowe 0 do 9 do kodów ASCII dla cyfr "0 'przez" 9 ", odpowiednio. Wartości wejściowe 10 do 15 muszą być przekształcone w kody ASCII dla liter "A" przez "F" odpowiednio.

.text

 main:
      li    $a0,0       # change this to test different values

      jal   hexasc      # call hexasc
      nop               # delay slot filler (just in case)  

      move  $a0,$v0     # copy return value to argument register

      li    $v0,11      # syscall with v0 = 11 will print out
      syscall           # one byte from a0 to the Run I/O window

stop:   j   stop        # stop after one run
       nop              # delay slot filler (just in case)

Napisałem tutaj podprogramy hexasc i z jakiegoś powodu nie rozumiem, więc nie działa. Nie mogę tego zrozumieć, w której części mam błędy, a może nie robię tak, jak mówi w powyższej specyfikacji. Każda pomoc byłaby doceniana, z góry dziękuję.

hexasc:
        addi    $sp,$sp,-4      #make space on the stack
        sw      $a0,0($sp)      #store $a0 on the stack
        li      $t0,0x30        #$t0 = 0x30 ('0' in ascii)
        andi    $a0,$a0,0xf     #only 4 least significant bits is 
                                #needed ignore other bits
loop:       
        add     $a0,$a0,$t0     #$a0 i will think why i did this
        addi    $t0,$t0,1       #increment $t0 by 1
        beq     $t0,0x39,loop2  # if $t0 = 0x39 (9 in ascii)
        j       loop


        li      $t1,0x41       # $t1 = 0x41 ( A in ascii)
loop2:  
        andi    $a0,$a0,0xf    # only 4 LSB ignore other bits
        add     $a0,$a0,$t1    # ???? i will think about this
        beq     $t1,0x46,done  # if $t1 = 0x46 (F in ascii)
        j       loop2

done:           
        add     $v0,$a0,$a0    # return  $a0 in $v0 suspicious ...?
        lw      $a0,0($sp)     # restore the $a0 
        addi    $sp,$sp,4      # put back the stack
        jr      $ra
2
user7549908 15 luty 2017, 17:53

1 odpowiedź

Najlepsza odpowiedź

Jest jeden mały błąd w tym dwóch postach, które warto wspomnieć, li $v0,0x41 powinien być li $v0,0x7. To ze względu na specyfikację, że wartość wejściowa 10 powinna wydrukować znak A w ASCII, ale jeśli masz li $v0,0x41 Wyjście będzie K zamiast K zamiast K X6}} W przypadku wartości wejściowej 10. Oto kolejna wersja hexasc, która drukuje tych, że jest to w twoim specyfikacji.

hexasc:
      andi  $a0,$a0,0x0f
      addi  $v0,$zero,0x30
      addi  $t0,$zero,0x9

      ble   $a0,$t0,L1
      nop
      addi  $v0,$v0,0x7

L1:
      add   $v0,$a0,$v0
      jr    $ra
nop
0
user7583029user7583029 19 luty 2017, 15:53