Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

WRITE A MIPS PROGRAM THAT WILL: 1) read in an image name (gray level image in bi

ID: 3803917 • Letter: W

Question

WRITE A MIPS PROGRAM THAT WILL:

1) read in an image name (gray level image in binary format), the number of rows and the number of columns

2) using a function read in the image (.bin file, see code below)

3) using a function compute its histogram (see code below)

4) using a function then output the histogram (see expected output below)

Here is the MIPS code you can test with. PUT YOUR FUNCTION IN HERE TO MAKE IT WORK IN THIS CONTEXT.

PUT YOUR CODE WHERE IT SAYS "# You need to implement your function here"

Expected output:

Explanation / Answer

.text .globl main main: addu $s7, $ra, $zero, # Save the ra la $a0, file_prompt #print out the prompt for file name li $v0, 4 #system call print_str syscall la $a0, file_name #read in the file name addi $a1, $zero, 256 #using systecall read_str li $v0, 8 #We read the file name syscall #Note that the string includes 10 (' ') at the end #We need to get rid of that first la $t1, file_name #Address of the file name string addi $t2, $zero, 10 length_loop: # of the string: lb $t0, 0($t1) # load the byte at addr B into $t0. beq $t0, $t2, end_length_loop # if $t3 == 10, branch out of loop. addu $t1, $t1, 1 b length_loop # and repeat the loop. end_length_loop: sb $zero, 0($t1) #We change ' ' to 0 la $a0, file_name #Show the file name li $v0, 4 syscall la $a0, newline #Display a new line li $v0, 4 syscall la $a0, row_prompt li $v0, 4 syscall addi $v0, $zero, 5 # We need to read an integer syscall add $s1, $v0, $zero # We save the number of rows to s1 la $a0, column_prompt li $v0, 4 syscall addi $v0, $zero, 5 # We need to read an integer syscall add $s2, $v0, $zero # We save the number of columns to s2 # We allocate enough space and save the addres to image #addi $v0, 9 #li $a0, 1000000 #syscall #la $a0, image #sw $v0, 0($a0) # image *read_image(char *filename, int nrow, int ncol) #prepare parameters for the arguments la $a0, file_name #The first argument add $a1, $s1, $zero #The second argument add $a2, $s2, $zero #The third argument jal read_image #We save the returned values add $s3, $v0, $zero # We save the address of the array beq $v0, $zero, End_main # If the address is zero, something is wrong #Call your function to compute histogram # int histogram(unsigned char *image, int nrow, int ncol, int *h) add $a0, $s3, $zero #The first argument add $a1, $s1, $zero #The second argument add $a2, $s2, $zero #The third argument la $a3, hist_array jal histogram #Call your function to print the histogram # void print_hist(int *h) la $a0, hist_array jal print_hist End_main: addu $ra, $zero, $s7 #restore $ra since the function calles #another function jr $ra add $zero, $zero, $zero add $zero, $zero, $zero ########## End of main function ######### .data #Data segment starts here file_prompt: .asciiz "Please enter a valid file name: " newline: .asciiz ". " file_name: .space 256 row_prompt: .asciiz "Number of rows: " column_prompt: .asciiz "Number of columns: " add_msg: .asciiz "Image address: " .align 2 hist_array: .word 0:256 # We define 256 words for the histogram ###### unsignched char *read_image(char *fname, int nrow, int ncol) ##### $a0 (fname): The name of the pgm file name ##### $a1 (nrow): The number of rows ##### $a2 (ncol): The number of columns in the image ##### $v0: memory address of the image .text .globl read_image read_image: addu $sp, $sp, -28 #We allocate three words sw $a0, 4($sp) sw $a1, 8($sp) sw $a2, 12($sp) sw $ra, 16($sp) add $a1, $zero, $zero #O_RDONLY is 0 add $a2, $zero, $zero #This parameter does not really matter li $v0, 13 #System call open syscall add $t1, $v0, $zero slt $t9, $zero, $t1 #if $t1 < 0, the file is invalid beq $t9, $zero, file_invalid sw $v0, 0($sp) #This is the file descriptor #Here the file is opened # Read the values to lw $a0, 0($sp) #File descriptor la $a1, image sw $a1, 20($sp) # We save the address to the stack lw $a2, 12($sp) lw $t1, 8($sp) mul $a2, $a2, $t1 # nrow x ncol = total number of pixels sw $a2, 24($sp) li $v0, 14 syscall #The first pixel value la $a0, first_value_msg li $v0, 4 syscall lw $a1, 20($sp) lbu $a0, 0($a1) li $v0, 1 syscall la $a0, newline li $v0, 4 syscall #The last pixel value la $a0, last_value_msg li $v0, 4 syscall lw $a1, 20($sp) lw $a2, 24($sp) addu $a1, $a1, $a2 lbu $a0, -1($a1) li $v0, 1 syscall la $a0, newline li $v0, 4 syscall lw $a0, 0($sp) #File descriptor li $v0, 16 #System call close syscall lw $v0, 20($sp) #Restore the return address j return_main file_invalid: addi $v0, $zero, 4 la $a0, invalid_file_msg syscall add $v0, $zero, $zero return_main: lw $ra, 16($sp) addu $sp, $sp, 28 #We restore the stack pointer jr $ra add $zero, $zero, $zero add $zero, $zero, $zero .data invalid_file_msg: .asciiz "Can not open the file for reading. " first_value_msg: .asciiz "First pixel value: " last_value_msg: .asciiz "Last pixel value: " .text # void print_hist(int *h) # Print out the 256 counts in the array (the histogram) .globl print_hist print_hist: jr $ra .data colon: .asciiz ": " .text .globl histogram # int histogram(unsigned char *image, int nrow, int ncol, int *h) # Compute the histogram of the image and save the results in h histogram: # You need to implement your function here jr $ra .data .align 2 image: .space 250000