Macroensamblador Zero |
El presente documento explica cómo utilizar el macroensamblador para crear programas para la máquina virtual Zero. Hay otra información que también es posible utilizar como referencia, como por ejemplo, la contenida en el manual de programación en ensamblador Zero, y, sobre todo, la documentación sobre la librería estándar.
En esta sección se describirá la compilación de un objeto sencillo, como el que se ve a continuación:
object HolaMundo : ConsoleApplication
method + doIt()
parent.prepare()
System.console.write("¡Hola, Mundo!")
System.console.lf()
return
endMethod
endObject
Este objeto recibe y envía información por consola, por lo que debe derivar del objeto "ConsoleApplication", que es la que prepara este tipo de E/S. El objeto HolaMundo, por su parte, sólo manda un mensaje a la consola para visualizar el mensaje "¡Hola, Mundo!".
Este código fuente puede escribirse en cualquier editor de texto, pero debe llamarse de la misma forma que el objeto principal, es decir, "HolaMundo.zm".
La compilación del objeto se realiza de la siguiente forma:
$ zm HolaMundo.zm
La ejecución de este objeto se realiza como sigue:
$ zvm HolaMundo
¡Hola, Mundo!
Sintaxis:
object <nombre_objeto> [ :
<nombre_objeto_padre>
]
endObject
Ejemplo:
Sintaxis:
attribute <+/-> <nombre_atributo> [ =
<literal>/<nombre_de_objeto> ]
Ejemplo:
Una comenzado un gestor de excepciones, la excepción producida está en el registro __exc.
Sintaxis:
method <+/->
<nombre_método>([<parámetro1>,
[<parámetro2>, ...]])
endMethod
Ejemplo:
object Punto
! Les damos valor 0, pero podría ser otro
valor
attribute + x = 0
attribute + y = 0
method + ponCoordenadas(a, b)
x = a
y = b
return
endMethod
endObject
Sintaxis:
return <expresión>
Ejemplo:
object Punto
attribute + x = 0
attribute + y = 0
method + toString()
reference toret = "("
toret = toret.concat(x.toString())
toret = toret.concat(", ")
toret = toret.concat(y.toString())
toret = toret.concat(")")
return toret
endMethod
endObject
Sintaxis:
reference <nombre_referencia> [ =
<literal>/<expresión> ]
Ejemplo:
object Punto
attribute + x = 0
attribute + y = 0
method + toString()
reference toret = "("
toret = toret.concat(x.toString())
toret = toret.concat(", ")
toret = toret.concat(y.toString())
toret = toret.concat(")")
return toret
endMethod
endObject
Sintaxis:
throw <nombre_objeto>
Ejemplo:
object Punto
attribute + x = 0
attribute + y = 0
method + ponValorX(a)
isInstanceOf Float, a
jumpOnTrueTo fin
throw
ETypeMismatch
:fin
x = a
return
System.console.write("Error
de
asignación")
endMethod
endObject
Sintaxis:
isInstanceOf <referencia>, [<expresión>]
Ejemplo:
object Punto
attribute + x = 0
attribute + y = 0
method + ponValorX(a)
isInstanceOf Float, a
jumpOnTrueTo fin
throw
ETypeMismatch
:fin
x = a
return
System.console.write("Error
de
asignación")
endMethod
endObject
Sintaxis:
jump <nombre_etiqueta>
Ejemplo:
object Punto
attribute + x = 0
attribute + y = 0
method + ponValorX(a)
isInstanceOf Float, a
jumpOnTrueTo fin
throw
ETypeMismatch
! En realidad, lo siguiente nunca se ejecuta ...
jumpTo fin
:fin
x = a
return
System.console.write("Error
de
asignación")
endMethod
endObject
Sintaxis:
jumpOnTrueTo <nombre_etiqueta>
Ejemplo:
object Punto
attribute + x = 0
attribute + y = 0
method + ponValorX(a)
isInstanceOf Float, a
jumpOnTrueTo fin
throw
ETypeMismatch
:fin
x = a
return
System.console.write("Error
de
asignación")
endMethod
endObject
Sintaxis:
jumpOnFalseTo <nombre_etiqueta>
Ejemplo:
object Punto
attribute + x =0
attribute + y = 0
method + ponValorX(a)
isInstanceOf Float, a
jumpOnFalseTo excepcion
jumpTo fin
:excepcion
throw
ETypeMismatch
:fin
x = a
return
System.console.write("Error
de
asignación")
endMethod
endObject
Los siguientes conceptos son empleados en la programación con este macroensamblador Zero:
Existen dos tipos de expresiones: las que asignan la referencia
devuelta por un mensaje a un método a una referencia local
declarada previamente
(o a un
atributo del objeto), y las que no realizan ésto último,
siendo,
símplemente, mensajes a objetos.
Nótese que el tipo de expresiones que pueden pasarse como
parámetro a un
método son del segundo tipo.
Nótese que las referencias son siempre, el nombre del objeto,
seguido de un
número variable de nombres de atributos. Todos ellos están
separados por puntos.
Por último, las asignaciones de los atributos no son expresiones,
sino que son o bien
literales o bien referencias.
[<nombre_referencia_local>|<nombre_atributo> = ]
<referencia>.<método>(<literal1>|<expresión1>
[, <literal2>|<expresión2> [, ...] ])
Un ejemplo de expresiones:
! Éste objeto representa a una persona
object Persona
attribute + nombre = "Juan
nadie"
attribute + edad = 40
method + putNombre(nom)
nombre = nom
return
endMethod
endObject
Los literales se indican, bien con un número con la notación
habitual,
bien como una cadena encerrada entre comillas dobles (").
Un literal sólo puede ocupar una línea, si bien ésta es
ilimitada.
Sólo hay tres "tipos" de literales, los números reales, que
son objetos
derivados de Float, los números enteros, objetos derivados de Int,
y las
cadenas, que derivan de String. En estos prototipos se definen todas las
operaciones que pueden
realizarse sobre estos dos tipos de items de información
NOTA: Una secuencia de caracteres entre comillas será tomada como de tipo cadena. Un número que contenga parte decimal será identificado como flotante, meintras un número sin parte decimal será tomado como entero.
Un ejemplo de literales:
! Éste objeto representa a una persona
object Persona
attribute + nombre = "Juan
nadie"
attribute + edad = 40
attribute + sueldo = 1300.5
endObject
Los comentarios se indican con una admiración '!',
y sólo pueden ser puestos al comienzo de una línea.
En ningún caso podrán afectar sólo a una parte de una
línea.
Es decir, "object Punto ! Punto es un objeto
" no será
aceptado.
! Éste objeto representa a un punto
object Punto
attribute + x = 0
attribute + y = 0
endObject
Las etiquetas se representan anteponiendo el símbolo ':'. Sirven para saltar a ellas (cambiando el flujo de ejecución) mediante jumpTo, jumpOnTrueTo y jumpOnFalseTo.
object Punto
attribute + x = 0
attribute + y = 0
method + ponValorX(a)
isInstanceOf Float, a
jumpOnTrueTo fin
throw
ETypeMismatch
:fin
x = a
return
System.console.write("Error
de
asignación")
endMethod
endObject
J. Baltasar García Perez-Schofield jbgarcia@uvigo.es |