RPN Calculator
To practice writing assembly and passing parameters, you will implement the math functions of an RPN calculator. This stands for Reverse Polish Notation and uses a stack to keep track of values.
The add.S
and sub.S
files will be trivial to complete, but mul.S
and divd.S
will take some careful planning. You must either repeatedly add or repeatedly subtract (and count) the first input number by the second. mod.S
might be trivial, but pow.S
will be challenging.
When finished the calculator should be able to add +
, subtract 
, multiply *
, divide /
, modulo %
and power ^
.
Here is an example session:
> 4 5 +
9



> 1 
8



> 2 /
4



> 2 3 4 *
4
2
12

Yes, the stack is upside down! This is how stack frames are arranged in a computer's RAM!
 You should strive to complete this functionality in as few instructions as possible.
 Only write your solution in the provided assembly files (inside the
func/
directory).  Use repeated addition to calculate the result of multiplication. You will need to construct a loop yourself!
 Use repeated subtraction to calculate the quotient. Again, you will need to construct a loop yourself!
 Do not simply generate assembly using the compiler and submit it. I will know.
Parameter Passing
As we talked about in class, parameters are passed to functions in the registers r15
, r14
, r13
and r12
in that order. The top of the stack is the second argument to the operation, so it is in r14
and the value underneath that is the first argument in r15
. I know that seems backwards, but this is how an RPN calculator works and it will make add.S
and sub.S
much easier. Remember, when the microcontroller executes the ret
instruction at the end of a function, the return value should be in r15
!
Assembly Instructions
Here are some useful instructions you might need:
mov src, dst ; move the contents of src to dst
sub src, dst ; subtract the value in src from dst and store the result in dst
add src, dst ; add the value in src to the value in dst and store the result in dst
clr dst ; zero out destination (same as mov #0, dst)
jn label ; jump to label if N is set (result of previous instruction set N)
jmp label ; jump to label unconditionally (always)
A more complete listing can be found on page 56 of the Family User's Guide.
Registers
You can use any of the registers r4  r15
, however do not use registers r0  r3
for anything in your function. These registers serve special purposes on the MSP430.
Other Functions
If you need to swap the top two items, you can enter s
.