Actually the confusion in the stack is that it is growing.
Compared to most people, the mental image of the stack, the stack with which you work in the assembly, is โturned upside downโ. The bottom stack has the highest memory address, and the top stack has the lowest. When you push 2 bytes onto the stack, 2 bytes are subtracted from the stack pointer, not added to it. (If you think about it in terms of memory sharing, it's actually safer)
So the result of your SUB was -2, which is equal. in ascii. You cannot just switch operands because the result must go to the first operand, therefore it must be a general register. Instead, change the MOV operations before SUB.
1.618 source share