################################################################################
##
## Solution to LSU EE 3755 Fall 2001 Practice Final Problem 2
##
# Exam: http://www.ece.lsu.edu/ee3755/2001f/fep.pdf
# The solution starts at the "atoi" label below.
# Program Output:
#
# The string at address 0x10010000 which is "713" has a value of 713.
# Confused? If so then think about it.
# Still confused? Ask for help before it's too late!
.data
SEVEN_HUNDRED_THIRTEEN:
.asciiz "713"
MSG:
.ascii "The string at address 0x%/a1/x which is \"%/a1/s\" "
.ascii "has a value of %/v1/d.\n"
.ascii "Confused? If so then think about it.\n"
.asciiz "Still confused? Ask for help before it's too late!"
.text
.globl __start
__start:
la $a0, SEVEN_HUNDRED_THIRTEEN
add $a1, $a0, $0 # Make a copy of the address
jal atoi
nop
# $v0 should contain 713.
add $v1, $v0, $0 # Make a copy of the return value.
la $a0, MSG
addi $v0, $0, 11 # Print out results.
syscall
addi $v0, $0, 10 # Exit.
syscall
atoi:
# Called with $a0 the address of an ASCII null-terminated string.
# Return value of string as an integer in $v0.
# String contains only digits, no whitespace, no - or +.
# Number in string is in decimal.
# This routine is allowed to modify $a0.
j START
add $v0, $0, $0
LOOP:
addi $t1, $t1, -48 # '0' = 48
sll $t2, $v0, 3
sll $t3, $v0, 1
add $v0, $t2, $t3
add $v0, $v0, $t1
START:
lb $t1, 0($a0)
bne $t1, $0, LOOP
addi $a0, $a0, 1
jr $ra
nop