197 lines
2.1 KiB
NASM
197 lines
2.1 KiB
NASM
@ARG // argument 1
|
|
D=M
|
|
@1 // write 1 to A
|
|
D=D+A // D = segment+index
|
|
@R13 // save it to R13
|
|
M=D // write @ARG+1 to R13
|
|
@R13
|
|
A=M
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP // pop
|
|
AM=M-1
|
|
D=M
|
|
@THAT
|
|
M=D //
|
|
@0 // push constant 0
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP // pop
|
|
AM=M-1
|
|
D=M
|
|
@THAT
|
|
A=M // Read @THAT to A (for that 0)
|
|
M=D // end pop that 0
|
|
@1 // push constant 1
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THAT // that 1
|
|
D=M
|
|
@1 // write 1 to A
|
|
D=D+A // D = segment+index
|
|
@R13 // save it to R13
|
|
M=D // write @THAT+1 to R13
|
|
@SP // pop
|
|
AM=M-1
|
|
D=M
|
|
@R13
|
|
A=M // Read @R13 to A (for that 1)
|
|
M=D // end pop that 1
|
|
@ARG
|
|
A=M
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@2 // push constant 2
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP // ==== sub ====
|
|
A=M-1
|
|
D=M
|
|
A=A-1
|
|
M=M-D
|
|
@SP
|
|
M=M-1 // end sub
|
|
@SP // pop
|
|
AM=M-1
|
|
D=M
|
|
@ARG
|
|
A=M // Read @ARG to A (for argument 0)
|
|
M=D // end pop argument 0
|
|
(__GLOBAL__.MAIN_LOOP_START) // end label MAIN_LOOP_START
|
|
@ARG
|
|
A=M
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP
|
|
AM=M-1
|
|
D=M
|
|
@__GLOBAL__.COMPUTE_ELEMENT
|
|
D;JNE // end if-goto COMPUTE_ELEMENT
|
|
@__GLOBAL__.END_PROGRAM
|
|
0;JMP // end goto END_PROGRAM
|
|
(__GLOBAL__.COMPUTE_ELEMENT) // end label COMPUTE_ELEMENT
|
|
@THAT
|
|
A=M
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@THAT // that 1
|
|
D=M
|
|
@1 // write 1 to A
|
|
D=D+A // D = segment+index
|
|
@R13 // save it to R13
|
|
M=D // write @THAT+1 to R13
|
|
@R13
|
|
A=M
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP // ==== add ====
|
|
A=M-1
|
|
D=M
|
|
A=A-1
|
|
M=D+M
|
|
@SP
|
|
M=M-1 // end add
|
|
@THAT // that 2
|
|
D=M
|
|
@2 // write 2 to A
|
|
D=D+A // D = segment+index
|
|
@R13 // save it to R13
|
|
M=D // write @THAT+2 to R13
|
|
@SP // pop
|
|
AM=M-1
|
|
D=M
|
|
@R13
|
|
A=M // Read @R13 to A (for that 2)
|
|
M=D // end pop that 2
|
|
@THAT // pointer 1
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@1 // push constant 1
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP // ==== add ====
|
|
A=M-1
|
|
D=M
|
|
A=A-1
|
|
M=D+M
|
|
@SP
|
|
M=M-1 // end add
|
|
@SP // pop
|
|
AM=M-1
|
|
D=M
|
|
@THAT
|
|
M=D //
|
|
@ARG
|
|
A=M
|
|
D=M
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@1 // push constant 1
|
|
D=A
|
|
@SP
|
|
A=M
|
|
M=D
|
|
@SP
|
|
M=M+1
|
|
@SP // ==== sub ====
|
|
A=M-1
|
|
D=M
|
|
A=A-1
|
|
M=M-D
|
|
@SP
|
|
M=M-1 // end sub
|
|
@SP // pop
|
|
AM=M-1
|
|
D=M
|
|
@ARG
|
|
A=M // Read @ARG to A (for argument 0)
|
|
M=D // end pop argument 0
|
|
@__GLOBAL__.MAIN_LOOP_START
|
|
0;JMP // end goto MAIN_LOOP_START
|
|
(__GLOBAL__.END_PROGRAM) // end label END_PROGRAM
|
|
@192
|
|
0;JMP
|