SPIM MIPS assembly language Your first assembly program
SPIM MIPS assembly language
Your first assembly program • Write a program to calculate the following: R=10 + 3 – 5 . data. text. globl main: addi $s 0, $0, 10 addi $s 1, $s 0, 3 addi $s 2, $s 1, -5 jr $ra # retrun to caller
Write a program to compute the result of D = ABC’ + B’A + C. data. text. globl main: and $t 0, $s 1 nor $t 1, $s 2 and $t 2, $t 0, $t 1 # # # AB C' ABC' nor and or or # # B' ABC' + AB' + $t 0, $t 1, $t 3, $t 4, jr $ra $s 1, $s 0, $t 1, $t 3, $s 1 $t 2 $s 2 C
Print an integer on screen using interrupt (system call) li $v 0, 1 la $a 0, 5 syscall # system call code for print_int # integer to print # print the integer
Print a string on screen using interrupt li $v 0, 4 la $a 0, str syscall # system call code for print_str # address of string to print # print the string
example: to print "the answer = 8". data msg: . asciiz “the answer is = " . text. globl main: li $v 0, 4 la $a 0, msg syscall li $v 0, 1 la $a 0, 8 syscall jr $ra # syscall 4 (print_str) # address of string # print the string # syscall 4 (print_str) # argument: ineger # print the ineger
Read an integer using interrupt li $v 0, 5 syscall # system call code for read_int # read the integer • The character that have been read from keyboard will be stored in register $v 0
example: read an integer. data. text. globl main: li $v 0, 5 # system call code for read_int syscall # read the integer and store it in $v 0 or $t 1, $v 0, $0 # move it to $t 1 jr $ra
read a string using interrupt li $v 0, 8 la $a 0, str syscall # system call code for read_str # address of string to read # read the string
example : read a string; . data str: . asciiz "" . text. globl main: li $v 0, 8 la $a 0, str syscall jr $ra # syscall 8 (read_str) # address of string # read the string
if statement IF (a!=b) c = d ; beq $s 0, $s 1, End. Of. If add $s 3, $s 2, $0 End. Of. If:
if statement (cont. ) IF (a<b) c = d ; slt $t 0, $s 1 beq $t 0, $0, End. Of. If add $s 3, $s 2, $0 End. Of. If:
if else statement IF (a==b) c = d ; else b = b + 1; bne $s 0, $s 1, Else add $s 3, $s 2, $0 j End. Of. If Else: addi $s 1, 1 End. Of. If:
example ( Check if a given number is odd or even ). data msg: . asciiz "enter a number " evenmsg: . asciiz "it is an evenn " oddmsg: . asciiz "it is an oddn" num: . word 0. text. globl main: li $v 0, 4 la $a 0, msg syscall li $v 0, 5 Syscall ori $t 0, $v 0, 0 and bne $t 0, 1 $t 0, $0, else li $v 0, 4 la $a 0, evenmsg syscall j endofif else: li $v 0, 4 la $a 0, oddmsg syscall endofif: jr $ra
loop statement while (i!=k) i=i+j; Loop: beq add j Exit: . . $s 0, $s 2, Exit $s 0, $s 1 Loop.
loop statement (cont. ) int i=1; while(i<100) { i=i+j; i++; } ori $s 0, $0, 1 loop: slti $t 0, $s 0, 100 beq $t 0, $0, End. Loop add $s 1, $s 2 addi $s 0, 1 j loop End. Loop: for(int i=1; i<100; i++) var 1++;
example: loop statement for(int i=start; i>stop; i--) var 1++; . data start: . word 10 stop: . word 2. text. globl main: la $a 0, start lw $s 0, 0($a 0) la $a 1, stop lw $s 1, 0($a 1) loop: slt $t 0, $s 1, $s 0 beq $t 0, $0, End. Loop addi $s 1, 1 addi $s 0, -1 j loop End. Loop: jr $ra
example (print numbers 1 -100) . data new. Line: . asciiz "n“. text. globl main: ori $s 0, $0, 1 loop: slti $t 0, $s 0, 101 beq $t 0, $0, End. Loop li $v 0, 1 ori $a 0, $s 0 , 0 syscall li $v 0, 4 la $a 0, new. Line syscall addi $s 0, 1 j loop End. Loop: jr $ra
example (print letters a-z). data new. Line: . asciiz "n“. text. globl main: ori $s 0, $0, 'a' loop: slti $t 0, $s 0, '{' beq $t 0, $0, End. Loop li $v 0, 11 ori $a 0, $s 0 , 0 syscall li $v 0, 4 la $a 0, new. Line syscall addi $s 0, 1 j loop End. Loop: jr $ra
Example: Print an Array using a loop. data array: . word 5, 7, 8, 9, 10. text. globl main: ori $s 0, $0, 0 #$s 0 is counter la $a 1, array #$a 1 is pointer of array loop: slti $t 0, $s 0, 5 beq $t 0, $0, End. Loop li $v 0, 1 lw $a 0, 0($a 1) syscall li $v 0, 11 la $a 0, ' ' syscall addi $s 0, 1 addi $a 1, 4 j loop End. Loop: jr $ra #update counter #update pointer
Example: print out 16 -bit binary representation of an integer. data one: li $v 0, 1 la $a 0, 0 syscall . text. globl main: li $s 0, 60 li $s 1, 0 x 8000 ori $s 2, $0, 0 #$s 1 is mask #$s 2 is counter loop: slti $t 0, $s 2, 16 beq $t 0, $0, End. Loop li $v 0, 1 la $a 0, 1 syscall j update: srl $s 1, 1 addi $s 2, 1 counter j loop End. Loop: and $t 2, $s 0, $s 1 beq $t 2, $0, one #print 0 #print 1 jr $ra #update
e. g. Convert a String from uppercase to lowercase. data name: . asciiz "MOHAMMAD". text. globl main: la $a 0, name # pointer of name li $s 0, 0 # counter li $s 1, 0 x 2020 # mask loop: slti $t 0, $s 0, 2 beq $t 0, $0, End. Loop lw $t 1, 0($a 0) or $t 1, $s 1 sw $t 1, 0($a 0) addi $s 0, 1 #update counter addi $a 0, 4 #update pointer j loop End. Loop: li $v 0, 4 la $a 0, name Syscall jr $ra
- Slides: 22