Friday, 20 December 2013

Implement a simple 4-word stack as a subroutine with two entry points, PUSH and POP. Each data element is a single word. Make sure you test for underflow and overflow as appropriate (you may use the text book).

    .ORIG x3000
    LEA R2 Stack        ; R2 will be Top
    LD R3 Size
    ADD R2 R2 R3 

Start
    JSR PrintNL
    JSR PrintNL
    LEA R0 Choice1
    TRAP x22
    JSR PrintNL
    LEA R0 Choice2
    TRAP x22
    JSR PrintNL
    LEA R0 Choice0
    TRAP x22
    JSR PrintNL
    LEA R0 Choice
    TRAP x22
   
    TRAP x20        ; input user choice
    TRAP x21
    LD R1 Zero    NOT R1 R1    ADD R1 R1 #1
    ADD R1 R0 R1
    BRz Done

    LD R1 One    NOT R1 R1    ADD R1 R1 #1
    ADD R1 R0 R1
    BRz ChoiceOne

    LD R1 Two    NOT R1 R1    ADD R1 R1 #1
    ADD R1 R0 R1
    BRz ChoiceTwo
   
    JSR PrintNL
    LEA R0 InvldInpt
    TRAP x22
    BR Start
Done
    JSR PrintNL
    LEA R0 Greeting
    TRAP x22
    HALT

ChoiceOne
    JSR Push
    BR Start
ChoiceTwo
    JSR Pop
    BR Start
   
Push
    add r6 r7 #0
    LEA R0 Stack
    NOT R0 R0    ADD R0 R0 #1
    ADD R0 R2 R0
    BRn Overflow
    JSR PrintNL

    LEA R0 InputStr
    TRAP x22

    TRAP x20
    TRAP x21
    STR R0 R2 #0
    JSR PrintNL
    LEA R0 PushMsg
    TRAP X22
    LDR R0 R2 #0
    TRAP x21
    ADD R2 R2 #-1    ; decrement top pointer
    add r7 r6 #0
    RET
Overflow
    add r6 r7 #0
    JSR PrintNL
    LEA R0 OverflowMsg
    TRAP x22
    add r7 r6 #0
    RET
Pop
    add r6 r7 #0
    LEA R0 Stack
    ADD R0 R0 R3
    NOT R0 R0    ADD R0 R0 #1
    ADD R0 R2 R0
    BRz Underflow
   
    JSR PrintNL
    LEA R0 OutputStr
    TRAP x22
    add R2 R2 #1
    LDR R0 R2 #0
    TRAP x21
    add r7 r6 #0
    RET

Underflow
    add r6 r7 #0
    JSR PrintNL
    LEA R0 UnderflowMsg
    TRAP x22
    add r7 r6 #0
    RET
PrintNL
    add r5 r7 #0
    AND R0 R0 #0   
    ADD R0 R0 #10
    TRAP x21
    add r7 r5 #0
    RET

Zero    .FILL x30
One    .FILL x31
Two    .FILL x32

Size    .FILL #3
Stack    .BLKW #4
Choice1    .STRINGZ "1 for Push"
Choice2 .STRINGZ "2 for Pop"
Choice0 .STRINGZ "0 for Exit"
Choice  .STRINGZ "Enter Your choice: "
Greeting .STRINGZ "Thanks for Using Stack"
InputStr .STRINGZ "Input Character to Push: "
PushMsg    .STRINGZ "Pushed Character is: "
OutputStr .STRINGZ "Popped Character is: "
OverflowMsg  .STRINGZ "Overflow Occurs"
UnderflowMsg .STRINGZ "Underflow Occurs"
InvldInpt .STRINGZ "Wrong Choice, Please try again"
    .END

No comments:

Post a Comment