Untitled

 avatar
unknown
plain_text
10 months ago
6.9 kB
18
Indexable
        .data
# -------- Fibonacci --------
fibMsg:        .asciiz "Fibonacci Numbers:\n"
msgZero:       .asciiz " 0: 1\n"
msgOne:        .asciiz " 1: 1\n"
colonSpace:    .asciiz ": "
newLine:       .asciiz "\n"

# -------- Square --------
extraNewline:  .asciiz "\n"

# -------- Run Check --------
ascMsg:        .asciiz "Run Check: ASCENDING\n"
descMsg:       .asciiz "Run Check: DESCENDING\n"
neitherMsg:    .asciiz "Run Check: NEITHER\n"

# -------- Word Count --------
wordMsg:       .asciiz "Word Count: "
blankLine:     .asciiz "\n"

# -------- Reverse String --------
swapMsg:       .asciiz "String successfully swapped!\n"

        .text
        .globl studentMain

studentMain:

# ---------------- Task 1: Fibonacci ----------------
Task1:
        la   $t1, fib
        lw   $t0, 0($t1)         # fib → $t0

        beq  $t0, $zero, Task2   # if fib==0 skip

        # header
        addi $v0,$zero, 4
        la   $a0, fibMsg
        syscall

        # 0:1
        addi $v0,$zero, 4
        la   $a0, msgZero
        syscall

        # 1:1
        addi $v0,$zero, 4
        la   $a0, msgOne
        syscall

        addi $s0, $zero, 1   # prev = 1
        addi $s1, $zero, 1   # beforeThat = 1
        addi $s2, $zero, 2   # n = 2

FibLoop:
        slt  $t4, $t0, $s2
        bne  $t4, $zero, endFib

        # cur = prev + beforeThat
        add  $s3, $s0, $s1

        # print index
        addi $v0, $zero, 1
        add  $a0, $zero, $s2
        syscall

        # ": "
        addi $v0, $zero, 4
        la   $a0, colonSpace
        syscall

        # cur
        addi $v0, $zero, 1
        add  $a0, $zero, $s3
        syscall

        # newline
        addi $v0, $zero, 4
        la   $a0, newLine
        syscall

        # update
        add  $s1, $zero, $s0   # beforeThat = prev
        add  $s0, $zero, $s3   # prev = cur
        addi $s2,$s2,1         # n++

        j FibLoop

endFib:
        addi $v0, $zero, 4
        la   $a0, newLine
        syscall

# ---------------- Task 2: Square ----------------
Task2:
        la   $t1, square
        lw   $s0, 0($t1)          # square flag
        la   $t1, square_size
        lw   $s1, 0($t1)          # square size
        la   $t1, square_fill
        lb   $s2, 0($t1)          # fill char

        beq  $s0, $zero, Task3    # skip if square==0

        addi $s3, $zero, 0        # row = 0

RowLoop:
        slt  $t0, $s3, $s1
        beq  $t0, $zero, EndRows

        beq  $s3, $zero, BorderRow
        addi $t1, $s1, -1
        beq  $s3, $t1, BorderRow

MiddleRow:
        addi $t2, $zero, 124      # '|'
        add  $s4, $zero, $t2
        add  $s5, $zero, $s2
        j PrintRow

BorderRow:
        addi $t2, $zero, 43       # '+'
        add  $s4, $zero, $t2
        addi $t3, $zero, 45       # '-'
        add  $s5, $zero, $t3

PrintRow:
        addi $t4, $zero, 1
        slt  $t5, $t4, $s1
        beq  $t5, $zero, JustRight

        # left border
        addi $v0, $zero, 11
        add  $a0, $zero, $s4
        syscall

        # mids
        addi $t6, $zero, 1
MidLoop:
        addi $t7, $s1, -1
        slt  $t8, $t6, $t7
        beq  $t8, $zero, MidDone

        addi $v0, $zero, 11
        add  $a0, $zero, $s5
        syscall

        addi $t6, $t6, 1
        j MidLoop

MidDone:
JustRight:
        # right border
        addi $v0, $zero, 11
        add  $a0, $zero, $s4
        syscall

        # newline
        addi $v0, $zero, 4
        la   $a0, newLine
        syscall

        addi $s3, $s3, 1
        j RowLoop

EndRows:
        addi $v0, $zero, 4
        la   $a0, newLine
        syscall

