ECE291 Computer Engineering II Lockwood, Fall 1996

Machine Problem 2

Assigned Tuesday 10/1/96
Due Date Friday 10/11/96
Purpose Math, Stack, Subroutines.
Points50

Introduction

Calculators were one of the greatest gifts to the engineer this century. They eliminated the tedious work of calculating numeric results. Hewlett-Packard (HP) innovated a method of calculation called RPN (Reverse Polish Notation).

RPN employs a stack to hold numbers and intermediate results. When a number is entered, it is PUSHed to the stack. When an operation is entered, it POPs element(s) from the stack, performs the calculation, and PUSHes the result back to the stack. With RPN, there is no need for parenthese or equal buttons.

Using RPN, the equation X+(Y*Z) can be computed by entering the following keystrokes:

X [enter] Y [enter] Z [enter] * [enter] + [enter]

For this example, X, Y, and Z were pushed to the stack. When the multiplication command was entered (*); the values Y and Z were POPed from the stack, Y*Z was computed, and this product (YZ) was PUSHed back to the stack. When the addition command was entered (+), X and YZ were POPed from the stack, X+YZ was computed, and this sum was pushed back to the stack. The final result is stored at the top of the stack.

Problem Description

For this machine problem, you will implement the core functionality of a RPN calculator. Your calculator will compute results on 16-bit integer values. It will read and print results in binary, decimal, or hex. It will support all standard logical and mathematical operations, including the computation of factorials.

Implementation

For this program, you will write three modular procedures.

Program Assignment

You will begin this machine problem with a fully functional program. The main program is given below. I have provided the library routines for each of the three procedures above. You will score points by replacing the library procedures with your own code. Your score will be proportional to the percentage of the code that you write yourself. The breakdown in points is given below: Your routine MUST perform all functions of the subroutine to obtain credit.

Sample Input (MP2.IN)

150     ; First Number [base 10 by default] pushed to stack
50      ; Second Number pushed to stack
-       ; Calculate: 150-50=100 , Leave Result on stack
8
2
5
*       
+       ; Calculate: (2*5)+8=18 , Leave Result on stack
/       ; Calculate: 100/18=5 (Integer Arithmetic)
N       ; Calculate: Negate(5)=-5
12      ; Enter 12
+       ; Calculate: -5+12=7
!       ; Calculate: Factorial(7)=7*6*5*4*3*2*1=5040
MH      ; Switch to Hex Mode (Enter/Display format): 5040d = 13B0h
FFF     ; Enter FFF (hex)
+       ; Calculate: 13B0h+0FFFh=23AFh
2300    ; Enter 2300 (hex)
-       ; Calculate: 23AFh-2300h=00AFh (hex)
MB      ; Switch to Binary Mode: 00AFh=0000000010101111b
111111  ; Enter 111111 (binary)
&       ; Calculate: Logical AND = 0000000000101111
000111  ; Enter 000111 (binary) (note that preceding zeros ignored)
^       ; Calculate: Logical XOR = 0000000000101000
11      ; Enter 11 (binary)
|       : Calculate: Logical  OR = 0000000000101011
~       ; Calculate: Logical NOT = 1111111111010100
MH      ; Switch to Hex Mode: Final Result == FFD4h
Q       ; Escape to exit

Sample Output (MP2.OUT)

