MIPS将十六进制转换为二进制

时间:2019-11-10 15:45:01

标签: assembly mips mips32 qtspim mips64

我目前正在尝试制作一个程序,以接受用户输入(32位十六进制值)并将其转换为32位二进制数。我认为我停留在班次和OR部分,也许是因为我不完全了解屏蔽方法。无论如何,结果打印出一些负值,似乎是某个值的地址。这是我的代码。我应该使用其他方法吗?还是应该更改转换值的方式?任何细节或建议,将不胜感激。

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

0 个答案:

没有答案