You are on page 1of 39

I.

Instalacin de Jasmin y cmo utilizar la GUI Jasmin


Como su nombre indica Jasmin ha sido desarrollado utilizando Java. Todo lo que necesita para ejecutarlo esla versin 1.5 de la mquina virtual de Java para su plataforma. Por favor enve informes de errores aqu . Esta seccin es acerca del uso de Jasmin, no el lenguaje ensamblador en general. Consulte ensamblador Fundamentos para obtener informacin tcnica.

La interfaz

Funcionalidad de Jasmin
1. ejecucin
1.1 Generalidades

Muy parecido en un depurador puede dejar Jasmin interpretar el cdigo paso a paso o ejecutar todo el programa (hasta un punto de interrupcin). Las funciones se pueden encontrar en el men "Ejecutar" o en la barra de herramientas con el icono correspondiente.
1,2 de ejecucin

El botn "ejecutar" se ejecutar todos los comandos desde la lnea apuntada por el registro EIP actual (puntero de instruccin ) en adelante. El cdigo ser interpretado lnea por lnea. Cuando el control llega JMP o RET comandos EIP se modificar como era de esperar y la ejecucin continuar all. Mientras se ejecuta un programa, el botn se convertir en "pausa", que le permite detener creados accidentalmente bucles sin fin, por ejemplo.
1.3 de parada

Para forzar una interrupcin del programa utilice el botn de parada. Establece EIP a 0, lo que permite un nuevo comienzo.
1.4 puntos de interrupcin

De lo contrario, la ejecucin continuar hasta que el control llega a un punto de interrupcin o el final del programa. Puede establecer y quitar puntos de interrupcin, haga clic cerca del borde izquierdo del editor de cdigo junto al nmero de lnea.
1.5 paso

El botn de paso ser ejecutar una lnea de cdigo, como la orden de marcha lo hara, pero luego se detiene de nuevo. Se probar un botn til para encontrar errores.
1.6 ejecutar la lnea en la posicin del smbolo de intercalacin

En caso de que quiera ver el efecto de un comando que acaba de escribir, dejar que el smbolo de intercalacin en la misma lnea que el nuevo comando y elija el comando "ejecutar la lnea actual" en el men. Tambin puede usar esto para saltar de un lado al azar en el cdigo. El puntero de la instruccin actual (EIP) no ser modificado, por lo que mando un paso o de ejecucin continuar la ejecucin en el que tendra antes de "ejecutar la lnea actual".

2. datos
2.1 registros y banderas

En Jasmin datos aparecen en tres formas. Ah est el procesador con sus registros y banderas y no hay memoria, lo que representa la memoria RAM, que se conecta al procesador a travs del bus en un sistema real. registros del procesador estn representados por los campos de edicin nueve con los nombres de registro junto a ellos a la izquierda lado de la ventana de Jasmin.

Por encima, se puede controlar la representacin de datos. A continuacin los nombres de los registros que hay un pequeo botn que revelar una vista por bytes de los registros. Eso es especialmente interesante si se desea acceder a los registros como "AH" o "EB" que representan partes de la extendida de 32 bits registros EAX y EBX. Consulte nuestro tutorial bsico para ms.
2.2 Memoria

La memoria principal se puede encontrar en el lado derecho, ordenados por la direccin. Tenga en cuenta que puede configurar su tamao en la preferencias de ventana.
2.3 instantneas, restablecer y guardar la memoria / carga

Una funcin interesante si crea-datos de prueba es la carga / funcin de ahorro de memoria. Ello contribuir a salvar el estado actual de Jasmin (memoria, registros, banderas) en un archivo para su uso posterior.Para la depuracin, por el contrario, por lo general, utiliza los botones de instantneas. Tomar una instantnea significa que el estado se guarda y se puede revertir en cualquier momento con la funcin "Cargar Imagen Instantnea". Tenga en cuenta que a diferencia de un archivo de memoria almacenada una instantnea grabada se perder al salir de Jasmin. Tambin hay un botn de reinicio que cero los indicadores de memoria y los registros (y restablece la pila y base punteros).
2.4 preferencias

La ventana de preferencias se puede acceder a travs del men de configuracin de Archivo->. Esto le permite configurar las fuentes de editor y tanto el tamao de memoria y empezar de direcciones. La razn de la funcin de direccin de inicio se est acostumbrando a valores mayores, como escribir un programa para un PC, direcciones generalmente se parecen 0x1fc892a4 lugar de 0xA4. De esta manera usted puede decir generalmente una direccin de un nmero que se calcula por su valor.
2.5 pantalla de 7 segmentos

Junto a la ficha Ayuda debajo del editor, tambin hay una ficha Pantalla. Al hacer clic se revela cuatro displays de 7 segmentos que representan a la primera posicin de memoria. Consulte el Tutorial Display de 7 segmentos para ms informacin.

3. edicin de cdigo
3.1 Sintaxis

Jasmin comprobar interactiva sintaxis y realizar el resaltado de sintaxis a medida que escribe. Los errores se muestran en la parte inferior del editor. Tambin hay una ventana de ayuda incrementales a aparecer que le indica los operandos esperados de la orden que acaba de escribir. Para establecer la EIP a una lnea de cdigo especfica, haga clic en su nmero de la izquierda. La sintaxis es principalmente el mismo como se puede encontrar en la documentacin de Intel (intelins.pdf, 2,6 Mb) . Consulte la lista de comandos para todos los comandos soportados, su operando y efectos. Unas palabras sobre la sintaxis del lenguaje ensamblador:

Los comentarios comienzan con un punto y coma (;) y al final al final de la lnea comandos estn en el comienzo de una lnea (por lo general precedido por espacios en blanco) operandos se colocan detrs de los comandos (separados por espacios en blanco) varios operandos estn separados por una coma (,) etiquetas, tambin deben estar al principio de una lnea y terminar con dos puntos (:)

3.2 Lista de comandos

Una lista de todos los comandos soportados se puede encontrar aqu.

Sintaxis y diferencias entre Jasmin y CPUs x86 reales


El aspecto general y la sensacin de Jasmin es similar a NASM. As que usted puede utilizarlo como si cifr para una CPU real. Hay algunas reglas de sintaxis que tienen que ser utilizados:

Sintaxis

Los operandos se especifican despus de la orden y separados por una coma


MOV EAX, 3

ambas instrucciones y las etiquetas no son sensibles a maysculas comentarios comienzan con un punto y coma y pueden ser lneas enteras o comenzar despus de una instruccin
; Esto es un comentario PUSH EAX ; Empuje EAX a Pila

espacios, tabuladores y lneas en blanco se ignoran slo se permite una instruccin por lnea etiquetas se definen con dos puntos
programa:

etiquetas, instrucciones, operandos y comentarios son posibles en una lnea


programa: ADD EAX, [EBX 4] ; aadir algo a EAX

Instrucciones soportadas
Hay algunas instrucciones (en coma flotante, principalmente, un propsito general) que no se implementan hasta ahora. Mira nuestra visin general del sistema para ver qu se apoyan las instrucciones. Todo lo necesario para nuestras obras tutoriales. Para poner en prctica las nuevas instrucciones, consulte el manual de Desarrolladores (que an no est disponible).

Las diferencias a la Asamblea sobre hardware real


Cdigo y la memoria

La principal diferencia es que Jasmin interpreta el cdigo y el cdigo no se almacena en la memoria. As que tenemos dos nmeros de lnea y las direcciones de memoria que no son el mismo como en un sistema real.

Jump instrucciones de uso de su operando como nmero de lnea.


JMP 16 ; contine en la lnea 16

Direcciones de memoria de acceso de la memoria.


MOV [4], 22 , escribir a la direccin de memoria 22 4

No tener un programa binario en la memoria tambin significa que usted no puede escribir cdigo de auto-transformacin.
Labels / variables

