; The M13_SM_RUN.ASM file .586P .MODEL FLAT, stdcall ; Flat memory model EXTERN NEWARRAY@4:NEAR ; This procedure is defined in M13_externs.cpp EXTERN OUTPUTSZ@4:NEAR ; This procedure is defined in M13_externs.cpp EXTERN strlen:NEAR ; This procedure is part of the C standard library EXTERN global_variable:DWORD ; Sample global variable defined in M13_externs.cpp PUBLIC SM_RUN ; SM_RUN is externally visible to the linker .const ; Constants corresponding to the command opcodes OPCODE_PUSH EQU 0 OPCODE_ADD EQU OPCODE_PUSH + 1 ; ... EQU OPCODE_PUSH + 2... .data ; The data segment ; Table of procedure addresses invoked by the stack machine call_table DWORD OFFSET push_cmd DWORD OFFSET add_cmd .code ; Code segment begins ; Procedure for running the stack machine program ; Output: EAX is the status SM_RUN PROC ; Invoke procedures corresponding to particular opcodes mov eax, OPCODE_PUSH call call_table[ eax * 4 ] mov eax, OPCODE_ADD call call_table[ eax * 4 ] mov DWORD PTR [global_variable], 456; ret SM_RUN ENDP ; Sample procedure handling the PUSH command .const SZ_PUSH_CMD BYTE "...push_cmd...", 13, 10, 0 .code push_cmd PROC pushd OFFSET SZ_PUSH_CMD call OUTPUTSZ@4 ; display text ret push_cmd ENDP ; Sample procedure handling the ADD command .const SZ_ADD_CMD BYTE "...add_cmd...", 13, 10, 0 .code add_cmd PROC pushd OFFSET SZ_ADD_CMD call OUTPUTSZ@4 ; display text ret add_cmd ENDP END