Apoo assembly language

Apoo has a set of general purpose registers (32 by default), a data memory area, a program memory area, a system stack and a program counter register.

All memory cells and registers have 32 bits.

Registers are named R0,R1,R2,R3,R4,R5,R6,R7,...

Memory Data

Memory cells are created as needed. We can reserve memory cells in two ways, using the following pseudo-instructions:

Pseudo-instructions

      Meaning
<Label:> mem n reserves n memory addresses
Label: const n1 contents of memory address
  const n2 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 beginning 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

A special memory area used 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.

Instruction Form

<Label:> Operation <Operand1> <Operand2>

Label is any string of letters or digits; if exists, must begin in the first column of a line

Comments

A line beginning with # will be ignored by the parser; so it can be used to write comments of the program

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
jnzero Ri Addr jumps to instruction address Addr, if contents of Ri is different from zero;
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; Addr can be a Label
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

Memory-Mapped Instructions

Apoo allows the configuration of a set of memory positions for special purposes. The memory values and its functionality are given as a parameter of the Apoo virtual machine. The default values allow the simulation of input/output:

Memory Position Load Store
50000 load 50000 Ri

loads 0 in Ri
store Ri 50000

writes the character which ascii code is Ri%256 in the Output Window (in graphical interface) or in stdout, in text mode.
50001 load 50001 Ri

reads an integer and stores it in Ri
store Ri 50001

writes the contents of Ri as an integer
50010 load 50010 Ri

loads 0 in Ri
store Ri 50010

writes a CR in the Output Window (in graphical interface) or in stdout, in text mode.



Here is an example:

	loadn	97	R0
store R0 50000
store R0 50010
store R0 50001
store R0 50010
load 50001 R0
loadn 5 R1
add R0 R1
store R0 50001
store R0 50010
halt

© 1998-2006 Rogerio Reis, Nelma Moreira {rvr,nam}@ncc.up.pt