Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ####String Concat Input
- .data
- msg1: .asciiz "Enter String 1 : "
- msg2: .asciiz "Enter String 2 : "
- msg3: .asciiz "Concatenated String (1) : "
- str1: .space 20
- str2: .space 20
- newline: .asciiz "\n"
- .text
- .globl main
- main:
- li $v0, 4 # print msg1
- la $a0, msg1
- syscall
- li $v0, 8 # input str1
- la $a0, str1
- li $a1, 20 # max length = 20
- syscall
- move $a2, $a0 # $a2 = *str1 = *dst
- li $v0, 4 # print msg2
- la $a0, msg2
- syscall
- li $v0, 8 # input str2
- la $a0, str2
- li $a1, 20 # max length = 20
- syscall
- move $a3, $a0 # $a3 = *str2 = *src
- # arguments : *str1 in $a2 and *str2 in $a3
- jal strcat # call strcat()
- # return address in $v1 even though it doesn't matter since $v1 = $a2 ie. address of str1/dst
- li $v0, 4 # print msg3
- la $a0, msg3
- syscall
- li $v0, 4 # print result
- la $a0, 0($a2)
- syscall
- li $v0, 10 # exit
- syscall
- strcat:
- li $t0, 0 # $t0 = i = 0
- li $t3, 0 # $t3 = j = 0
- loop1:
- add $t1, $t0, $a2 # $t1 = addr of str1[i]
- lbu $t2, 0($t1) # $t2 = str1[i]
- beq $t2, $zero, remove_newline # if *str1 == 0 { goto remove_newline }
- addi $t0, $t0, 1 # i++
- j loop1
- remove_newline:
- addi $t1, $t1, -1 # remove newline from the end of dst/str1 coz it counts as a character (lol)
- loop2:
- add $t4, $t3, $a3 # $t4 = addr of str2[i]
- lbu $t5, 0($t4) # $t5 = str2[i]
- beq $t5, $zero, end_loop # if *str2 == 0 { goto end_loop }
- sb $t5, 0($t1) # str1[i] = str2[j]
- addi $t1, $t1, 1 # dst++
- addi $t3, $t3, 1 # src++
- j loop2
- end_loop:
- lb $t6, 0($t4) # *dst = *src = '/0'
- sb $t6, 0($t1)
- move $v1, $a2
- jr $ra # return to caller
- ####Sort
- for (i = ..)
- for (j...)
- if (option == 0) for every element this is done
- if a[i] > a[j] ascending
- swap
- else
- if a[i] < a[j] descening..
- main:
- la $t0, L1
- lw $t1, 0($t0)
- #modify $t1 with opcode of blt
- sw $t1, 0($t0)
- jal sort
- sort:
- li $t0, 0
- add $t1, $t0, 1
- L1 : bgt ....
- jr $r31
- #####GCD nonrecursive
- .data
- msg1: .asciiz "Enter number 1: "
- msg2: .asciiz "Enter number 2: "
- msg3: .asciiz "GCD : "
- num1: .word 0
- num2: .word 0
- res: .word 0
- newline: .asciiz "\n"
- .text
- .globl main
- main:
- li $v0, 4 # print msg1
- la $a0, msg1
- syscall
- li $v0, 5
- syscall # getting input num1
- sw $v0, num1
- li $v0, 4 # print msg2
- la $a0, msg2
- syscall
- li $v0, 5
- syscall # getting input num2
- sw $v0, num2
- lw $t1, num1
- lw $t2, num2
- li $t0, 1 # i = 1
- li $t3, 0 # gcd = 0
- loop:
- bgt $t0, $t1, end_loop
- bgt $t0, $t2, end_loop
- divu $t1, $t0
- mfhi $t4 # t4 = num1%i
- bne $t4, 0, try_next_i
- divu $t2, $t0
- mfhi $t4 # t4 = num2%i
- bne $t4, 0, try_next_i
- move $t5, $t0 # if(n1%i==0 && n2%i==0) {gcd = $t5 = i;}
- try_next_i:
- addiu $t0, $t0, 1 # i++
- j loop
- end_loop:
- sw $t5, res # store result
- li $v0, 4 # print msg3
- la $a0, msg3
- syscall
- li $v0, 1
- lw $a0, res # output gcd
- syscall
- li $v0, 10 # exit
- syscall
- ####GCD recursive
- .data
- num1: .word 0
- num2: .word 0
- result: .word 0
- buffer: .asciiz ""
- msg1: .asciiz "A : "
- msg2: .asciiz "B : "
- msg3: .asciiz "GCD : "
- .text
- .globl main
- main:
- # Print msg1
- li $v0, 4
- la $a0, msg1
- syscall
- # Input num1
- li $v0, 5
- syscall
- sw $v0, num1
- # Print msg2
- li $v0, 4
- la $a0, msg2
- syscall
- # Input num2
- li $v0, 5
- syscall
- sw $v0, num2
- # Set arguments
- lw $a0, num1
- lw $a1, num2
- # Call gcd
- jal gcd
- sw $v0, result
- # Print msg3
- li $v0, 4
- la $a0, msg3
- syscall
- # Print result
- li $v0, 1
- lw $a0, result
- syscall
- # Terminate
- li $v0, 10
- syscall
- .end main
- .globl gcd
- .ent gcd
- gcd:
- addi $sp, $sp, -12
- sw $ra, ($sp)
- sw $a0, 4($sp)
- sw $a1, 8($sp)
- div $a0, $a1
- mfhi $v0
- beq $v0, $zero, gcddone
- add $a0, $a1, $zero
- add $a1, $v0, $zero
- jal gcd
- gcddone:
- add $v0, $a1, $zero
- lw $ra, ($sp)
- lw $a0, 4($sp)
- lw $a1, 8($sp)
- addi $sp, $sp, 12
- jr $ra
- .end gcd
- ####Exponential Recursive
- #int power (int a, int n)
- #{
- # if (n == 1) return a;
- # return a * power(n - 1);
- #}
- #main()
- #{
- # pow = power(a, n);
- #}
- .data
- a: .word 9
- n: .word 5
- pow: .word 0
- .text
- .globl main
- main:
- lw $a0, a
- lw $a1, n
- jal power
- sw $v0, pow
- li $v0, 1
- lw $a0, pow
- syscall
- li $v0, 10
- syscall
- power:
- addi $sp, $sp, -8 # adjust stack for 2 items
- sw $ra, 4($sp) # save return address
- sw $a0, 0($sp)
- addi $t1, $zero, 1 # $t1 = 1
- bgt $a1, $t1, L1 # if $a1(=n) > $t1(=1) goto L1
- move $v0, $a0 # if $a1(=n) == $t1(=1), result is $a0(=n)
- addi $sp, $sp, 8 # pop 2 items from stack
- jr $ra # and return
- L1:
- addi $a1, $a1, -1 # decrement n
- jal power # recursive call: $v0=power(a, n-1)
- lw $a0, 0($sp) # restore original a
- mul $v0, $a0, $v0 # pseudo inst: multiply $v0=$a0(=a)*$v0(=power(a,n-1))
- lw $ra, 4($sp) # retrive return address
- addi $sp, $sp, 8 # restore sp
- jr $ra # and return
- #####Binary Search
- # isFound = 0
- # lo = 0
- # high = n-1
- # while (lo <= high) {
- # mid = (lo + high)/2;
- # if (data == A[mid]) { isFound = 1; break; }
- # if (data < A[mid]) { high = mid - 1; continue;}
- # low = mid + 1;
- #}
- .data
- A: .word -32, -16, 0, 8, 16, 32, 64
- n: .word 7
- data: .word -16
- msg1: .asciiz " Found at pos: "
- msg2: .asciiz " Not found"
- .text
- .globl main
- main:
- lw $t0, data # $t0 = (data)
- li $t1, 0 # $t1 = 0 (isFound)
- li $t2, 0 # $t2 = 0 (lo)
- lw $t3, n # $t3 = n
- add $t3, $t3, -1 # $t3 = n-1 (high)
- L1:
- bgt $t2, $t3, end_loop # if (lo > hi) end_loop
- add $t4, $t2, $t3 # $t4 = lo + high
- srl $t4, $t4, 1 # shift right logical: $t4 = $t4/2 (mid)
- sll $t5, $t4, 2 # shift left logical: $t5 = $t4 * 4
- lw $t6, A($t5) # $t6 = A[mid]
- bne $t0, $t6, not_equal # $t0 != $t6 (data != A[mid])
- li $t1, 1 # $t1 = 1 (isFound = 1)
- j end_loop # jmp outside loop
- not_equal:
- blt $t0, $t6, less_than # $t0 < $t6 (data < A[mid])
- addiu $t2, $t4, 1 # ($t2)lo = ($t4)mid + 1
- j L1 # continue from begining.
- less_than:
- addiu $t3, $t4, -1 # ($t3)high = ($t4)mid - 1
- j L1 # continue from begining.
- end_loop:
- li $v0, 1 # print int
- move $a0, $t0 # $a0 = data
- syscall
- li $v0, 4
- beq $t1, $zero, msg_nf # if (isFound == 0)
- la $a0, msg1 # isFound == 1 display msg
- syscall
- li $v0, 1 #
- move $a0, $t4 # $a0 = mid
- syscall
- j exit
- msg_nf :
- la $a0, msg2 # isFound == 0 display msg
- syscall
- exit:
- li $v0, 10 # exit
- syscall #
- #####Sum of array elements
- .data
- arr: .word 10, 20, 30, 40
- num: .word 4
- msg: .asciiz "The sum of nos = "
- sum: .word 0
- .text
- .globl main
- main:
- li $t0, -1
- li $t0, 0 # $t0=sum=0
- li $t1, 0 # $t1=i=0
- lw $t2, num # $t2=num
- next_i:
- bge $t1, $t2, end_loop # if i>=num goto over
- sll $t3, $t1, 2 # $t3 = $t2 (i) << 2
- lw $t4, arr($t3) #$t4 = Arr(i)
- add $t0, $t0, $t4 # sum = sum + arr(i)
- addu $t1, $t1, 1 # i = i +i
- j next_i
- end_loop:
- sw $t0, sum # sum=$t0
- li $v0, 4
- la $a0, msg
- syscall
- li $v0, 1 #
- lw $a0, sum
- syscall
- li $v0, 10 # exit
- syscall #
- #####Check pirme
- .data
- msg1: .asciiz "Enter the no: "
- msg_is_prime:
- .asciiz "The no is prime\n"
- msg_is_not_prime:
- .asciiz "The no is not prime\n"
- num: .word 0
- newline : .asciiz "\n"
- .text
- .globl main
- main:
- li $v0, 4 # syscall 4 (print_str)
- la $a0, msg1 # argument: string
- syscall # print the string
- li $v0, 5
- syscall
- sw $v0, num
- lw $t0, num # $t0 = num
- srl $t1, $t0, 1 # $t1 = num/2
- li $t2, 1 # $t2 = isPrime = 1
- li $t3, 2 # $t3 = i = 2
- next_i:
- bleu $t3, $t1, calc_rem # if (i < num/2) then calc_rem
- j check_is_prime
- calc_rem:
- divu $t0, $t3 # num % i
- mfhi $t4 # $t4 = rem (hi)
- bne $t4, $0, try_next_i # if (rem != 0) try_next_i
- li $t2, 0 # if (rem == 0) isPrime = 0; break
- j check_is_prime #
- try_next_i:
- addiu $t3, $t3, 1 # i = i + 1
- j next_i # goto next_i
- check_is_prime:
- beq $t2, $0, is_not_prime # isPrime == 0
- la $a0, msg_is_prime
- j print_msg
- is_not_prime:
- la $a0, msg_is_not_prime
- print_msg:
- li $v0, 4
- syscall
- li $v0, 10 # exit
- syscall #
- ####Sum to N numbers
- #
- # int i, sum = 0;
- # for (i=0; i < N; i++)
- # sum = sum + i
- #
- .data
- msg1: .asciiz "Enter N: "
- msg2: .asciiz "The Sum = "
- no: .word 0
- sum: .word 0
- crlf: .byte 0xd, 0xa, 0
- .text
- .globl main
- main:
- li $v0, 4 # syscall 4 (print_str)
- la $a0, msg1 # argument: string
- syscall # print the string
- li $v0, 5
- syscall
- sw $v0, no
- li $t0, 0 # sum = 0
- li $t1, 1 # $t1 (i = 1)
- lw $t2, no # $t2 (t2 = no)
- next:
- bgt $t1, $t2, over
- add $t0, $t0, $t1 # sum = sum + i;
- addi $t1, $t1, 1 # i = i + 1
- j next
- over:
- sw $t0, sum
- li $v0, 4 # syscall 4 (print_str)
- la $a0, crlf # argument: string
- syscall # print the string
- li $v0, 4 # syscall 4 (print_str)
- la $a0, msg2 # argument: string
- syscall # print the string
- li $v0, 1
- lw $a0, sum
- syscall
- li $v0, 10 #
- syscall #
- .end main
- ####String concat hardcoded
- # strcat algo :
- # char* strcat (char * dst, char * src){
- # char* originalDst = dst;
- # while(*dst){ //i
- # dst++; }
- # while(*src){ //j
- # *dst = *src;
- # dst++;
- # src++;
- # }
- # *dst = *src; // = '/0'
- # return originalDst;
- # }
- .data
- msg1: .asciiz "Enter String 1 : "
- msg2: .asciiz "Enter String 2 : "
- msg3: .asciiz "Concatenated String : "
- str1: .asciiz "Hello"
- str2: .asciiz "World"
- .text
- .globl main
- main:
- la $a2, str1 # $a2 = *str1 = *dst
- la $a3, str2 # $a3 = *str2 = *src
- # arguments : *str1 in $a2 and *str2 in $a3
- # return address in $v1
- jal strcat
- li $v0, 4 # print msg2
- la $a0, msg3
- syscall
- li $v0, 4 # print result
- la $a0, 0($v1)
- syscall
- li $v0, 10
- syscall
- .end main
- strcat:
- li $t0, 0 # $t0 = i = 0
- li $t3, 0 # $t3 = j = 0
- loop1:
- add $t1, $t0, $a2 # $t1 = addr of str1[i]
- lbu $t2, 0($t1) # $t2 = str1[i]
- beq $t2, $zero, loop2 # if *str1 == 0 { goto loop2 }
- addi $t0, $t0, 1 # i++
- j loop1
- loop2:
- add $t4, $t3, $a3 # $t4 = addr of str2[i]
- lbu $t5, 0($t4) # $t5 = str2[i]
- beq $t5, $zero, end_loop # if *str2 == 0 { goto end_loop }
- sb $t5, 0($t1) # str1[i] = str2[j]
- addi $t1, $t1, 1 # dst++
- addi $t3, $t3, 1 # src++
- j loop2
- end_loop:
- lb $t6, 0($t4) # *dst = *src = '/0'
- sb $t6, 0($t1)
- move $v1, $a2
- jr $ra
- .end strcat
- #####Linear Search
- .data
- A: .word -32, -16, 0, 8, 16, 32, 64
- len: .word 7
- data: .word 16
- msg1: .asciiz " found at pos: "
- msg2: .asciiz " not found"
- .text
- .globl main
- main:
- lw $t0, data
- li $t1, 0 # isFound = 0
- li $t2, 0 # i in $t2
- lw $t3, len # len in $t3
- addi $t3, $t3, -1
- L1:
- bgt $t2, $t3, end_loop
- add $t4, $t2, $zero
- sll $t4, $t4, 2
- lw $t5, A($t4)
- bne $t0, $t5, not_equal
- li $t1, 1 # isFound = 1
- j end_loop
- not_equal:
- addi $t2, $t2, 1
- j L1
- end_loop:
- li $v0, 1
- move $a0, $t0
- syscall
- li $v0, 4
- beq $t1, $zero, msg_nf
- la $a0, msg1
- syscall
- li $v0, 1
- move $a0, $t2
- syscall
- j exit
- msg_nf:
- la $a0, msg2
- syscall
- exit:
- li $v0, 10
- syscall
- .end main
- #####Leap Year
- # algo for checking leap year :
- # (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
- .data
- msg1: .asciiz "Enter a year : "
- msg2: .asciiz " is a leap year"
- msg3: .asciiz " is not a leap year"
- .text
- .globl main
- main:
- li $v0, 4
- la $a0, msg1
- syscall
- li $v0, 5
- syscall
- move $t0, $v0 # year in $t0
- li $t1, 4
- li $t2, 100
- li $t3, 400
- div $t0, $t1 # year % 4
- mfhi $t1
- div $t0, $t2 # year % 100
- mfhi $t2
- div $t0, $t3 # year % 400
- mfhi $t3
- li $v0, 1
- move $a0, $t0
- syscall
- li $v0, 4
- divby4:
- beq $t1, 0, divby100
- j divby400
- divby100:
- bne $t2, 0, leapyear
- divby400:
- beq $t3, 0, leapyear
- j noleapyear
- leapyear:
- la $a0, msg2
- j end
- noleapyear:
- la $a0, msg3
- end:
- syscall
- li $v0, 10
- syscall
- .end main
- #####Armstrong
- .data
- msg0: .asciiz "Enter a number : "
- msg1: .asciiz " is"
- msg2: .asciiz " not"
- msg3: .asciiz " an armstrong number"
- .text
- .globl main
- main:
- li $v0, 4
- la $a0, msg0
- syscall
- li $v0, 5
- syscall
- move $t4, $v0 # num in $t4
- li $t0, 0 # sum in $t0
- move $t1, $t4 # temp in $t1
- li $t5, 10
- loop:
- beq $t1, 0, endloop
- div $t1, $t5
- mflo $t1 # $t1 = temp/10
- mfhi $t2 # $t2 = temp%10
- mfhi $t3
- mult $t2, $t3
- mflo $t3
- mult $t2, $t3
- mflo $t3 # calc cube
- add $t0, $t0, $t3
- j loop
- endloop:
- li $v0, 1
- move $a0, $t4
- syscall
- li $v0, 4
- la $a0, msg1
- syscall
- beq $t0, $t4, nextmsg # if(sum == num) { goto nextmsg }
- la $a0, msg2
- syscall
- nextmsg:
- la $a0, msg3
- syscall
- li $v0, 10
- syscall
- .end main
- ####FLOAT PROGRAMS COMPARE CONVERT
- .data
- data1: .double 3.14
- data2: .double 3.14
- msg1: .asciiz "data1 and data2 are equal"
- msg2: .asciiz "data1 and data2 are not equal"
- .text
- .globl main
- main: l.d $f0, data1
- l.d $f2, data2
- c.eq.d $f0, $f2
- bc1t L1
- la $a0, msg2
- j L2
- L1: la $a0, msg1
- L2: li $v0, 4
- syscall
- li $v0, 10
- syscall
- .data
- iNum: .word 42
- fNum: .float 0.0
- .text
- .globl main
- main: lw $t0, iNum
- mtc1 $t0, $f6
- cvt.s.w $f12, $f6
- s.s $f12, fNum
- li $v0, 2
- syscall
- li $v0, 10
- syscall
- .data
- pi: .double 3.14
- intPi: .word 0
- .text
- .globl main
- main: l.d $f10, pi
- cvt.w.d $f12, $f10
- mfc1 $a0, $f12
- sw $a0, intPi
- li $v0, 1
- syscall
- li $v0, 10
- syscall
- #####Sieves
- #Sieve Of Eratosthenes
- #int sieve[101];
- #int n = 100;
- #for (int pno = 2; pno*pno <= n; pno++) {
- # if (sieve[pno]) {
- # for (int i = pno*pno; i <= n; i += pno)
- # sieve[i]=false;
- # }
- # }
- .data
- num: .word 100
- sieve: .space 101 #
- msg0: .asciiz "Checking index:"
- msg1: .asciiz " Val:"
- msg2: .asciiz " Marking Index:"
- msg3: .asciiz "Primes are:"
- .text
- .globl main
- main:
- lw $t0, num #$t0=num
- li $t1, 0 #i=0
- li $t2, 1
- L0:
- bgt $t1, $t0, begin # if ($t1 > $t0) goto begin
- sb $t2, sieve($t1) # sieve[i] = 1
- addiu $t1, $t1, 1
- j L0
- begin:
- lw $t0, num #$t0=num
- li $t1, 2 #pno
- L1:
- multu $t1, $t1 #hi:lo=pno*pno
- mflo $t2 #$t2 = lo (=pno*pno)
- bgt $t2, $t0, end_loop # if ($t2 > $t0) then goto end_loop
- li $v0, 4
- la $a0, msg0
- syscall
- li $v0, 1
- move $a0, $t1
- syscall
- li $v0, 4
- la $a0, msg1
- syscall
- lbu $t4, sieve($t1) # $t4=sieve[pno]
- li $v0, 1
- move $a0, $t4
- syscall
- beq $t4, $zero, inc_pno # if sieve[pno]==0, skip sieving sieve[pno]
- li $v0, 4
- la $a0, msg2
- syscall
- move $t5, $t2 # $t5 = i (= pno*pno)
- L2:
- bgt $t5, $t0, inc_pno # $t5 > $t0 (i > n)
- li $v0, 1
- move $a0, $t5
- syscall
- li $v0, 11
- li $a0, ' '
- syscall
- sb $zero, sieve($t5) # sieve[pno] = 0
- addu $t5, $t5, $t1 # $t5 = $t5 + $t1 (i+=pno)
- j L2
- inc_pno:
- li $v0, 11
- li $a0, '\n'
- syscall
- addiu $t1, $t1, 1 # $t1++ (=pno++)
- j L1
- end_loop:
- li $v0, 11
- li $a0, '\n'
- syscall
- li $v0, 4
- la $a0, msg3
- syscall
- li $t2, 2 #i=2
- L3:
- bgt $t2, $t0, over # i>n
- lb $t3, sieve($t2) # $t3=sieve[i]
- beq $t3, $zero, inc_i # if sieve[i]==0 then next_i
- li $v0, 1
- move $a0, $t2 # $v0=1, $a0 = i (sieve[i]==1)
- syscall # print the num
- li $v0, 11
- li $a0, ' '
- syscall
- inc_i:
- addiu $t2, $t2, 1
- j L3
- over:
- li $v0, 11
- li $a0, '\n'
- syscall
- li $v0, 10
- syscall
- #Sieve Of Eratosthenes
- #unsigned char sieve[101];
- #int n = 100;
- #for (int pno = 2; pno*pno <= n; pno++) {
- # if (sieve[pno]) {
- # for (int i = pno*pno; i <= n; i += pno)
- # sieve[i]=false; //Marking Index
- # }
- # }
- ####FPTR
- .data
- x: .word 10
- y: .word 6
- z: .word 0
- op: .word 2 #ADD=0, SUB=1, etc.
- plus_str: .asciiz " PLUS "
- minus_str:.asciiz " MINUS "
- mul_str: .asciiz " MUL "
- div_str: .asciiz " DIV "
- mod_str: .asciiz " MOD "
- equ_str: .asciiz " = "
- # addresses of functions (array of func pointers)
- # int (*fptr[])(int, int) = { f_add, f_sub, f_mul, d_div, f_mod};
- fptrs:
- .word f_add, f_sub, f_mul, f_div, f_mod
- # addresses of strs (array of char *)
- # char *op_str[] = {"PLUS", "MINUS", "MUL", "DIV", "MOD"};
- op_str:
- .word plus_str, minus_str, mul_str, div_str, mod_str
- .text
- .globl main
- main:
- lw $a0, x # arg 1
- lw $a1, y # arg 2
- lw $a2, op # op = ADD (0), SUB(1) etc
- jal do_op # call do_op( z = fptr[0](x,y))
- sw $v0, z # z = $v0
- li $v0, 1 # print int
- lw $a0, x # $a0 = x
- syscall
- li $v0, 4 # print str
- lw $t0, op # op = ADD (0), SUB(1) etc
- sll $t0, $t0, 2 # $t0 = $t0 * 4 (size of addr)
- lw $a0, op_str($t0) # $a0 = addr(plus), addr(minus) etc
- syscall
- li $v0, 1 # print int
- lw $a0, y # $a0 = y
- syscall
- li $v0, 4 # print str
- la $a0, equ_str # equ_str: "="
- syscall
- li $v0, 1 # print int
- lw $a0, z # $a0 = z (result)
- syscall
- li $v0, 10 # exit
- syscall
- do_op:
- addi $sp, $sp, -4 # make place to save ra
- sw $ra, 0($sp) # save ra
- sll $t0, $a2, 2 # $t0 = $a0 << 4 (size of a ptr)
- lw $t1, fptrs($t0) # $t1 = fptrs[i] (addr of func)
- jalr $t1 # jmp to the function pointed by $t1
- lw $ra, 0($sp) # retrive the return add
- addi $sp, $sp, 4 # restore sp
- jr $ra # return
- f_add:
- add $v0, $a0, $a1 # add: result in $v0
- jr $ra # return
- f_sub:
- sub $v0, $a0, $a1
- jr $ra
- f_mul:
- mul $v0, $a0, $a1
- jr $ra
- f_div:
- div $v0, $a0, $a1
- jr $ra
- f_mod:
- rem $v0, $a0, $a1
- jr $ra
- ####Matrix Operation
- #X = X + Y × Z
- #4 × 4 matrices, 64-bit double-precision elements
- #void mm (double x[][],double y[][], double z[][])
- #{ int i, j, k;
- # for (i = 0; i! = 32; i = i + 1)
- # for (j = 0; j! = 32; j = j + 1)
- # for (k = 0; k! = 32; k = k + 1)
- # x[i][j] = x[i][j] + y[i][k] * z[k][j];
- #}
- #Addresses of x, y, z in $a0, $a1, $a2, and i, j, k in $s0, $s1, $s2
- .data
- X: .double 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0
- Y: .double 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0
- Z: .double 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0
- .text
- .globl main
- main: li $t1, 4 # $t1 = 4 (row size/loop end)
- li $s0, 0 # i = 0; initialize 1st for loop
- L1: li $s1, 0 # j = 0; restart 2nd for loop
- L2: li $s2, 0 # k = 0; restart 3rd for loop
- sll $t2, $s0, 2 # $t2 = i * 4 (size of row of x)
- addu $t2, $t2, $s1 # $t2 = i * size(row) + j
- sll $t2, $t2, 3 # $t2 = byte offset of [i][j] 8 bytes *8 =
- la $a0, X
- addu $t2, $a0, $t2 # $t2 = byte address of x[i][j]
- l.d $f4, 0($t2) # $f4 = 8 bytes of x[i][j]
- L3: sll $t0, $s2, 2 # $t0 = k * 32 (size of row of z)
- addu $t0, $t0, $s1 # $t0 = k * size(row) + j
- sll $t0, $t0, 3 # $t0 = byte offset of [k][j]
- la $a2, Z
- addu $t0, $a2, $t0 # $t0 = byte address of z[k][j]
- l.d $f16, 0($t0) # $f16 = 8 bytes of z[k][j]
- sll $t0, $s0, 2 # $t0 = i*32 (size of row of y)
- addu $t0, $t0, $s2 # $t0 = i*size(row) + k
- sll $t0, $t0, 3 # $t0 = byte offset of [i][k]
- la $a1, Y
- addu $t0, $a1, $t0 # $t0 = byte address of y[i][k]
- l.d $f18, 0($t0) # $f18 = 8 bytes of y[i][k]
- mul.d $f16, $f18, $f16 # $f16 = y[i][k] * z[k][j]
- add.d $f4, $f4, $f16 # f4=x[i][j] + y[i][k]*z[k][j]
- addiu $s2, $s2, 1 # $k k + 1
- bne $s2, $t1, L3 # if (k != 32) go to L3
- s.d $f4, 0($t2) # x[i][j] = $f4
- addiu $s1, $s1, 1 # $j = j + 1
- bne $s1, $t1, L2 # if (j != 32) go to L2
- addiu $s0, $s0, 1 # $i = i + 1
- bne $s0, $t1, L1 # if (i != 32) go to L1
- li $v0, 2
- mov.s $f12,$f4
- syscall
- li $v0, 10
- syscall
- ####Float polynomial
- .data
- a: .float 1.0
- bb: .float 2.0
- c: .float 3.0
- msg: .asciiz "Enter x: "
- blank: .asciiz " "
- newl: .asciiz "\n"
- .text
- .globl main
- # Register Use Chart
- # $f0 -- x
- # $f2 -- sum of terms
- main: # read input
- la $a0,msg # prompt user for x
- li $v0,4 # print string
- syscall
- li $v0,6 # read single
- syscall # $f0 <-- x
- # evaluate the quadratic
- l.s $f2,a # sum = a
- mul.s $f2,$f2,$f0 # sum = ax
- l.s $f4,bb # get b
- add.s $f2,$f2,$f4 # sum = ax + b
- mul.s $f2,$f2,$f0 # sum = (ax+b)x = ax^2 +bx
- l.s $f4,c # get c
- add.s $f2,$f2,$f4 # sum = ax^2 + bx + c
- # print the result
- mov.s $f12,$f2 # $f12 = argument
- li $v0,2 # print single
- syscall
- la $a0,newl # new line
- li $v0,4 # print string
- syscall
- li $v0,10 # code 10 == exit
- syscall # Return to OS.
- #####Ghanoi
- # void hanoi(int ndisks, from, to, using)
- # if (ndisks == 1) {
- # printf("Moving disk %d from %c to %c\n", ndisks, from to);
- # return
- # }
- # hanoi(ndisks-1, from, using, to);
- # printf("Moving disk %d from %c to %c\n", ndisks, from to);
- # hanoi(ndisks-1, using, to, from);
- #
- #
- #
- .data
- n: .word 4
- move_msg: .asciiz "Moving Disk: "
- from_msg: .asciiz " From Pole: "
- to_msg: .asciiz " To Pole: "
- eoln: .byte '\n'
- .text
- .globl main
- main:
- lw $a0, n # $a0 = n (ndisks)
- li $a1, 'A' # from Pole
- li $a2, 'B' # to Pole
- li $a3, 'C' # using pole
- jal hanoi #
- li $v0, 10 # decent good bye
- syscall #
- # void hanoi(int ndisks, from, to, using)
- # $a0, $a1, $a2, $a3
- hanoi:
- add $sp, $sp, -20
- sw $ra, 0($sp) # push ret add
- sw $a0, 4($sp) # ndisks
- sw $a1, 8($sp) # from pole
- sw $a2, 12($sp) # to pole
- sw $a3, 16($sp) # using pole
- addi $t0, $zero, 1 #
- bgt $a0, $t0, L1 # if ndisks($a0>1) then L1
- # printf("Moving disk %d from pole %c to pole %c\n", ndisks, from to);
- jal print
- lw $ra, 0($sp) # retrive return address
- addi $sp, $sp, 20 # restore sp
- jr $ra # and return
- L1: # if ndisks($a0)>1 ...
- addi $a0, $a0, -1 # ndisks = ndisks-1
- move $t0, $a2 # tmp = to ($a2)
- move $a2, $a3 # to($a2) = $a3 (using)
- move $a3, $t0 # to(a3) = tmp
- jal hanoi # hanoi(ndisks-1, from, using, to);
- lw $a0, 4($sp) # retrive ndisks
- lw $a1, 8($sp) # from
- lw $a2, 12($sp) # to
- jal print
- lw $a0, 4($sp) # retrive ndisks
- addi $a0, $a0, -1 # ndisks = ndisks-1
- lw $a1, 16($sp) # from
- lw $a2, 12($sp) # to
- lw $a3, 8($sp) # using
- jal hanoi # hanoi(ndisks-1, using, to, from);
- lw $ra, 0($sp) # retrive return address
- addi $sp, $sp, 20 # restore sp
- jr $ra # and return
- #printf("Moving disk %d from %c to %c\n", ndisks, from to);
- print:
- move $s0, $a0 # disk no
- move $s1, $a1 # from
- move $s2, $a2 # to
- li $v0, 4 # print_string
- la $a0, move_msg # "Moving disk "
- syscall
- li $v0, 1 # print_int
- move $a0, $s0 # disk no
- syscall
- li $v0, 4 # print_string
- la $a0, from_msg # "from pole"
- syscall
- li $v0, 11 # print_char
- move $a0, $s1 # from pole ($s1)
- syscall
- li $v0, 4 # print_string
- la $a0, to_msg # "to pole"
- syscall
- li $v0, 11 # print_char
- move $a0, $s2 # to
- syscall
- li $v0, 11 # print_char
- lb $a0, eoln # '\n'
- syscall
- jr $ra # return to caller
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement