Saturday, January 5, 2008

Programming Tower of Hanoi using Assembly

I was posed with a lab assignment to code Tower of Hanoi in Assembly. As I have graduated from the course, I have no qualms in sharing out the thought process of working out the code.

I believe the objective in this lab assignment is for students to understand the underlying mechanism to handle recursion. The following is the code snippet of my solution in assembly:

.text

.globl main

main:

addi $sp, $sp, -8 # Make space on stack.
sw $ra, 0($sp) # Save return address.

la $a0, prompt
li $v0, 4
syscall # display prompt

li $v0, 5
syscall # get integer response from user

li $t0, 1
slt $t1, $v0, $t0 # user supplied a number less than 1, how can this be valid
bne $t1, $zero, exit # just exit the program

sw $v0, 4($sp)# save initial value of numDiscs

move $a0, $v0 # $numdisc = user specified value
move $v1, $zero # steps = 0
li $a1, 1 # start = 1
li $a2, 3 # goal = 3
jal towers

printf:

lw $a0, 4($sp) # Get initial value of numDiscs back
li $v0, 1
syscall

la $a0, midOfEndResult
li $v0, 4
syscall # print middle part of sentence

move $a0, $v1
li $v0, 1
syscall # print results

la $a0, steps
li $v0, 4
syscall # print end of string

lw $ra, 0($sp) # Restore return address.

exit:
addi $sp, $sp, 8 # Restore stack pointer.
jr $ra # return to main

towers:

addi $sp, $sp -16
sw $ra, 0($sp) # save return address

sw $s0, 4($sp) # save numDiscs
move $s0, $a0

sw $s1, 8($sp) # save start
move $s1, $a1

sw $s2, 12($sp) # save goal
move $s2, $a2

li $t0, 2
slt $t1, $a0, $t0
beq $t1, $zero, moreThanEqualsTwo # numDiscs >= 2

lessThanTwo:

# print (start, goal)
la $a0, lbracket
li $v0, 4
syscall

move $a0, $a1
li $v0, 1
syscall


la $a0, comma
li $v0, 4
syscall

move $a0, $a2
li $v0, 1
syscall

la $a0, rbracket
li $v0, 4
syscall

la $a0, endl
li $v0, 4
syscall
# end print

addi $v1, $v1, 1 # steps++

j returnCall

moreThanEqualsTwo:

li $t0, 6
sub $t0, $t0, $s1
sub $t0, $t0, $s2 # peg = 6 - start - goal
addi $a0, $s0, -1 # numDiscs - 1
move $a1, $s1 # start = start
move $a2, $t0 # goal = peg
jal towers # towers(numDiscs-1, start, peg)

li $a0, 1
move $a1, $s1 # start = start
move $a2, $s2 # end = end
jal towers # towers(1, start, goal)

li $t0, 6
sub $t0, $t0, $s1
sub $t0, $t0, $s2 # peg = 6 - start - goal
addi $a0, $s0, -1 # numDiscs - 1
move $a1, $t0 # start = peg
move $a2, $s2 # goal = goal
jal towers #towers(numDiscs-1, peg, goal)

returnCall:

lw $ra, 0($sp) # restore return address
lw $s0, 4($sp) # restore numDiscs
lw $s1, 8($sp) # restore start
lw $s2, 12($sp) # restore goal
addi $sp, $sp, 16 #restore stack pointer
jr $ra # return to previous call

.data
prompt: .asciiz "Enter the number of disks to be moved: "
lbracket: .asciiz "("
comma: .asciiz ", "
rbracket: .asciiz ")"
endl: .asciiz "\n"
midOfEndResult: .asciiz " disc(s) moved from peg 1 to peg 3 in "
steps: .asciiz " steps.\n"

After being able to code everything on my own, I felt so blessed that higher level languages like C++ and Java had built-in mechanisms to handle recursion for the programmer. Imagine how much time and effort you would have saved if a similar solution in C++ (with comments) is only around 20 lines of C++ coding?

Sunday, December 30, 2007

Lorem ipsum

Lorem ipsum dolor sit amet, ullamcorper in lectus est etiam mollis, purus in praesent vulputate, vel vivamus dolor, justo augue duis in arcu. Integer tempor cras malesuada tristique pulvinar imperdiet, mauris in. Id felis volutpat, tortor et sapien, sed cum at orci quis cubilia parturient. Sem id aliquet luctus, wisi conubia fringilla lacinia erat mauris. Ipsum phasellus porttitor nunc fermentum porttitor, fames erat eu. Sodales pretium morbi ipsum mauris. Est cras pellentesque rutrum pede rhoncus sed, molestie lorem ornare blanditiis ut placerat. Morbi at mauris duis urna a velit. Ac amet non tempor urna vulputate ultricies, tempor sollicitudin odio pede elit risus, commodo nonummy aliquam, pretium vitae sapien nullam nunc venenatis, vulputate tempor. Dictum curabitur sed quis orci sociis, suspendisse tincidunt dui.

Dolor mauris ipsum aliquam metus id faucibus, mollis quis nibh urna, mauris libero sit donec, ultricies lacinia, velit nec ac ligula nulla. Urna morbi nam et, accumsan magna placerat, morbi risus vivamus cras, aliquam vulputate congue ac dolor in. Nec sed, risus conubia nonummy sem. Arcu nunc hymenaeos tempor praesent, dolor wisi sed nullam nunc libero leo. Nam elementum et pellentesque quisque mi, quisque nam dolor cubilia vitae in.

Inceptos cursus, euismod sit. Lacinia totam volutpat phasellus cursus quam, mauris proin feugiat nec mauris, odio est, aenean sit nibh molestie praesent vel auctor. Etiam sed leo laoreet volutpat vehicula, arcu et nibh id adipiscing. Vel pellentesque torquent pede libero, ut bibendum parturient vivamus, pede molestie pellentesque, nec nullam metus ornare tortor eros. Vivamus blandit, euismod morbi quis. Erat fringilla pulvinar eget fusce, imperdiet est sagittis rhoncus curabitur consequat, magnis rutrum augue ac phasellus viverra eget, mi vivamus donec posuere amet, vestibulum non conubia justo. Senectus luctus, dis proident eros eget, risus nec facilisis laoreet justo dui, mauris a feugiat massa in pellentesque, nec mauris nulla nunc a sit. Nisl molestie tortor in lectus, enim eu.

Varius augue, nulla et integer ultrices egestas blandit. Nullam sed ullamcorper nunc natoque, etiam enim ut ac in quis, sit potenti nibh. Quam sed odio, luctus accumsan dolor malesuada in justo, mauris cras tincidunt a justo libero, etiam vitae sociosqu ut varius placerat, volutpat nunc laoreet. Nulla placerat sollicitudin et magna ante, molestiae quis nunc, sagittis et. Montes parturient amet adipisci, platea malesuada blandit nec wisi, orci curabitur vulputate justo velit, cum purus ac ac, mauris tincidunt. Vehicula iaculis libero ut facilisi parturient nulla, sequi ultrices lacus diam nec eget odio, imperdiet amet quis, tortor mi, est ultrices lacus. Maecenas augue dui eros ligula vivamus, libero praesent dui aliquam. Augue iaculis et earum cras risus lacinia, in porttitor faucibus ullamcorper amet nullam, wisi arcu diam. Tellus consectetuer sed non elementum, eu malesuada vivamus pede, venenatis pellentesque eu mauris magnis ut etiam, enim donec molestie ac.