User guide

188 CHAPTER 11. THE MC PACKAGE
MANIFEST {
A=mc_a; B=mc_b; C=mc_c; D=mc_d; E=mc_e; F=mc_f
a1=1; a2; a3
}
LET start() = VALOF
{ // Load the dynamic code generation package for i386 machines.
LET mcseg, mcb, n = globin(loadseg("mci386")), 0, 0
UNLESS mcseg DO
{ writef("Trouble with MC package: mci386*n")
GOTO fin
}
// Create an MC instance for 10 functions with a data space
// of 100 words and code space of 4000 words.
mcb := mcInit(10, 100, 4000)
UNLESS mcb DO
{ writef("Unable to create an mci386 instance*n")
GOTO fin
}
mc := 0 // Currently no selected MC instance.
mcSelect(mcb) // Select the new MC instance.
mcK(mc_debug, #b0011) // Trace comments and MC instructions.
mcKKK(mc_entry, 1, 3, 5) // Entry point for function 1
// having 3 arguments and 5 local variables
mcK(mc_debug, #b1111) // Trace comments, MC instructions, target
// instructions and the compiled code.
mcRA(mc_mv, A, a1) // A := <arg 1>
mcRA(mc_add, A, a2) // A := A + <arg 2>
n := mcNextlab()
mcL(mc_lab, n) // Ln:
mcRA(mc_add, A, a3) // A := A + <arg 3>
mcR(mc_dec, A) // A := A - 1
mcRK(mc_cmp, A, 100)
mcJS(mc_jlt, n) // IF A<100 JMP Ln
mcK(mc_debug, #b0011) // Trace only comments and MC instructions.
mcF(mc_rtn) // Return from function 1 with result in A.
mcF(mc_endfn) // End of function 1 code.
mcF(mc_end) // End of dynamic code generation.
writef("*nF1(10, 20, 30) => %n*n", mcCall(1, 10, 20, 30))
fin:
IF mcseg DO unloadseg(mcseg)
RESULTIS 0
}
When this program runs it outputs the following.
// ENTRY 1 3 5
// DEBUG 15