assemblylow-levellc3lc3-trap

LC3 Assembly Square of N


Hi I'm trying to write a lc3 assembly program which computes the square of a number and stores it in r0, the integer is given as a parameter and is located in r1, the problem i noticed while debugging is during the first pass it initially adds 2, but the second pass it fails to add another 2 to r0 - My code is below any help is appreciated

           .orig x3FF8
      ld r1,n
    ld r5,n

  square
 add r2,r1,#0

  add r5,r5,#-1
add r0,r2,#0
brzp square
brn theend

  theend


halt
 n .fill #2

 .end

my final code thanks to the user who helped:

    .orig x3FF8
     ld r1,n
    ld r5,n

   square


  add r2, r2,r1

  add r5,r5,#-1

  brp square


  theend


 halt
  n .fill #4

 .end

Solution

  • If I remember LC-3 syntax correctly, add r2,r1,#0 does r2 = r1 + 0, so it was never actually adding to r2, just overwriting it with r1.

    You want something like that outside the loop to initialize r2.

    But inside the loop, you want add r2, r2, r1 which does r2 = r2 + r1, i.e. r2 += r1.


    I don't understand why you have add r0,r2,#0 inside the loop as well. If you want the final result in r0, accumulate it in r0 in the first place. Of if that was supposed to be a sum of sums, then you have the same bug.

    Also note that add r5,r5,#-1 needs to be last so condition code flags are set from it for the loop branch, not from add r0, r0, r2 or whatever else you need inside the loop.


    Also: brn theend is totally useless: theend is on the next line, and execution continues to the next line on its own. You don't have to jump over whitespace in the source!