mirror of
https://github.com/soconnor0919/eceg431.git
synced 2025-12-12 07:04:43 -05:00
project08 template files
This commit is contained in:
57
08/FunctionCalls/NestedCall/Sys.vm
Normal file
57
08/FunctionCalls/NestedCall/Sys.vm
Normal file
@@ -0,0 +1,57 @@
|
||||
// Sys.vm. Tested by the NestedCall test script.
|
||||
// Consists of three functions: Sys.init, Sys.main, and Sys.add12.
|
||||
|
||||
// Calls Sys.main() and stores a return value in temp 1.
|
||||
// Does not return (enters infinite loop).
|
||||
// The VM implementation starts running the Sys.init function, by default.
|
||||
function Sys.init 0
|
||||
push constant 4000 // tests that THIS and THAT are handled correctly
|
||||
pop pointer 0
|
||||
push constant 5000
|
||||
pop pointer 1
|
||||
call Sys.main 0
|
||||
pop temp 1
|
||||
label LOOP
|
||||
goto LOOP
|
||||
|
||||
// Sets locals 1, 2 and 3 to some values. Leaves locals 0 and 4 unchanged,
|
||||
// to test that the 'function' VM command initliazes them to 0 (the test
|
||||
// script sets them to -1 before this code starts running).
|
||||
// Calls Sys.add12(123) and stores the return value (should be 135) in temp 0.
|
||||
// Returns local 0 + local 1 + local 2 + local 3 + local 4 (should be 456), to
|
||||
// confirm that locals were not mangled by the function call.
|
||||
function Sys.main 5
|
||||
push constant 4001
|
||||
pop pointer 0
|
||||
push constant 5001
|
||||
pop pointer 1
|
||||
push constant 200
|
||||
pop local 1
|
||||
push constant 40
|
||||
pop local 2
|
||||
push constant 6
|
||||
pop local 3
|
||||
push constant 123
|
||||
call Sys.add12 1
|
||||
pop temp 0
|
||||
push local 0
|
||||
push local 1
|
||||
push local 2
|
||||
push local 3
|
||||
push local 4
|
||||
add
|
||||
add
|
||||
add
|
||||
add
|
||||
return
|
||||
|
||||
// Returns (argument 0) + 12.
|
||||
function Sys.add12 0
|
||||
push constant 4002
|
||||
pop pointer 0
|
||||
push constant 5002
|
||||
pop pointer 1
|
||||
push argument 0
|
||||
push constant 12
|
||||
add
|
||||
return
|
||||
Reference in New Issue
Block a user