Para apoyar a las variables que apuntan a destinos memoria Jasmin tiene para distinguirlas de las etiquetas, aunque ambos usan la misma sintaxis. Ver Bubbleclase como ejemplo. Las variables tienen que definirse antes de que puedan ser utilizados (los nmeros de lnea) para que el resaltador los conoce.
Memoria

Jasmin slo conoce un modelo plano. No hay segmentos o pginas. De datos es simplemente al principio, la pila al final. Cuntos se utiliza la memoria se puede definir en el cuadro de dilogo Opciones.
FPU

Como se mencion antes slo hay algunas instrucciones FPU hasta ahora. Estas instrucciones utilizan variables de 64 bits-java-doble, as que podra haber errores de redondeo en comparacin a la FPU x86 de 80 bits.
Entrada / Salida

Jasmin no admite interrupciones o I / O como un procesador real. Los valores almacenados en los registros o la memoria pueden verse y modificarse manualmente en la ventana de Jasmin.

II. Concepto Von-Neumann


El concepto de Von Neumann-es el concepto bsico para los microprocesadores universales. La arquitectura ix86 se basa en ese concepto. En este diagrama se puede ver las partes de una CPU ix86:

Unidad de control
La unidad de control interpreta las instrucciones del programa y controla las otras partes del procesador. Instruccin Registro: almacena la instruccin real que se carga desde la memoria antes. Contador Instruccin: Direccin tiendas memoria de la siguiente

instruccin. Se incrementa automticamente despus de cada comando. Registro de estado (flags): Informacin sobre el resultado de la ltima operacin se almacena aqu.Algunas instrucciones hacen cosas diferentes dependiendo de las banderas. Decodificador: lee la instruccin actual y utiliza las banderas si es necesario para averiguar lo que est por hacer. Generador de seal: aqu se generan las rdenes para las otras partes del procesador.

Unidad de Ejecucin
La unidad de ejecucin es la unidad central del procesador. La unidad lgica aritmtica calcula, los registros son un recuerdo muy rpido para mantener los operandos que son necesarios para la operacin real.

Memoria
La memoria almacena los datos y las instrucciones del programa real. Los datos se pueden leer y escribir en su direccin.

E / S Unidad

Input forma el medio ambiente y la produccin de los resultados se logr aqu. No usamos la Unidad de E / S para jasmin.

Ciclo de Von-Neumann
Instrucciones son tratados en cinco pasos. Aqu puedes ver lo que sucede:
Ir a buscar

La direccin de la siguiente instruccin se lee desde el contador de instrucciones. La siguiente instruccin se lee de la siguiente direccin de memoria a registro de instruccin.
Descodificar

La instruccin se traduce a un formato que es utilizable para la unidad de ejecucin por el decodificador.
Fetch operandos

En funcin de los operandos de instrucciones reales de una posicin de memoria tiene que ser trada para ser accesible para la unidad de ejecucin.
Ejecutar

La unidad lgica aritmtica realiza las operaciones y escribe los resultados en registros o memoria de acuerdo con la instruccin. Banderas se establecen y el contador de la instruccin obtiene un nuevo valor en el caso de un salto.
Actualizar contador de instrucciones

El contador se incrementa la instruccin para el siguiente ciclo. Ahora bien, el primer paso puede empezar de nuevo.

Comando que ocupa

ADC ADD AND CALL CMOVA CMOVAE CMOVB CMOVBE CMOVC CMOVE CMOVG CMOVGE CMOVL CMOVNA CMOVNAE CMOVNB CMOVNBE CMOVNC CMOVNE CMOVNG CMOVNGE CMOVNL CMOVNLE CMOVNO CMOVNP CMOVNS CMOVNZ CMOVO CMOVP CMOVPE CMOVPO CMOVS CMOVZ CMP CMPXCHG DEC DIV IDIV IMUL INC JA JAE JB JBE

JC JCXZ JE JECXZ JG JGE JL JLE JMP JNA JNAE JNB JNBE JNC JNE JNG JNGE JNL JNLE JNO JNP JNS JNZ JO JP JPE JPO JS JZ LOOP LOOPE LOOPNE LOOPNZ LOOPZ MOV MOV MUL NEG NOP NOT OR OR POP POPA

POPAD POPF POPFD PUSH PUSHA PUSHAD PUSHF PUSHFD RET SAL SAR SBB SHL SHR SUB XCHG

ejecutar comandos para Jasmin


Introduccin
La implementacin de otros comandos es bastante sencillo, ya que la mayora de la funcionalidad que necesita ya est integrado en los componentes existentes de Jasmin. Usted tiene todo para traducir el comportamiento del comando (como especifica la documentacin de Intel) en cdigo Java. Vamos a hacer esto para el comando ADD como un ejemplo.

Creacin de archivos del sistema y descripcin general


Todos los comandos se encuentran en las jasmin.commands paquete, y todos ellos necesitan tener acceso a varios componentes en el interior jasmin.core, as como algunas funciones de apoyo en la superclase de comandos, JasminCommand (respectivamente FpuCommand si se trata de un comando FPU). El nombre de clase de la orden no es importante. Le recomendamos que utilice mnemo de la orden para que el fin de reconocer fcilmente. Los Mnemos por el cual un comando se puede llamar (en este caso "ADD") se especifican en la funcin getID (), cuyo valor de retorno es simplemente una matriz String que contiene todas las Mnemos. De esta manera, es a la vez posible llamar un comando por varios alias (por ejemplo, SHL / SAL son la misma operacin), y para combinar varios comandos sombrero cuota de la mayor parte de su cdigo en un archivo (por ejemplo, ADD y ADC). La validacin de los argumentos de entrada est a cargo de la funcin de validacin (Parmetros). Esta funcin siempre se llama antes de que se ejecute el comando, y slo si se devuelve un valor nulo (que significa "ningn error, todo OK") el mtodo execute () se llama cada vez. Tenga en cuenta que validar tambin se llama varias

veces mientras el usuario est escribiendo su cdigo de programa ensamblador. El mtodo execute (Parmetros) finalmente hace lo que se supone que el comando para hacerlo cuando se le llama. As que, justo despus de su creacin, la clase del comando debera ser ms o menos as:
jasmin.commands paquete; jasmin.core import *.; public class Agregar extiende JasminCommand { public String [] getID () { return new String [] {"ADD"}; } ParseError validar pblico (Parmetros p) { devolver null; } public void execute (Parmetros p) { } }

Antecedentes I: Las clases "xArgument"


Los argumentos que se pasan a los comandos se almacenan como objetos de tipo xArgument. Hay dos versiones: SmallArgument contiene toda la informacin requerida por los mtodos internos de Jasmin para describir (y trabajar) el tipo / ubicacin de los datos. SmallArguments slo se usan "internamente", donde los mtodos pasan argumentos en torno a que ellos mismos crearon. FullArgument (extendiendo SmallArgument), adems, contiene informacin sobre la forma en que los datos fueron introducidos por el usuario (que se necesita, por ejemplo, para el resaltado de error), y se utiliza en lugar de SmallArgument cuando el cdigo ASM introducido por el usuario se analiza en los objetos. Cada objeto xArgument slo representa un nico argumento, como "EAX", "[104]" o "etiqueta". Para simplificar, los campos xArguments 'estn declarados como pblicos y se puede acceder directamente, un comando nunca debera tener que hacer esto, sin embargo.

La clase "Parmetros": Antecedentes II


Las instancias de esta clase se utilizan para encapsular los argumentos de un comando se especifica en una lnea determinada de cdigo ASM, junto con algunas funciones de apoyo utilizados para acceder, la validacin y el almacenamiento de datos. Acceso a los argumentos mismos se realiza mediante la funcin get (int), que devuelve el valor del parmetro de orden i como de largo (64 bits) de valor. Si el argumento es una investigacin inmediata, un registro, una ubicacin de memoria o cualquier otra cosa no importa ya que se maneja internamente, la funcin get () siempre devuelve el valor a largo de la misma. Para acceder a los valores de punto