# ---------------- Task 3: Run Check ----------------
Task3:
        la   $t0, runCheck
        lw   $t0, 0($t0)
        beq  $t0, $zero, Task4

        la   $t1, intArray_len
        lw   $t1, 0($t1)       # len
        slti $t2, $t1, 2
        bne  $t2,$zero, PrintBoth

        addi $s0,$zero,1       # asc=1
        addi $s1,$zero,1       # desc=1

        la   $t3, intArray
        addi $t4,$zero,1       # i=1

ChkLoop:
        slt  $t5,$t1,$t4
        bne  $t5,$zero, EndChk

        sll  $t6,$t4,2
        add  $t7,$t3,$t6
        lw   $t8,0($t7)        # arr[i]

        addi $t6,$t6,-4
        add  $t7,$t3,$t6
        lw   $t9,0($t7)        # arr[i-1]

        slt  $t2,$t8,$t9
        beq  $t2,$zero, SkipAsc
        addi $s0,$zero,0
SkipAsc:
        slt  $t2,$t9,$t8
        beq  $t2,$zero, SkipDesc
        addi $s1,$zero,0
SkipDesc:

        addi $t4,$t4,1
        j ChkLoop

EndChk:
        bne  $s0,$zero, DoAsc
        j DoDescChk
DoAsc:
        addi $v0,$zero,4
        la   $a0, ascMsg
        syscall
DoDescChk:
        bne  $s1,$zero, DoDesc
        j DoNeither
DoDesc:
        addi $v0,$zero,4
        la   $a0, descMsg
        syscall
        j RCBlank
DoNeither:
        addi $v0,$zero,4
        la   $a0, neitherMsg
        syscall
        j RCBlank

PrintBoth:
        addi $v0,$zero,4
        la   $a0, ascMsg
        syscall
        addi $v0,$zero,4
        la   $a0, descMsg
        syscall

RCBlank:
        addi $v0,$zero,4
        la   $a0, blankLine
        syscall

# ---------------- Task 4: Word Count ----------------
Task4:
        la   $t0, countWords
        lw   $t0, 0($t0)
        beq  $t0, $zero, Task5

        la   $t1, str
        addi $s0,$zero,0     # count=0
        addi $s1,$zero,0     # inWord=0

StrLoop:
        lb   $t2,0($t1)
        beq  $t2,$zero, EndStr

        addi $t3,$zero,32    # ' '
        beq  $t2,$t3, NotWord
        addi $t3,$zero,10    # '\n'
        beq  $t2,$t3, NotWord

        bne  $s1,$zero, InWord
        addi $s0,$s0,1
        addi $s1,$zero,1
        j NextCh
NotWord:
        addi $s1,$zero,0
InWord:
NextCh:
        addi $t1,$t1,1
        j StrLoop

EndStr:
        addi $v0,$zero,4
        la   $a0, wordMsg
        syscall
        addi $v0,$zero,1
        add  $a0,$zero,$s0
        syscall
        addi $v0,$zero,4
        la   $a0, blankLine
        syscall
        addi $v0,$zero,4
        la   $a0, blankLine
        syscall

# ---------------- Task 5: Reverse String ----------------
Task5:
        la   $t0, revString
        lw   $t0, 0($t0)
        beq  $t0,$zero, Done

        la   $s0, str         # base
        addi $s1,$zero,0      # head
        addi $s2,$zero,0      # tail

FindTail:
        add  $t1,$s0,$s2
        lb   $t2,0($t1)
        beq  $t2,$zero, TailFound
        addi $s2,$s2,1
        j FindTail

TailFound:
        addi $s2,$s2,-1

SwapLoop:
        slt  $t3,$s1,$s2
        beq  $t3,$zero, EndSwap

        add  $t4,$s0,$s1
        lb   $t5,0($t4)

        add  $t6,$s0,$s2
        lb   $t7,0($t6)

        sb   $t7,0($t4)
        sb   $t5,0($t6)

        addi $s1,$s1,1
        addi $s2,$s2,-1
        j SwapLoop

EndSwap:
        addi $v0,$zero,4
        la   $a0, swapMsg
        syscall
        addi $v0,$zero,4
        la   $a0, blankLine
        syscall

# ---------------- Done ----------------
Done:
        jr $ra
Editor is loading...
Leave a Comment