# CSCI 424, Homework 2 # switch to the Data segment .data # global data is defined here # Don't forget the backslash-n (newline character) Homework: .asciiz "CSCI 424 Homework 2\n" Name_1: .asciiz "Adam\n" Name_2: .asciiz "Carpenter\n" # switch to the Text segment .text # the program is defined here .globl main main: # Whose program is this? la $a0, Homework jal Print_string la $a0, Name_1 jal Print_string la $a0, Name_2 jal Print_string # int i, n = 2; # for (i = 0; i <= 16; i++) # { # ... calculate n from i # ... print i and n # } # register assignments # $s0 i # $s1 n # $a0 argument to Print_integer, Print_string # add to this list if you use any other registers # ---My New Registers--- # $s2 bit # $t0 temp (temporary) # ---------------------- # initialization li $s1, 2 # n = 2 # for (i = 0; i <= 16; i++) li $s0, 0 # i = 0 bgt $s0, 16, bottom top: # calculate n from i # Your part starts here # ------Solution in C code-------- # n = 0; # int bit; # for (bit = 0; bit < 32; bit++) { # temp = i >> bit; # temp = temp & 1; # n = n + temp; # } # -------------------------------- li $s1, 0 # n = 0 li $s2, 0 # bit = 0 bitloop: srav $t0, $s0, $s2 # temp = i >> bit andi $t0, $t0, 1 # temp = temp & 1 add $s1, $s1, $t0 # n = n + temp add $s2, $s2, 1 # bit++ blt $s2, 32, bitloop # if bit < 32 goto bitloop # Your part ends here # print i and n move $a0, $s0 # i jal Print_integer la $a0, sp # space jal Print_string move $a0, $s1 # n jal Print_integer la $a0, cr # newline jal Print_string # for (i = 0; i <= 16; i++) add $s0, $s0, 1 # i++ ble $s0, 16, top # i <= 16 bottom: la $a0, done # mark the end of the program jal Print_string jal Exit # end the program, no explicit return status # switch to the Data segment .data # global data is defined here sp: .asciiz " " cr: .asciiz "\n" done: .asciiz "All done!\n" # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - # Wrapper functions around some of the system calls # See P&H COD, Fig. A.9.1, for the complete list. # switch to the Text segment .text .globl Print_integer Print_integer: # print the integer in register a0 addi $v0, $zero, 1 syscall jr $ra .globl Print_string Print_string: # print the string whose starting address is in register a0 addi $v0, $zero, 4 syscall jr $ra .globl Exit Exit: # end the program, no explicit return status addi $v0, $zero, 10 syscall jr $ra .globl Exit2 Exit2: # end the program, with return status from register a0 addi $v0, $zero, 17 syscall jr $ra