flotante, no es la funcin GETF (int, int) que toma el tipo de representacin de datos (flotante, enteros (con embalaje) bcd) como segundo parmetro. Del mismo modo, la put () mtodos almacenar el parmetro de tiempo determinado en el lugar especificado por el dado (Pequeo / Completa) Argumento. El parmetro MemCellInfo se utiliza para almacenar informacin adicional sobre el valor, en la actualidad esto slo es necesario para las etiquetas con el fin de ser capaz de actualizar su valor (es decir, su nmero de lnea) cuando se accede. Por lo general, slo puede pasar "null" aqu. Si usted est interesado slo en el tamao o el tipo de un argumento, por ejemplo, para la validacin, use el tamao (int) resp. escriba mtodos (int). Validacin Argumentos: El mtodo validate (int, int) es el principal mtodo de validacin. Pase el ndice del argumento como el primer parmetro y una mscara de bits de los tipos permitidos (como se especifica en la clase Op) como la segunda, y se obtiene un valor nulo si el argumento es uno de los tipos permitidos o un ParserError apropiado que contiene informacin de error si no es . El mtodos validateAll () y validateAllSizes () se utilizan para los comandos con un nmero variable de argumentos como los comandos de pseudo-memoria de la reserva, que se puede dar cualquier nmero de argumentos. Hay varias funciones adicionales de validacin que cubren combinaciones frecuentes de argumentos permitidos, por ejemplo numericSrcOK () y numericDestOK () que comprueban los argumentos de origen y destino para la aritmtica "estndar" como los comandos ADD. Para leer realmente los argumentos despus de su validacin, se proporciona el mtodo prepareAB (). En las primeras versiones de Jasmin, que sola ser un poco ms complejo de lo que es ahora. Lo nico que hace es leer el primer parmetro y la almacenamos en la variable local a, y el segundo el de b. Tambin puede hacerlo manualmente utilizando get (), es decir, "pa = get (0); pb = get (1);". Acerca de los otros mtodos que se encuentran en la clase de parmetros, vea sus etiquetas Javadoc. El mtodo de validacin de validacin (Parmetros p) Como se indic anteriormente, validar () es llamado tanto durante la escritura e inmediatamente antes de que se ejecute el comando para comprobar si los argumentos dados estn bien. Como la mayora de los comandos comparten una cantidad considerable de cdigo de validacin, los mtodos apropiados estn disponibles como parte de la clase de parmetros, por lo que, en general, todo lo que tienes que hacer es llamar el mtodo correcto, comprobar si el valor devuelto es nulo, y ya est . Recuerde que debe comprobar si el nmero de argumentos es correcto, es decir, cuando se requieren dos, el tercero debe ser de tipo Op.NULL!

En el caso de ADD, podemos simplemente utilizar el numericSrcOK () y mtodos (numericDestOK). En otros casos, ser necesario comprobar los tipos de los argumentos "a mano" usando el mtodo de validacin.Pero numericXxxOK () hace algo ms, por ejemplo, la comprobacin de que el destino es lo suficientemente grande. Por lo general, usted tiene que llamar a ms de un mtodo de validacin, porque es necesario comprobar ms de una cosa. Por lo tanto, tenemos una variable ParseError, establecen a NULL, y luego asignamos valores de retorno de los diferentes mtodos 'a ella. Si todos son nulos, todo est bien, y validar () s puede devolver null, de lo contrario, si el mtodo devuelve realmente una ParseError, validar () debe pasar a lo largo. Esto es lo que el mtodo se parece ahora:
ParseError validar pblico (Parmetros p) { ParseError e = p.numericDestOK (); primera llamada / / validacin if (e = null!) {return e;} / / salida en caso de error, el error de pasar a lo largo de e = p.numericSrcOK (); segunda llamada / / validacin if (e = null!) {return e;} e = p.validate (2, Op.NULL) / / tercera llamada volver e / / finalmente, devolver el valor de e no importa lo que sea }

El mtodo de ejecucin execute (Parmetros p)


Como todo el control y la validacin ya est hecho, la propia ejecucin del comando es muy fcil. Obtener los datos, trabajar con l (en este caso: aadirlo), y gurdelo. Recuerde que debe establecer los indicadores apropiados! Hay un ayudante SetFlags de funcin () de la superclase JasminCommand que lo hace por usted, pero debe ser llamada con los argumentos adecuados: a Parmetros object que contiene los valores, y una definicin de mscara de bits que las banderas que desea ajustar en consecuencia. Por lo tanto, usted debe usar las variables "a", "b" y "nmero" dentro de los parmetros objeto de almacenar los dos argumentos y el resultado, en lugar de crear variables locales.prepareAB () ya lo hace la primera parte de eso. Por lo tanto, esto es lo que el mtodo es as:
public void execute (Parmetros p) { p.prepareAB (); / / obtener los argumentos, gurdelos en PA y PB p.result = pa + pb; / / aadir a Wink, almacenando el resultado en p.result SetFlags (p, DE + SF + ZF + AF + CF + PF); / / establecer las banderas con los valores dentro de p

p.put (0, p.result, null); / / escribir el resultado en el destino }

Extendiendo el archivo para cubrir un segundo comando


Veamos ahora extendemos la clase Add para hacer frente a ADC (ADD con acarreo), tambin. En primer lugar, registre el mnemo adicional:
public String [] getID () { return new String [] {"ADD", "ADC"}; }

A continuacin, aadir la funcionalidad necesaria para la ejecucin (mtodo), en el que el curso de accin depende de la mnemo dado:
public void execute (Parmetros p) { p.prepareAB (); if (p.mnemo.equals ("ADD")) { p.result = pa + pb; } Else if (p.mnemo.equals ("ADC")) { p.result = pa + pb + (dataspace.fCarry 01:00?); } SetFlags (p, DE + SF + ZF + AF + CF + PF); p.put (0, p.result, null); }

Nota: Por supuesto, el bloque si-se podra haber hecho ms corto con slo las cosas dataspace.fCarry en ella, pero de esta manera es ms fcil aadir SUB, SBB y CMP a la clase, as Guio Tenga una mirada en el cdigo fuente de Jasmin para ver cmo se hace. El mtodo validate () no necesita ser cambiado como ADD y ADC trabajo exactamente con los mismos parmetros.

Definicin de un tamao predeterminado de operacin personalizado o de signo


Por lo general, los comandos trabajan con valores 32bit/4-byte cuando no se especifica el tamao explcita, pero hay excepciones a esa regla, como "empujar 5" que empuja "5" como valor 16bit/2-byte en la pila. Para establecer el tamao predeterminado de operacin de un comando a algo distinto de 4 bytes (que es el valor predeterminado definido en JasminCommand), reemplace el mtodo () DefaultSize. Ejemplo:
public int DefaultSize () { volver 2; }

Una de las grandes caractersticas de la representacin de complemento a dos de los nmeros negativos es que no es necesario diferenciar entre valores positivos y negativos cuando los aade. Por eso, la configuracin predeterminada es para acceder a cualquier nmero como un valor positivo (recordemos que Jasmin utiliza variables "largos" internamente, por lo que es en realidad una diferencia entre la representacin de un "real" -1 en formato largo y un -1 en de 32 bits en formato almacena como un valor long positivo). Si alguna vez tiene firmado explcitamente el acceso a un valor (IMUL hace, por ejemplo), reemplace el mtodo firmado () as:
public boolean firmado () { return true; }

Descripcin de los mtodos de "marco"


SetFlags
Como su nombre indica, JasminCommand.setFlags () establece las banderas de la CPU simulada. Lo que las banderas se establecen para que se descubierto de forma automtica, slo tiene que pasar un objeto que contiene los valores de los parmetros a, b y de resultados, y una mscara de bits que especifica qu etiquetas se fijarn en su caso. Los cdigos de los indicadores se definen en JasminCommand, tambin, y ya que funcionan como mscaras de bits que se pueden agregar o "o" ellos. Por lo tanto, si usted tiene un objeto llamado p Parmetros y quieren fijar el Carry-y Zero-bandera, puede llamar a:
SetFlags (p, CF + ZF);

