В настоящее время я пытаюсь создать программу, которая принимает ввод пользователя (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