This is a rather contrived programming assignment. But then, that is often the case with assembly programming.
The setup
Assume that your code is “called” under the following conditions, which is very similar to the startup code distributed for the Introducing MPLAB X & PIC assembly lab.
- Space has been set aside for an array, named
V
, of 100 16-bit integers. - Space has been set asside for three 16-bit integers,
named
i
,j
, andx
. - You have been given code that initializes the
100 elements of
V
. - There is an infinite spin loop at the end of your code.
Or, more precisely, start with this:
.include "p24Hxxxx.inc" .global __reset .equiv vSize,100 .bss i: .space 2 j: .space 2 V: .space 2*#vSize x: .space 2 ugh: .space 2 .equ initX,255 .text __reset: ;;; initialize V to the first 100 square numbers mov #vSize,W5 ;; countdown mov #V,W6 ;; pointer into the array clr W7 ;; evolving square mov #1,W8 ;; odd numbers initloop: mov W7,[W6++] ;; moving W7 to elements of V add W7,W8,W7 ;; W7 will be 0, 1, 4, 9, ... inc2 WREG8 ;; w8 will be 1, 3, 5, .... dec WREG5 ;; W5 will count down from 100 btss SR,#Z ;; skip next instruction when Z set bra initloop brkpnt: mov x ;; just a place to put a break point ;;; Replace this line with your name ;;; Start writing your PIC Assembly here ;;; Stop writing your PIC Assembly here bigloop: bra bigloop .end
Your job
Your job is to replace the middle section of the program with PIC assembly code that does the equivalent of the following C/Java code:
x = 0 ; for (i=0; i<100; ++i) { j = V[i] ; while (j != 0) { x = x + (j & 0x3) ; j = j >> 2 ; } }
In other words, add up all the pairs of bits in V
and store
the sum in x
.
You are allowed to rearrange the Java statements or use registers to
store temporary values. You can also “unroll” the inner
loop.
However when the outer loop is finished,
x
must contain the correct
answer and V
must contain its original values.