-------------------------------------------------------------------------- Apoo Assembly Language --------------------------------------------------------------------------- All memory cells and registers have 32 bits. Registers: R0,R1,R2,R3,R4,R5,R6,R7 --------- Memory Data: ----------- The size of the RAM is predefined (e.g. 1K) and divided into two areas: static memory and system stack. The static memory, begins at address 0 and it is allocated when a Apoo program is loaded. Static memory cells can be reserved in in two ways, using the following pseudo-instructions: Pseudo-instructions: ------------------- Meaning ------------------------------------------------- mem n reserves n memory addresses ------------------------------------------------- Label: const n2 contents of memory address const n1 Label is n1, of Label+1 is n2 . . . ni can be a character 'c' ------------------------------------------------------------------ Label: equ n Allows a symbolic name for a number ------------------------------------------------------------------- Label: string "seqNWSCharacteres" Allocates memory addresses and set them to the correspondent characters ASCII codes. The characters cannot be whitespaces: use \s for space \t for tab and \n for newline ---------------------------------------------------------------------- Label is any string begining with a letter and containing only letters and digits with the exception of legal register names. If exists, must begin in the first column of a line NOTE: Every memory address refered, must have been reserved by one of the previous pseudo-instructions. E.g. the instruction "load 3 R2", will cause an "Out of Memory" error, if at least "mem 3" or three "const" pseudo-instructions were not given... If a "equ" value is used as a memory address, that address must be already reserved or be a known memory-mapped instruction. The "string" argument must be quoted and is converted to a sequence of ascii codes ending with 0. ----------------------------------------------------------------------- System Stack: ------------ The system stack occupies the rest of the RAM (growing for higher addresses). Since Apoo version 3.0 it can be used in an advanced way to implement activation records. However in can be used in a simpler way to implement subroutines. We can only push a value to the Stack and pop a value from it (the one in the top of the Stack). It is used by the instructions jsr and rtn. It can be manipulated by means of the push and pop instructions. ----------------------------------------------------------------------- Memory mapped: ------------- It is possible to associate to special memory positions a special effect. Currently this is used for input/output: store R0 50000 # writes character with ascii code R0%256 load 50000 R0 # loads R0 with 0 (do nothing) store R0 50001 # writes the contents of R0 as integer load 50001 R0 # reads an integer and stores it in R0 store R0 50010 # writes a CR load 50010 R0 # loads R0 with 0 (do nothing) Instruction form: ---------------- Operation Label is any string of letters or digits; if exists, must begin in the first column of a line Comments: -------- A line beginnig with # will be ignored by the parser; so it can be used to write comments of the program Basic Instruction Set: --------------------- -------------------------------------------------------------------------- Operation Operand1 Operand2 Meanning -------------------------------------------------------------------------- load Mem Ri loads contents of memory address Mem into register Ri; Mem can be a label -------------------------------------------------------------------------- loadn Num Ri loads number Num into register Ri; Num can be a label -------------------------------------------------------------------------- loadi Ri Rj loads contents of memory which address is the contents of Ri into Rj (indirect load) -------------------------------------------------------------------------- store Ri Mem stores contents of Ri at memory address Mem; Mem can be a label -------------------------------------------------------------------------- storer Ri Rj stores contents of Ri into Rj -------------------------------------------------------------------------- storei Ri Rj stores contents of Ri into at memory address, which is the contents of Rj -------------------------------------------------------------------------- add Ri Rj add contents of register Ri to contents of register Rj, and stores into Rj (Rj=Ri+Rj) -------------------------------------------------------------------------- sub Ri Rj subtracts contents of register Rj from contents of register Rj and stores into Rj (Rj=Ri-Rj) -------------------------------------------------------------------------- mul Ri Rj multiplies contents of register Ri and contents of register Rj, and stores into Rj (Rj=Ri*Rj) -------------------------------------------------------------------------- div Ri Rj stores into Rj the quotient of integer division of contents register Ri by the contents of register Rj, and stores into Rj (Rj=Ri/Rj) -------------------------------------------------------------------------- mod Ri Rj stores into Rj the rest of integer division of contents of register Ri by the contents of register Rj, and stores into Rj (Rj=Ri%Rj) -------------------------------------------------------------------------- zero Ri the contents of Ri becomes 0 (Ri=0) -------------------------------------------------------------------------- inc Ri increments by 1 the contents of Ri -------------------------------------------------------------------------- dec Ri decrements by 1 the contents of Ri -------------------------------------------------------------------------- jump Addr jumps to instruction address Addr; Addr can be a Label -------------------------------------------------------------------------- jzero Ri Addr jumps to instruction address Addr, if contents of Ri is zero; Addr can be a Label -------------------------------------------------------------------------- jpos Ri Addr jumps to instruction address Addr, if contents of Ri is positiv; Addr can be a Label -------------------------------------------------------------------------- jneg Ri Addr jumps to instruction address Addr, if contents of Ri is negativ -------------------------------------------------------------------------- jnzero Ri Addr jumps to instruction address Addr, if contents of Ri is different from zero --------------------------------------------------------------------------- jsr Addr pushes the PC into the stack and jumps to instruction address Addr -------------------------------------------------------------------------- rtn pops an address from the stack into the PC -------------------------------------------------------------------------- push Ri pushes the contents of Ri into the system stack -------------------------------------------------------------------------- pop Ri pops at element from the system stack into Ri -------------------------------------------------------------------------- halt stops execution; Every program must have this instruction in order to end properly; otherwise an 'Out of Program' error will occur -------------------------------------------------------------------------- Activation Records Management ---------------------------- There are two programmable registers to address the system stack: stack register and frame register. They correspond to the last two registers of a Apoo vpu configuration, Rn-1 and Rn-2, but are aliased to rs and rf, respectively. The stack register rs contains the address of the last stack memory cell (or -1 if no static memory is allocated). The instructions jsr, rtn, push and pop manipulates the stack in the usual way. Besides that, the contents of the stack register can be manipulated as any other register. The frame register can be used for the implementation of local information (on the system stack). It contents should be the first stack address of the current activation record. Like the stack register it can be manipulated as any other register, but it is also used in two special instructions: storeo and loado. - storeo Ri Num: stores the contents of register Ri at memory address (rf) + Num, where Num is an integer. - loadeo Num Ri: loads the contents of memory address (rf) + Num into register Ri, where Num is an integer. In both instructions, if Num is non negative it should correspond to local memory and if it is negative, possibly corresponds to arguments of a subroutine call. ------------------------- The End ---------------------------------------