o, lo que funciona igual de bien:


SetFlags (p, CF | ZF);

La primera anotacin es probablemente ms intuitivo, ya que desea que el CF "y" la ZF que se fijar de acuerdo con el resultado, no el "o" la otra. testCC JasminCommand.testCC prueba un cdigo de condicin y devuelve true si se cumple la condicin, false en caso contrario. La condicin se especifica como una cadena con uno a cuatro letras, a las condiciones de forma en que se utilizan como parte de Mnemos comando (y como se definen en la documentacin de Intel).As que, cuando se implementa un comando condicional como Jxx (JZ, JNZ, JLE, etc), slo tiene que quitar la parte de "comando" de la mnemo y pasar la parte de "condiciones" para testCC, y de esa manera se ha determinado con comodidad ya sea para trabajar o no. De esta manera:
if (testCC (command.substring (1)) { ... }

http://www.lrr.in.tum.de/~jasmin/downloads.html

GUA DEL USUARIO JASMIN


Jonathan Meyer, Julio 1996

Acerca de este documento


Esta gua describe las reglas y la sintaxis utilizada en Jasmin, y cmo ejecutar Jasmin. Tenga en cuenta que este documento no explica la propia mquina virtual de Java, o darle a las notas de sintaxis para cada instruccin conocido por Jasmin. Consulte la especificacin de la mquina virtual de Java para obtener ms informacin sobre la JVM. Tambin debe ver: Acerca de Jasmin describe lo que es Jasmin, que podran encontrar interesante, etc Incluye un ejemplo trozo de cdigo. Instrucciones de Jasmin Describe la sintaxis de las instrucciones de la JVM en Jasmin.

Qu es Jasmin?
Jasmin es un ensamblador para la mquina virtual de Java. Toma descripciones ASCII de clases Java, escritas en una sintaxis de ensamblador como simple utilizando el conjunto de instrucciones de la mquina virtual de Java. Esto los convierte en archivos binarios de clases Java, adecuado para la carga por un sistema de ejecucin de Java. Jasmin fue creado originalmente como un compaero al libro "Java Virtual Machine", escrito por Jon Meyer y Troy Downing y publicado por O'Reilly Associates. El libro est ahora fuera de impresin. Jasmin sobrevive como un proyecto de cdigo abierto SourceForge.

Jasmin Diseo
Jasmin est diseado como un simple ensamblador. Tiene una limpia sintaxis fcil de aprender con algunas campanas y silbatos. Donde sea posible, Jasmin adopta una asignacin uno a uno entre la sintaxis y las convenciones seguidas por los archivos de clase Java. Por ejemplo, los nombres de paquetes en Jasmin se delimitan por el carcter '/' (por ejemplo, "java / lang / String") que utiliza el formato de archivo de clase, en lugar de la '.' carcter (java.lang.String) utilizado en el lenguaje Java. El ensamblador Jasmin hace poco el procesamiento en tiempo de compilacin o la comprobacin del cdigo de entrada. Por ejemplo, no se comprueba que las clases, debe hacer referencia realmente existen, o que sus descriptores de tipo estn bien

formadas.Jasmin tambin carece de muchos de los que se encuentran en feautures montadores macro completos. Por ejemplo, no inline expresiones matemticas, realice sustituciones de variables o macros de apoyo. Por otro lado, el uso de Jasmin puede probar rpidamente casi todas las caractersticas de la mquina virtual de Java, incluidos los mtodos, campos, subrutinas controladores de excepciones, y as sucesivamente. La sintaxis Jasmin tambin es legible y compacto.

Ejecucin de Jasmin
El jasmin.jar archivo es un archivo JAR ejecutable que ejecuta Jasmin. Por ejemplo:

java-jar jasmin.jar myfile.j


o

java Jasmin myfile.j


(Si jasmin.jar ya est en la ruta de clases) Jasmin mira la . clase directiva contenida en el archivo myfile.j para decidir dnde colocar el archivo de clase de salida. As que si myfile.j Comienza con:

. Clase mipaquete / MyClass


entonces Jasmin colocar el archivo "MyClass.class" clase de salida en el subdirectorio "mipaquete" del directorio actual. Se crear el directorio mipaquete si no existe. Puede utilizar la opcin "-d" para decirle jasmin para colocar el resultado en un directorio alternativo. Por ejemplo,

java-jar jasmin.jar-d / tmp myfile.j


colocar el resultado en / tmp / mipaquete / MyClass.class. Por ltimo, puede utilizar la opcin "-g" para decirle Jasmin para incluir informacin de nmero de lnea (utilizado por los depuradores) en el archivo. Class resultante. Jasmin numerar los lneas en el archivo de origen Jasmin que las instrucciones de la JVM aparecen en. Luego, si se produce un error, se puede ver lo que la instruccin en la fuente Jasmin caus el error. Tenga en cuenta que al especificar "-g" hace que cualquier. Directivas de lnea dentro del archivo de Jasmin para ser ignorados.

Declaraciones
Archivos de origen Jasmin consiste en una secuencia de sentencias de nueva lnea separada.Hay tres tipos de declaracin:

directivas instrucciones etiquetas

Directivas y las instrucciones pueden tomar parmetros . Estos parmetros se colocan en

la misma lnea que la directiva o instruccin, separados por espacios. Directivas Declaraciones Directiva se utilizan para dar informacin Jasmin meta-nivel. Declaraciones Directiva consisten en un nombre de la directiva y, a continuacin, cero o ms parmetros separados por espacios, a continuacin, una nueva lnea. Todos los nombres de directivas comienzan con un "." carcter. Las directivas en Jasmin son:

. Atraparlo. Campo de clase. Final.. Implementos. Interfaz. Lmite. Line . Mtodo. Fuente. Super. Lanza. Var
Algunas declaraciones de directivos de ejemplo son:

. Pila lmite de 10 . Mtodo myMethod pblica () V . Clase Foo


Los parmetros utilizados por cada directiva se describen en ms detalle ms adelante en el documento. Instrucciones Una declaracin de la instruccin consiste en un nombre de la instruccin, cero o ms parmetros separados por espacios, y un salto de lnea. Jasmin utiliza la nemotcnica estndar para cdigos de operacin de JVM como nombres de instrucciones. Por ejemplo, aload_1, bipush y IINC son todos los nombres de instrucciones Jasmin. Estos son algunos ejemplos de declaraciones de instrucciones:

LDC "Hello World" IINC 1 -1 bipush 10


Ver Instrucciones de Jasmin para ms detalles sobre la sintaxis de las instrucciones de Jasmin. Las etiquetas Una declaracin de la etiqueta Jasmin consiste en un nombre seguido de un ':', y una nueva lnea. Por ejemplo:

Foo: Label:

Los nombres de etiquetas no pueden comenzar con un dgito numrico, y no puede contener ninguno de los caracteres especiales:

=:. "Usted no puede utilizar nombres de directivos o de instrucciones como etiquetas. Aparte de eso, hay pocas restricciones en los nombres de etiqueta. Por ejemplo, podra utilizar la etiqueta:

# _1:
Las etiquetas slo se pueden utilizar dentro de definiciones de mtodos. Los nombres son locales de ese mtodo.

El Jasmin Tokenizer
Jasmin tokenizes su flujo de entrada, la divisin de la corriente en tokens mediante la bsqueda de espacios en blanco (espacios, tabuladores y saltos de lnea). El sealizador busca:

directiva nombres nombres de instrucciones etiquetas comentarios escriba los nombres descriptor nombres de las clases nmeros y cadenas entre comillas etctera

Las reglas utilizadas por el sealizador se describen a continuacin: Comentarios Un comentario es un token que empieza con un ';' carcter, y termina con el carcter de nueva lnea al final de la lnea. Tenga en cuenta que el punto y coma debe ir precedido de un carcter de espacio en blanco (espacio, tabulador, nueva lnea), se ignoran y comas es decir embebidos. Por ejemplo,

abc, def
se trata como un nico token "abc; def", y

Ljava / lang / String;


es la seal "Ljava / lang / String;", mientras que

foo; baz ding

es el smbolo de "foo", seguido de un comentario "ding baz". Nmeros y Cadenas En Jasmin, se reconocen decimales y enteros formatos numricos slo simples. Flota en formato cientfico o exponente an no son compatibles. Cdigos de caracteres y octal no se admiten tampoco. Esto significa que usted puede tener:

1, 123, 0.25, 0.03, 0xA


pero no

1e-10, 'a', '\ u123'


Los textos entrecomillados son tambin muy bsico. La gama completa de secuencias de escape de barra diagonal inversa no se admiten, sin embargo, a pesar de "\ n" y "\ t" son. Nombres Genricos Los nombres de clase en Jasmin se deben escribir usando las convenciones de formato de archivo de clase Java, por lo que se convierte en java.lang.String java / lang / String. Tipo Descriptores Escriba la informacin tambin se escribe tal y como aparecen en los archivos de clase (por ejemplo, el descriptor que speficies un entero, [Ljava / lang / Autor; una gran variedad de temas, etc.) Mtodos Los nombres de mtodo se especifican mediante una nica manera, por ejemplo,

java / io / PrintStream / println (Ljava / lang / Cadena ;) V


es el mtodo llamado "println" en el java.io.PrintStream clase, que tiene el descriptor de tipo "(Ljava / lang / Cadena ;) V" (es decir, se toma una cadena y devuelve ningn resultado). En general, una especificacin de mtodo se form de tres partes: los personajes antes de la ltima '/' forman el nombre de la clase. Los caracteres entre el ltimo '/' y '(' son el nombre del mtodo. El resto de la cadena es el descriptor de tipo para el mtodo.

foo / baz / MyClass / myMethod (Ljava / lang / Cadena ;) V -----------------------------------| -------- | | | | descriptor mtodo de clase

Como otro ejemplo, tendra que llamar al mtodo Java:

mypackage.MyClass clase { int foo (Objeto a, int b []) {...} }


usando:

mipaquete invokevirtual / MyClass / foo (Ljava / lang / Object; [I) I


Los campos Los nombres de campo se especifican en Jasmin con dos fichas, que da el nombre y la clase del campo, el otro dando su descriptor. Por ejemplo:

mipaquete getstatic / MyClass / my_font Ljava / lang / Fuente;


obtiene el valor del campo llamado "my_font" en el mypackage.MyClass clase. El tipo de campo es "Ljava / lang / Fuente;" (es decir, un objeto Font).

ARCHIVOS
Archivos Jasmin empezar por dar informacin sobre la clase que se define en el archivo tales como el nombre de la clase, el nombre del archivo de fuente que se origin a partir de la clase, el nombre de la superclase, etc Normalmente, un archivo Jasmin comienza con las tres directivas:

. <source-file> Fuente . Clase <access-spec> <class-name> . Sper <class-name>


Por ejemplo, el archivo de definicin de MyClass podra empezar con las Directivas:

. MyClass.j fuente . Class MyClass pblica . Sper java / lang / Object


. Directiva fuente La directiva de origen. Es opcional. En l se especifica el valor del atributo "SourceFile" para el archivo de clase. (Esto es utilizado por Java para imprimir informacin de depuracin si algo sale mal en uno de los mtodos de la clase). Si ha generado el Jasmin archivo de forma automtica (por ejemplo, como resultado de la compilacin de un archivo escrito en otra sintaxis) se debe utilizar la directiva de origen. Decirle a Java el nombre del archivo de origen.Tenga en cuenta que el nombre del archivo fuente no debe incluir ningn nombre de ruta.Utilice "foo.src", pero no "/ home / user / foo.src".

Si no se da. Directiva de origen, el nombre del archivo de Jasmin est compilando su lugar se utiliza como atributo SourceFile lugar. . clase y directivas. sper La. Clase y. Sper Directiva decir la JVM el nombre de esta clase y su superclase. Estas directivas toman parmetros de la siguiente manera: <class-name> es el nombre completo de la clase, incluyendo los nombres de los paquetes. Por ejemplo, foo / baz / MyClass. <access-spec> define los permisos de acceso y otros atributos de la clase. Esta es una lista de cero o ms de las siguientes palabras: pblica, final, sper, interfaz abstracta . Directiva interfaz Tenga en cuenta que, en lugar de utilizar la directiva. Clase, se puede utilizar como alternativa el. Interfaz directiva. Esto tiene la misma sintaxis que la. Directiva clase, pero indica que el archivo Jasmin est definiendo una interfaz Java. por ejemplo,

. Interfaz foo pblica


. Directiva implementos Despus de. Origen. Clase y. Sper, puede enumerar las interfaces implementadas por la clase que se est definiendo, mediante. Directiva implementos. . La sintaxis de los implementos es:

. Implementos <class-name>
donde <class-name> tiene el mismo formato que se utiliz por. clase y. sper. Por ejemplo:

. . . .

Clase foo Sper java / lang / Object Implementa comestibles Implementa java / lang / Throwable

Definiciones de campo
Despus de la informacin de encabezado, la siguiente seccin del archivo de Jasmin es una lista de definiciones de campo. Un campo se define mediante la directiva de campo.:

. Campo <access-spec> <field-name> <descriptor> [= <valor>]

donde: <access-spec> es una de las palabras clave: pblico, privado, protegido, esttica, final, voltil, transitorio <field-name> es el nombre del campo. <descriptor> es su descriptor de tipo. <valor> es un entero, una cadena entre comillas o un nmero decimal, indica el valor inicial del campo (para campos finales). Por ejemplo, la definicin del campo de Java:

int foo pblico;


se convierte en

. Campo foo pblica I


mientras que la constante:

public static float PI final = 3,14;


se convierte en

. Campo PI public static final F = 3,14

Definiciones de mtodos
Despus de enumerar los campos de la clase, el resto del archivo Jasmin enumera los mtodos definidos por la clase. Un mtodo se define utilizando la forma bsica:

. Mtodo <access-spec> <method-spec> <sentencias> . Fin del mtodo


donde: <access-spec> es una de las palabras clave: public, private, protected, esttico, final, sincronizada, nativo, abstracto <method-spec> es el nombre y descriptor de tipo del mtodo. <sentencias> es el cdigo que define el cuerpo del mtodo.

Definiciones de mtodos no se pueden anidar. Adems, Jasmin no inserta una instruccin implcita "retorno" al final de un mtodo. Es hasta usted para asegurarse de que sus mtodos devuelven limpiamente. De modo que el mtodo ms bsico Jasmin es algo as como:

. Mtodo foo () V volver; deben proporcionarnos una declaracin de retorno . Fin del mtodo
Directivas Mtodo Las siguientes directivas slo se pueden utilizar dentro de las definiciones de mtodo:

. Lmite de la pila <entero>


Establece el tamao mximo de la pila de operandos requeridos por el mtodo.

. Lugareos lmite <Integer>


Establece el nmero de variables locales requeridos por el mtodo.

. Lnea <entero>
Esto se utiliza para etiquetar la posterior instruccin (s) con un nmero de lnea.Depuradores utilizan esta informacin, junto con el nombre del archivo de origen (vase. Fuente arriba) para mostrar en qu lnea en un mtodo las cosas iban mal. Si va a generar archivos Jasmin compilando un archivo de origen, esta directiva permite indicar qu lnea nmeros en el archivo de origen produce corrosponding instrucciones Jasmin. Por ejemplo:

. Mtodo foo () V . Lnea 5 bipush 10 / / estas instrucciones generadas a partir de la lnea 5 istore_2 / / del archivo de origen. . Lnea 6 ... . Var <nmero-var> <name> <descriptor> de <label1> a <label2>
La. Directiva var se utiliza para definir el nombre, descriptor de tipo y el alcance de un nmero variable local. Esta informacin es utilizada por depuradores para que puedan ser ms tiles cuando se imprimen los valores de las variables locales (en vez de imprimir slo un nmero variable local, el depurador en realidad puede imprimir el nombre de la variable). Por ejemplo:

. Mtodo foo () V . lugareos lmite 1 ; Declarar la variable 0 como un "int cuenta;" ; Cuyo mbito de aplicacin es el cdigo entre Label1 y Label2 ; . Var 0 es el Conde I de Label1 a Label2 Label1: bipush 10 istore_0

Label2: retorno . Fin del mtodo . Lanza <classname>


Indica que este mtodo puede lanzar excepciones del tipo indicado por <classname>. por ejemplo,

. Tiros java / io / IOException


Esta informacin no es requerida por los sistemas de ejecucin de Java, pero es utilizado por el compilador Java para comprobar que los mtodos de captura o bien excepciones que pueden causar, o declarar que las tiran.

. Coger <classname> de <label1> a <label2> usando <label3>


Anexa un registro al final de la tabla de excepciones para el mtodo. La entrada indica que cuando se produce una excepcin, que es una instancia de <classname> o una de sus subclases mientras ejecuta el cdigo entre <label1> y <label2>, entonces el sistema de ejecucin debe saltar a <label3>. por ejemplo,

. Java captura / io / IOException de L1 a L2 usando IO_Handler


Si classname es la palabra clave "todos", luego excepciones de ninguna clase son capturados por el manejador. Mtodos abstractos Para declarar un mtodo abstracto, escribir un mtodo sin cuerpo. por ejemplo,

. Mtodo myAbstract abstracto () V . Fin del mtodo


tenga en cuenta que los mtodos abstractos pueden tener. lanza directivas, por ejemplo,

. Mtodo abstracto anotherAbstract () V . Tiros java / io / IOException . Fin del mtodo

Instrucciones
Instrucciones JVM se colocan entre el mtodo. y . fin del mtodo directivas.Instrucciones VM pueden tomar cero o ms parmetros, dependiendo de el tipo de instruccin utilizado. Algunas instrucciones de ejemplo se muestran a continuacin:

IINC 1 -3; decrementar variable local 1 por 3 bipush 10; empujar el entero 10 en la pila pop; quitar el elemento superior de la pila.

Introduccin

Este documento muestra la sintaxis y los tipos de parmetros requeridos por cada instruccin Java VM en Jasmin. Tambin muestra breves ejemplos ilustrativos. Consulte la gua del usuario Jasmin para una descripcin de otros aspectos de la sintaxis Jasmin.

Instrucciones de variables locales


Las siguientes instrucciones utilizan variables locales: ret <var-num> aload <var-num> astore <var-num> Dload <var-num> dstore <var-num> fload <var-num> fstore <var-num> <var-num> iload <var-num> istore lload <var-num> lstore <var-num> por ejemplo: aload 1; empuje variable local 1 en la pila ret 2; volver a la direccin que tuvo lugar en la variable local 2

Las instrucciones del bipush, sipush y IINC


Las instrucciones bipush y sipush toman un entero como parmetro: bipush <int> sipush <int> por ejemplo: bipush 100; empuje 100 en la pila La instruccin IINC toma dos parmetros enteros: IINC <var-num> <cantidad> por ejemplo: IINC 3 -10; restar 10 de variable local 3

Instrucciones de salto
Las siguientes instrucciones tienen una etiqueta como parmetro: Ir <label> goto_w <label> if_acmpeq <label> if_acmpne <label> if_icmpeq <label> if_icmpge <label>

if_icmpgt <label> if_icmple <label> if_icmplt <label> if_icmpne <label> ifeq <label> IFGE <label> ifgt <label> IFLE <label> iflt <label> ifne <label> ifnonnull <label> IFNULL <label> jsr <label> jsr_w <label> Por ejemplo:

Label1: Ir a Label1; saltar al cdigo en Label1 ; (Un bucle infinito!)

Operaciones de clase y objeto


Las siguientes instrucciones requieren un nombre de clase como un parmetro: anewarray <clase> checkcast <clase> instanceof <clase> nueva <clase> Por ejemplo: nuevo java / lang / String; crear un nuevo objeto String

Invocacin Mtodo
Las siguientes instrucciones se utilizan para invocar mtodos: invokenonvirtual <method-spec> <method-spec> invokestatic invokevirtual <method-spec> por ejemplo:

; Invoca java.io.PrintStream.println (String); java invokevirtual / io / PrintStream / println (Ljava / lang / Cadena ;) V Una especificacin de mtodo se form de tres partes: los personajes antes de la ltima '/' forman el nombre de la clase. Los caracteres entre el ltimo '/' y '(' son el nombre del mtodo. El resto de la cadena es el descriptor. foo / baz / MyClass / myMethod (Ljava / lang / Cadena ;) V

-----------------------------------| -------- | | | | descriptor mtodo de clase Un caso especial es invokeinterface, que toma un <method-spec> y un entero que indica el nmero de argumentos tiene el mtodo: invokeinterface <method-spec> <num-args> por ejemplo: foo invokeinterface / Baz / myMethod (I) V 1

Instrucciones de manipulacin de Campo


Las cuatro instrucciones GetField, getstatic, putfield y putstatic tienen la forma: GetField <field-spec> <descriptor> getstatic <field-spec> <descriptor> putfield <field-spec> <descriptor> putstatic <field-spec> <descriptor> por ejemplo: ; Obtener java.lang.System.out, que es un PrintStream java getstatic / lang / Sistema / out Ljava / io / PrintStream; <field-spec> se compone de dos partes, un nombre de clase y un nombre de campo. El nombre de clase son todos los personajes de la <field-spec> hasta el ltimo carcter '/', y el nombre del campo es el resto de los personajes despus de la ltima '/'. Por ejemplo: foo / baz / AnotherClass / anotherFunField - Nombre de la clase -------- Campo <descriptor> es el descriptor de tipo Java del campo. Por ejemplo: Ljava / io / PrintStream;

La instruccin newArray
La instruccin newArray es seguido por el tipo de la matriz, newArray <array-type> por ejemplo: newArray int newArray corta float newArray etctera

La instruccin multianewarray
La instruccin multianewarray toma dos parmetros, el descriptor de tipo para la matriz y el nmero de dimensiones de asignar: multianewarray <array-descriptor> <num-dimensions> por ejemplo:

multianewarray [[[I 2

Las instrucciones de los PMA y ldc_w


Las instrucciones de los PMA y ldc_w son seguidos por una constante: LDC <constante> ldc_w <constante> <constante> es un entero, un nmero de punto flotante, o una cadena entre comillas.Por ejemplo: LDC 1.2; empujar un flotador LDC 10; empujar un int LDC "Hola Mundo"; empujar una cuerda ldc_w 3.141592654; empuje PI como un doble

La instruccin lookupswitch
La instruccin lookupswitch tiene la sintaxis: <lookupswitch> :: = lookupswitch <int1>: <label1> <int2>: <label2> ... default: <default-label> Por ejemplo: ; Si el int en la pila es 3, saltar a Label1. ; Si es 5, saltar a Label2. ; Saltar lo contrario a DefaultLabel. lookupswitch 3: Label1 5: Label2 default: DefaultLabel Label1: ... Tiene 3 Label2: ... Consigui 5 DefaultLabel: ... Tiene algo ms

La instruccin tableswitch
La instruccin tableswitch tiene la sintaxis: <tableswitch> :: = tableswitch <Bajo> <label1>

<label2> ... default: <default-label> Por ejemplo: ; Si el int en la pila es 0, salta a Label1. ; Si es 1, salta a Label2. ; Saltar lo contrario a DefaultLabel. tableswitch 0 Label1 Label2 default: DefaultLabel Label1: ... Tengo 0 Label2: ... Consigui 1 DefaultLabel: ... Tiene algo ms

Ningn parmetro
Las instrucciones siguientes (la mayora) no toman parmetros: aaload aastore aconst_null aload_0 aload_1 aload_2 aload_3 areturn arraylength astore_0 astore_1 astore_2 astore_3 athrow baload bastore breakpoint caload castore d2f d2i d2l dadd daload dastore dcmpg dcmpl dconst_0 dconst_1 DDIV dload_0 dload_1 dload_2 dload_3 dmul DNeg drem dreturn dstore_0 dstore_1 dstore_2 dstore_3 dsub dup dup2 dup2_x1 dup2_x2 dup_x1 dup_x2 F2D f2i F2L fadd faload fastore fcmpg fcmpl fconst_0 fconst_1 fconst_2 fdiv fload_0 fload_1 fload_2 fload_3 fmul fneg frem freturn fstore_0 fstore_1 fstore_2 fstore_3 fsub i2d i2F I2L iadd iaload iand iastore iconst_0 iconst_1 iconst_2 iconst_3 iconst_4 iconst_5 iconst_m1 idiv iload_0 iload_1 iload_2 iload_3 imul INEG int2byte int2char int2short ior irem IRETURN ISHL SIDH istore_0 istore_1 istore_2 istore_3 isub iushr ixor l2d L2F l2i tierra laload ladd lastore LCMP lconst_0 lconst_1 ldiv lload_0 lload_1 lload_2 lload_3 lmul LNEG lor LREM lReturn LSHL LSHR lstore_0 lstore_1 lstore_2 lstore_3 lsub lushr lxor MonitorEnter MonitorExit nop pop2 pop retorno saload intercambio sastore por ejemplo: pop; quitar el elemento superior de la pila iconst_1; empujar 1 en la pila permuta; intercambiar los dos primeros elementos de la pila

Acerca de este documento


Esta gua describe las reglas y sintaxis utilizadas en JasminXT, la extensin de la lengua Jasmin en la versin 2.0. Si eres nuevo en el Jasmin, debe referirse a la gua del usuario Jasmin. Tenga en cuenta que este documento no explica la propia mquina virtual de Java, o darle a las notas

de sintaxis para cada instruccin conocido por Jasmin. Consulte la especificacin de la mquina virtual de Java para obtener ms informacin sobre la JVM.

Por qu un nuevo lenguaje de Jasmin?


Jasmin es el lenguaje ensamblador Java estndar de facto. Es til para explorar las posibilidades de bytecode, pero no ofrece un verdadero control de bajo nivel sobre la salida producida. Por lo tanto, no es adecuado para generar casos de prueba para mquinas virtuales o verificador de cdigo de bytes. Esta nueva versin del lenguaje de Jasmin, llamado JasminXT, proporciona directivas opcionales y otras actualizaciones de sintaxis para tener un mayor control sobre la salida y seguir con los ltimos cambios del lenguaje Java. JasminXT se ha definido para el proyecto tinapoc. El propsito del proyecto tinapoc es crear un conjunto de herramientas de ingeniera inversa fiable de Java. Ver la pgina tinapoc para ms informacin:http://tinapoc.sourceforge.net/

Resumen de las nuevas caractersticas


Desde 2.4:

aceptar 'd'sufijo en flotacin constante (sin yeso intento de flotar) redisear a la creacin de la clase compilador dinmico algunas correcciones cosmticas Desde 2.3:

aadido "-alias wide' a las instrucciones de dos cara Desde 2.2:

algunas correcciones de errores en el diagnstico aadido soporte para el atributo StackMapTable (directiva. pila) se describe en jdk1.6 aadido "uso" de palabras clave a la directiva. apile aadido soporte para la secuencia de escape \ uXXXX en los nombres (al igual que en la de Java) ldc_w instruccin siempre genera amplio ndice sintaxis cambiadas de los identificadores no estndar (o palabras clave sobrecargados), ahora Hasto ser signgle cotizan y no pueden estar vacos Desde 2.1:

algunas correcciones de errores con la cadena y el nmero de anlisis aadido soporte para secuencias de escape \ uxxxx aadido soporte para las banderas de acceso ACC_STRICT (fpstrict) y ACC_SYNTHETIC (sinttico) firmas agregadas para el apoyo local de las variables se permiten varias directivas de depuracin. aade la instruccin invokedynamic mejorado la sintaxis del atributo StackMap (. apile Directiva) nueva de lnea de comandos opcin-e para soportar diferentes codificaciones aadido soporte para identificadores no estndar entre comillas dobles campos ahora se pueden definir en varias lneas nuevas directrices se han incluido:. interior, atribuir, en desuso anotacin... Desde 2.0:

uso de compensaciones para los objetivos de las ramificaciones, manipuladores de visibilidad y de excepcin de variables locales. Los desplazamientos pueden ser ya sea absoluta o relativa:
Ir a 12; absoluta offset: ir al cdigo de bytes en el desplazamiento 12 Ir a 5; desplazamiento relativo: ir hacia adelante 12 bytes Ir a -8; desplazamiento relativo: ir 8 bytes hacia atrs

los siguientes indicadores de acceso son ahora soportados: ACC_ENUM, ACC_ANNOTATION, ACC_BRIDGE y ACC_VARARGS . la directiva de cdigo de bytes se ha aadido, para establecer la versin de cdigo de bytes en el archivo de clase. Ejemplo:
. Bytecode 49.0

ahora es posible aadir un atributo SourceDebugExtension a la clase con la siguiente directiva:


. Debug "alguna cadena aqu"

lo mismo para el atributo EnclosingMethod:


. Mtodo "some / paquete / Foo / algunMetodo (I) V" encerrando

apoyo para el atributo Firma (en las clases, mtodos y campos):


. Firma "Firma () " . Campo myField Ljava / lang / String; firma "Firma () "

apoyo para el atributo StackMap, utilizando el. Directiva de pila en una definicin de mtodo

ahora es posible dar el desplazamiento de una instruccin antes de la instruccin en s, como en el siguiente fragmento de cdigo:
0: 1: 4: 5: aload_0 java invokespecial / lang / Objeto /() V aload_0 3,14159 ldc2_w

Formato del archivo JasminXT


Esta nueva versin es una extensin del lenguaje de Jasmin existente, por lo tanto, los archivos Jasmin viejas todava deben compilar correctamente con las nuevas versiones de Jasmin. JasminXT es apoyado por Jasmin 2.0 o superior. Cambios en Jasmin 2.4 estn en negrita. En el resto de este documento, las palabras entre '[' y ']' son opcionales. La sintaxis de un archivo JasminXT es el siguiente:
<jas_file> { <jasmin_header> [<field>] * [<mtodo>] * }

JasminXT Header
<jasmin_header> { [. <xy> Bytecode] [. <Archivo Origen> fuente] <class_spec> <super_spec> <implements> [. Firma "<signature>"] [. Encerrando mtodo <method_name>] [. Debug "<debug_source_extension>"] * [. Clase interna [<access>] [<nombre>] [<classname> interno] [exterior <nombre>]] * [. Interfaz interna [<access>] [<nombre>] [<classname> interno] [exterior <nombre>]] * } ejemplo: . Bytecode 49.0 . Hello.j fuente . Clase hola . Sper java / lang / Object . Firma "Firma <my::own> ()" . Encerrando mtodo foo / bar / Whatever / algunMetodo ()

. Debug "esta cadena se incluir en el atributo SourceDebugExtension." Debug "esta cadena tambin"

La. Bytecode Directiva establece la versin del cdigo de bytes en el archivo de clase. La. Directiva sobre la firma, cuando se utiliza en el encabezado del archivo de Jasmin, establece el atributo de Firma para la clase (el argumento es una cadena entre comillas dobles) El adjuntando Directiva. Establece el atributo EnclosingMethod para la clase. El argumento es una supone que es un nombre de mtodo, pero puede ser cualquier cadena entre comillas dobles. La. Directiva establece el atributo debug SourceDebugExtension para la clase (el argumento es tambin una cadena entre comillas dobles)

JasminXT Clase Super Class e Interfaces Definicin


<class_spec> { . Clase <access_spec> <class_name> }

donde <access_spec> es cualquier nmero de palabras tomadas de esta lista: public, private, protected, esttico, final, sincronizada, nativo, final, sper, interfaz, abstracto, anotacin, enum, puente / voltil, transitoria / VarArgs

y <class_name> es la forma interior plenamente cualificado de la clase, como mi / paquete / MyClass

<super_spec> { . Sper <class_name> } <implements> { . Implementa <class_name> * }

La. Super y. Implementa las directivas no se han modificado en JasminXT La. Directiva implementos se puede repetir con el fin de implementar varias interfaces

JasminXT Campo Definicin


<field> { . Campo <access_spec> <nombre_campo> <descriptor> [firma <signature>] [= <valor>] | . Campo <access_spec> <nombre_campo> <descriptor> [firma <signature>] [= <valor>] [<field_attribute>] * . Terreno extremo (...) }

Si est presente, el atributo de firma se encuentra en el archivo de clase para este campo con la citada cadena dada como argumento.
<field_attribute> { . Desuso |. Atribuir <nombre_archivo> <nombre> |. Firma <signature> |. Anotacin (...) }

(Ver ms abajo para la definicin de la anotacin y las directivas de atributos)

ejemplos:
. Campo enum myField Ljava / lang / String; firma "Firma <my::own> ()" = "val" . Campo hello_string esttica Ljava / lang / String; . Firma "mySignature" . Desuso . Terreno extremo

Mtodo JasminXT Definicin


El formato general de una definicin de mtodo no ha cambiado en JasminXT.
<mtodo> { . Mtodo <access_spec> <method_name> <descriptor> <instruccin> * . Fin del mtodo }

Declaraciones Mtodo JasminXT


<instruccin> { . Lmite de la pila <entero> |. Lugareos lmite <Integer> |. Lnea <entero> |. Var <var_number> es <nombre_var> <descriptor> [firma <sign>] desde <label1> a <label2> |. Var <var_number> es <nombre_var> <descriptor> [firma <sign>] desde <offset1> a <offset2> |. Lanza <classname> |. Coger <classname> de <label1> a <label2> usando <label3> |. Coger <classname> de <offset1> a <offset2> usando <offset3> |. Firma "<signature>" |. Pila [Offset {<PC> | <label>}] [Lugareos <verification_type> [<verification_arg>]] (...) [Pila <verification_type> [<verification_arg>]] (...) . Pila final |. Apile uso [n] los locales (...) . Pila final | <instruction> [<instruction_args>] | <Label>: |. Desuso | <generic>; Ver ms abajo para el uso de atributos genricos }

En Jasmin XT ahora puede usar las compensaciones en lugar de etiquetas para las definiciones de las variables locales y para los manipuladores de las definiciones de excepcin. La firma. Establece el atributo de firma para este mtodo con la citada cadena dada. Ahora tambin puede definir StackMap (o StackMapTable) atributos mediante. Directiva pila. <PC> es una posicin de la matriz de bytecode local. <verification_type> es una de las siguientes palabras clave: Inicio, Integer, Float, largo, doble, Null, UninitializedThis, objeto o no inicializado. Objeto realiza un <classname> como un parmetro. Uninitialized toma un entero o una etiqueta como parmetro. Tambin, jasmin permite utilizar la notacin "corto". El '. Apile utiliza [n] lugareos directriz podra resultar en primera valores <n> copia de anteriores. Pila Directiva. Si <n> se omite, se copian todos los valores.

NOTA: Si la versin de cdigo de bytes es de 50 o por encima de jasmin genera atributo StackMapTable de acuerdo con las especificaciones de la nueva edicin 'ClassFile Formato'. Si la versin de cdigo de bytes es de 49 o por debajo de jasmin generar atributo StakMap de conformidad con la especificacin CLDC. ejemplos:
. Pila desplazamiento 16 lugareos Null lugareos Top lugareos Objeto asignacin pila no inicializado en 12 . Pila final . Pila ; Desplazamiento no se especifica, el desplazamiento del cdigo de operacin actual se utilizar lugareos Null lugareos Top lugareos Objeto asignacin apilar sin inicializar label0 . Pila final

Esta declaracin define un solo mapa stack frame. Todos los marcos del mapa pila definidos en un mtodo se agregan y forman el atributo StackMap para el mtodo. El ltimo ejemplo mi se escribi en el corto notacin:
uso. pila lugareos apilar sin inicializar label0 . Pila final

Instrucciones JasminXT
<instruction> { [<PC>:] <opcode> [<instruction_args>] }

El principal cambio en JasminXT es que ahora es posible poner el desplazamiento de la instruccin antes de que el cdigo de operacin (la <PC>: declaracin). El PC se procesa como una etiqueta, por lo tanto usted puede virtualmente poner cualquier nmero que el pc pero no va a cambiar el PC real del bytecode. Otra actualizacin es que ahora es posible utilizar desplazamientos (tanto relativos y absolutos) como objetivos de las ramificaciones en lugar de etiquetas. El desplazamiento se considera que es relativa si primero comienza por '$ +' o '$ -'.
ejemplo:
Goto n; absoluta offset: ir al bytecode etiquetada n

Goto $ + n; desplazamiento relativo: ir n bytes hacia delante (de la compensacin de este Goto) goto-$ n; relativa Offset: ir n bytes hacia atrs

Si algo no se ha documentado aqu, significa que no ha cambiado, por lo que an se puede referir a la Jasmingua del usuario Agregado '_w' aliase a [adfli] -load/store, IINC e instrucciones RET (por ejemplo aload - aload_w).Usando sufijo '_w' garantiza en todo tipo de generacin de cdigo de bytes

Atributos genricos
Atributos genricos son compatibles con las definiciones de campo / / mtodo de la clase de la siguiente manera:
<generic> = { . Atribuir <nombre_archivo> <nombre> }

<nombre> es el nombre del atributo y <nombre_archivo> es el nombre del archivo que contiene los datos del atributo (entre comillas). Si el atributo genrico est en el cuerpo del mtodo, la lgica siguiente se utiliza: si se trata de la primera instruccin en el mtodo, se aadir el atributo como un atributo de mtodo, de lo contrario se puede aadir como un atributo de cdigo.

Anotaciones
Gracias a Iouri Kharon de desarrollo del presente. He aqu sus explicaciones:

Se ha aadido una nueva directiva. Anotacin para crear el AnnotationDefault, RuntimeVisibleAnnotation, RuntimeInvisibleAnnotation, RuntimeVisibeParameterAnnotation, atributos RuntimeInvisibleParameterAnnotation. . Los argumentos Directiva se verific que tienen valores vlidos y firmas correctas . Complejo anotaciones (anidados) son compatibles, as como matrices de ellos El formato genrico es:
<annotation> = { . Anotacin <classname> visible |. Anotacin <classname> invisible> |. Anotacin visibleparam <paramnum> <classname> |. Anotacin invisibleparam <paramnum> <classname> |. Default anotacin ........ . Anotacin final Formato de campo (excepto AnnotationDefault): <nombre> <signchar> = <valor> * |. <nombre> @ = Anotacin ........ . Anotacin final

AnnotationDefault admite slo un campo y el no se utiliza la etiqueta. Anotaciones anidadas deben estar con eletiquetar y puede tener cualquier nmero de campos. Adems, 'la anotacin vaca "Est prohibido que AnnotationDefault. Por ltimo, AnnotationDefault se puede utilizar una sola vez por cada mtodo. Otros tipos de anotaciones se pueden utilizar muchas veces y acumular informacin. http://jasmin.sourceforge.net/xt.html

You might also like