## LSU EE 3755 Fall 2001 Homework 4 Problem 0 # # The population count procedure (pop) below is supposed to set # register v0 to the number of 1's in the binary representation of the # contents of register a0. # # For example, if a0 -> 3 then after calling pop v0 -> 2. # # The population count is supposed to do this, but it doesn't. Find # and fix the problems. ## To run the code using the class account Emacs: # # 1: Load this text into an Emacs buffer from a class account. # # 2: Press [f9] # The SPIM simulator window should pop up. # If the buffer is modified but not saved you will be prompted to # save the buffer, after answering the window will pop up. # # 3: Click the Run button. # A Run Program dialog should pop up. # # 4: From the Run dialog click OK. # The dialog should disappear and the program should have ran. # If it ran "properly" (meaning with the pop bug) the window should # show the following values for s0, s1, and s2: # # R16 (s0) = 00000005 # R17 (s1) = 00000007 # R18 (s2) = 00000009 ## To single-step through the program: # # 1: Start SPIM (Steps 1 and 2 above) # # 2: Click the step button. # A Step Program dialog should pop up. # # 3: Click step. # The highlighted instruction in the Text Segments window should move # and register values should be up dated. # # 4: Continue clicking as needed. ################################################################################ ## Problem 0 # The code below calls the buggy pop procedure with several # different values. .globl __start __start: # Find population of 0x655. # jal pop # Call population routine. # Return address put in $ra by jal instruction. # Argument passed to routine placed in $a0 (below). # Return value put in $v0 (by pop routine). # Instruction below is in branch delay slot and so it will # be executed BEFORE the first instruction of the pop routine, # NOT after it returns. # li $a0, 0x655 # Put call argument in a0 add $s0, $v0, $0 # Move result in to s0. Should be 6. # Find population of 0x111 # jal pop li $a0, 0x111 add $s1, $v0, $0 # Should be 3. # Find population of 0xfab4fab4 # jal pop li $a0, 0xfab4fab4 addi $s2, $v0, 0 # Should be 20 (0x14) # End by using "exit" system call, #10. addi $v0, $0, 10 syscall ################################################################################ ## Buggy Population Count Procedure # # The routine below does not work (or else its been fixed without changing # this comment). .globl pop pop: ## Register Usage # # $a0: Input value, the integer to find the population of. # $v0: Return value, the population of the integer. # # $t1: A working copy of the integer. add $t1, $a0, $0 LOOP: srl $t1, $t1, 1 andi $t0, $t1, 1 bne $t1, $0, LOOP add $v0, $v0, $t0 jal $ra nop