150     ; First Number [base 10 by default] pushed to stack
Result: 150
50      ; Second Number pushed to stack
Result: 50
-       ; Calculate: 150-50=100 , Leave Result on stack
Result: 100
8
Result: 8
2
Result: 2
5
Result: 5
*       
Result: 10
+       ; Calculate: (2*5)+8=18 , Leave Result on stack
Result: 18
/       ; Calculate: 100/18=5 (Integer Arithmetic)
Result: 5
N       ; Calculate: Negate(5)=-5
Result: -5
12      ; Enter 12
Result: 12
+       ; Calculate: -5+12=7
Result: 7
!       ; Calculate: Factorial(7)=7*6*5*4*3*2*1=5040
Result: 5040
MH      ; Switch to Hex Mode (Enter/Display format): 5040d = 13B0h
Result: 13B0
FFF     ; Enter FFF (hex)
Result: 0FFF
+       ; Calculate: 13B0h+0FFFh=23AFh
Result: 23AF
2300    ; Enter 2300 (hex)
Result: 2300
-       ; Calculate: 23AFh-2300h=00AFh (hex)
Result: 00AF
MB      ; Switch to Binary Mode: 00AFh=0000000010101111b
Result: 0000000010101111
111111  ; Enter 111111 (binary)
Result: 0000000000111111
&       ; Calculate: Logical AND = 0000000000101111
Result: 0000000000101111
000111  ; Enter 000111 (binary) (note that preceding zeros ignored)
Result: 0000000000000111
^       ; Calculate: Locical XOR = 0000000000101000
Result: 0000000000101000
11      ; Enter 11 (binary)
Result: 0000000000000011
|       : Calculate: Logical  OR = 0000000000101011
Result: 0000000000101011
~       ; Calculate: Logical NOT = 1111111111010100
Result: 1111111111010100
MH      ; Switch to Hex Mode: Final Result == FFD4h
Result: FFD4
Q       ; Escape to exit

DOSXIT: Exit to DOS

Preliminary Procedure

Final Steps

  1. Demonstrate MP2.EXE to a TA or to the instructor. You will be asked to recompile and demonstrate MP2 with a set of inputs that exercises all functions of the calculator.
  2. You will need to show which of the three functions you implemented, and which of the three functions you used from MP2LIB.
  3. You will be asked to run your calculator with the input file MP2.IN by executing the following command.
    MP2 < MP2.IN The output should match MP2.OUT.
  4. You will be asked to run your calculator with another input file to verify that no numbers or results are hardcoded into your program.
  5. Have the TA execute the handin program from your machine.
  6. Print MP2.ASM and give it to to the same TA which approved your demonstration. Be sure that your name is the printout.

MP2.ASM

        PAGE 75, 132
        TITLE   MP2     your name       current date

CR      EQU 13
LF      EQU 10
ESCKEY  EQU 27
SPACE   EQU 32
SEMI    EQU 59

extrn dosxit:near, kbdine:near, dspmsg:near, binasc:near
extrn ReadInput:near  ; Remove this line to add your own procedure
extrn Calculate:near  ; Remove this line to add your own procedure
extrn DispOutput:near ; Remove this line to add your own procedure

;====== SECTION 3: Define stack segment ===================================
stkseg  segment stack                   ; *** STACK SEGMENT ***
        db      64 dup ('STACK   ')     ; 64*8 = 512 Bytes of Stack
stkseg  ends

;====== SECTION 4: Define code segment ====================================
cseg    segment public                  ; *** CODE SEGMENT ***
        assume  cs:cseg, ds:cseg, ss:stkseg, es:nothing

;====== SECTION 5: Declare variables ======================================

DispMode DW     10      ; Operate in decimal mode by default
crlf DB CR,LF,'$'       ; New Line

;====== SECTION 6: Main procedure =========================================

main    proc    far
        mov     ax, cseg   ; Initialize DS register
        mov     ds, ax

        MOV     DI, offset DispMode

Calc:   Call    ReadInput      ; Read Input from Keyboard
        MOV     DX,offset crlf
        call    dspmsg         ; New Line
        CMP     BH, ESCKEY     ; Quit When ESC is entered
        JE      Done
        CMP     BH, 'Q'        ; Also quit if Q is entered
        JE      Done
        Call    Calculate      ; Perform Math/Logical Calculation
        Call    DispOutput     ; Display number at top of stack
        JMP     Calc

Done:   call    dosxit                  ; Exit to DOS
main    endp
 
cseg    ends
        end     main