Как упаковать (сконденсировать) байты строки, используя или и sll?
Я пишу программу, которая читает 4 шестнадцатеричные цифры, которые представляют собой целое число без знака, затем она конденсирует эти цифры в $t1 и, наконец, вычисляет и отображает десятичное число.
Я полностью усвоил решение в теории, но у меня проблемы с использованием mips, так как это моя первая программа. В настоящее время у меня проблемы с хранением байтов строки. Вот мой код до сих пор:
.data
msg1: .asciiz "Enter the hexadecimal : "
newline: .asciiz "\n"
.text
main:
#Print string msg1
li $v0 ,4 # print_string syscall code = 4
la $a0,msg1 #load the adress of msg
syscall
# Get input A from user and save
li $v0,8 # read_string syscall code = 8
syscall
move $t0,$v0 # syscall results returned in $v0
li $v0,10
syscall
Я знаю, что я буду использовать фунт Rdest, адрес в какой-то момент. Но разве мне не придется читать каждую цифру строки одну за другой, если это так?
1 ответ
Решение
.data
msg1: .asciiz "Enter the hexadecimal : "
buffer: .space 10
.text
main:
#Print string msg1
li $v0 ,4 # print_string syscall code = 4
la $a0,msg1 #load the adress of msg
syscall
# Get input A from user and save
la $a0, buffer # address
li $a1, 10 # length
li $v0,8 # read_string syscall code = 8
syscall
li $t0, 0 # result
loop:
lb $t1, ($a0) # fetch char
beq $t1, $0, done # zero terminator?
addiu $t1, $t1, -10 # line feed?
beq $t1, $0, done
addiu $t1, $t1, -38 # convert digit
sltiu $t2, $t1, 10 # was it a digit?
bne $t2, $0, append # yes
# add validation and upper case here as needed
addiu $t1, $t1, -39 # convert lower case letter
append:
sll $t0, $t0, 4 # make room
or $t0, $t0, $t1 # append new digit
addiu $a0, $a0, 1 # next char
j loop
done:
move $a0, $t0 # print result
li $v0, 1
syscall
li $v0,10
syscall