MIPS преобразования шестнадцатеричного в двоичный - PullRequest
0 голосов
/ 10 ноября 2019

В настоящее время я пытаюсь создать программу, которая принимает ввод пользователя (32-разрядное шестнадцатеричное значение) и преобразует его в 32-разрядное двоичное число. Я думаю, что застрял в смене или в части ИЛИ, возможно, это потому, что я не полностью понимал метод маскировки. В любом случае, результаты выводят некоторые отрицательные значения, которые кажутся адресом некоторого значения. Вот мои коды. Должен ли я использовать другие методы? или я должен изменить способ преобразования значений? Любые разработки или предложения будут оценены.

Array:      .space 9
asc1:       .ascii "9"
asc2:       .ascii "F"
asc3:       .ascii "f"
asc4:       .ascii "0"
asc5:       .ascii "A"
asc6:       .ascii "a"

enter32:    .asciiz "Enter your a 32-bit binary string:  "


.text

main:
li $v0, 4
la $a0, enter32     #print prompt
syscall

la $a0, Array       #ready to put input to array
li $a1, 9           #allocate (8+1)bytes
li $v0, 8           #read input string
syscall

li $s1, 0           #counter i = 0

loop:
beq $s1, 9, exit  #iterates 8 times, if i=9,     finish loop
la $t0, Array      #load the input array
add $t1, $t0, $s1  #make i
lb $s2, 0($t1)     #$s2 = Array[i]

la $t2, asc1       #load  asc1's address
addi $t2, $t2, 1   #"9"+1

la $t3, asc2       #load asc2's address
addi $t3, $t3, 1   #"F" + 1

la $t4, asc3       #load asc3's address
addi $t4, $t4, 1   #"f" + 1

blt $s2 $t2, sub1  # if $s2 < "9"+1
blt $s2 $t3, sub2  # if $s2 < "F"+1
blt $s2 $t3, sub3  # if $s2 < "f"+1


sub1:
la $t4, asc4       # $t4 = "0"
sub $s2 $s2, $t4   # $s2 = $s2 - "0"
j shift

sub2:
la $t5, asc5       # $t5 =  "A"
sub $s2 $s2, $t5   # $s2 = $s2 - "A"
addi $s2 $s2, 10   # $s2 = $s2 + 10
j shift

sub3:
la $t6, asc6       # $t6 = "a"
sub $s2 $s2, $t6   # $s2 = $s2 - "a"
addi $s2 $s2, 10   # $s2 = $s2 + 10
j shift

shift:
li $t7, 0          #make mask
sll $t7,$t7,4      #binary left shift 4
or $s3, $t7, $s2   #or

li $v0, 1          #print the value
move $a0, $s3
syscall


li $s2, 0           #reinitialize $s2 = 0
addi $s1, $s1, 1    # add counter i++
j loop


exit:
li $v0, 10
syscall
...