Este es el comando xa que se puede ejecutar en el proveedor de alojamiento gratuito de OnWorks utilizando una de nuestras múltiples estaciones de trabajo en línea gratuitas, como Ubuntu Online, Fedora Online, emulador en línea de Windows o emulador en línea de MAC OS.
PROGRAMA:
NOMBRE
xa - Ensamblador cruzado 6502 / R65C02 / 65816
SINOPSIS
xa [OPCIÓN] ... ARCHIVO
DESCRIPCIÓN
xa es un ensamblador cruzado de múltiples pasadas para los procesadores de 8 bits de la serie 6502 (como
6502, 65C02, 6504, 6507, 6510, 7501, 8500, 8501 y 8502), Rockwell R65C02 y
el procesador 16 de 65816 bits. Para obtener una descripción de la sintaxis, consulte ENSAMBLADOR SINTAXIS más lejos en
esta página del manual.
OPCIONES
-v Salida detallada.
-x Usar comportamiento de nombre de archivo antiguo (anulaciones -o, -e y -l). Esta opción es ahora
obsoleto.
-C Sin códigos de operación CMOS (el valor predeterminado es permitir códigos de operación R65C02)
-W No 65816 opcodes (predeterminado).
-w Permita 65816 códigos de operación.
-B Mostrar líneas con bloque abierto / cerrado (ver PSEUDO-OPS).
-c Producir archivos de objeto o65 en lugar de archivos ejecutables (no se realiza vinculación); archivos
puede contener referencias indefinidas.
-o nombre de archivo
Establecer el nombre del archivo de salida. El valor predeterminado es a.o65; usar el nombre de archivo especial - para salir a
salida estándar.
-e nombre de archivo
Establecer el nombre del archivo de registro de errores, el valor predeterminado es ninguno.
-l nombre de archivo
Establecer el nombre de archivo de la lista de etiquetas, el valor predeterminado es ninguno. Esta es la tabla de símbolos y se puede utilizar
por desmontadores como dxa(1) para reconstruir la fuente.
-r Agregue una lista de referencias cruzadas al etiquetador (requiere -l).
-M Permita que aparezcan dos puntos en los comentarios; para compatibilidad con MASM. Esto no afecta
interpretación de dos puntos en otros lugares.
-R Inicie el ensamblador en modo de reubicación.
-Etiqueta
Define Etiqueta como una etiqueta absoluta (pero indefinida) incluso cuando se vincula.
-¿B? addr
Establecer base de segmento para segmento ? a la dirección addr. ? debe ser t, d, boz para
texto, datos, bss o segmentos cero, respectivamente.
-A addr
Haga que el segmento de texto comience en una dirección de modo que cuando el archivo comience en la dirección
addr, la reubicación no es necesaria. Anulaciones -bt; otros segmentos todavía tienen que ser
cuidado con -b.
-G Suprime la lista de globales exportados.
-DEF = TEXTO
Defina una macro de preprocesador en la línea de comando (consulte PREPROCESADOR).
-I dir Agregar directorio dir a la ruta de inclusión (antes ENTRADA XAIN; ver MEDIO AMBIENTE).
-O charset
Defina el juego de caracteres de salida para las cadenas de caracteres. Actualmente soportados son ASCII
(predeterminado), PETSCII (Commodore ASCII), PETSCREEN (códigos de pantalla Commodore) y HIGH
(establecer bit alto en todos los caracteres).
-¿pag? Establezca el carácter del preprocesador alternativo en ?. Esto es útil cuando desea
use cpp(1) y el preprocesador integrado al mismo tiempo (consulte PREPROCESADOR).
Es posible que sea necesario citar los caracteres para su caparazón (ejemplo: -p '~' ).
--ayuda Mostrar resumen de opciones.
--versión
Muestra la versión del programa.
ENSAMBLADOR SINTAXIS
Una introducción a la programación en lenguaje ensamblador 6502 y los mnemónicos está más allá del alcance de
esta página del manual. Lo invitamos a investigar algunos de los excelentes libros sobre el
sujeto; un título útil es "Lenguaje de máquina para principiantes" de Richard Mansfield
(COMPUTE!), Que cubre los sistemas Atari, Commodore y Apple de 8 bits, y está ampliamente disponible
en el mercado usado.
xa admite tanto los códigos de operación NMOS 6502 estándar como los códigos de operación Rockwell CMOS utilizados
en el 65C02 (R65C02). Con el -w opción, xa también aceptará códigos de operación para el 65816. NMOS
6502 códigos de operación indocumentados no son compatibles intencionalmente y deben ingresarse manualmente
usando el .byte pseudo-op (ver PSEUDO-OPS). Debido a conflictos entre el R65C02 y el 65816
conjuntos de instrucciones e instrucciones no documentadas en el NMOS 6502, se desaconseja su uso.
En general, un software de chat en vivo es ideal para todas las organizaciones, ya que permite conocer de cerca a la audiencia, identificar los problemas que están experimentando y resolverlos para aumentar la lealtad a la marca, la credibilidad y las valoraciones de satisfacción. xa acepta el formato de ensamblador 6502 más o menos estándar, popularizado por
MASM y TurboAssembler. Los valores y direcciones se pueden expresar como literales o como
expresiones; esto es,
123 valor decimal
$234 valor hexadecimal
Y 123 octal
010110% binario
* valor actual del contador del programa
El valor ASCII de cualquier carácter entre comillas se inserta directamente en el texto del programa.
(ejemplo: "A" inserta el byte "A" en el flujo de salida); ver también el PSEUDO-OPS
sección. Esto se ve afectado por el juego de caracteres seleccionado actualmente, si lo hay.
Etiquetas definir ubicaciones dentro del texto del programa, al igual que en otros ensambladores de múltiples pasadas. A
la etiqueta está definida por cualquier cosa que no sea un código de operación; por ejemplo, una línea como
label1 lda #0
define label1 para ser la ubicación actual del contador de programa (por lo tanto, la dirección del
LDA código de operación). Una etiqueta se puede definir explícitamente asignándole el valor de una expresión,
como
label2 = $ d000
que define label2 para ser la dirección $ d000, es decir, el inicio del registro VIC-II
bloquear en computadoras Commodore 64. El contador de programas * se considera un tipo especial
de etiqueta, y se puede asignar con declaraciones como
* = $ c000
que establece el contador del programa en la posición decimal 49152. Con la excepción del
contador de programa, las etiquetas no se pueden asignar varias veces. Para declarar explícitamente
redefinición de una etiqueta, coloque un - (guión) antes de ella, por ejemplo,
-etiqueta2 = $ d020
que establece label2 al registro de color de borde de Commodore 64. El alcance de una etiqueta es
afectado por el bloque en el que reside (ver PSEUDO-OPS para instrucciones de bloque). Una etiqueta
también se puede especificar de forma rígida con el -L opción de línea de comando.
Para aquellas instrucciones donde el acumulador es el argumento implícito (como asl y lsr;
Cª y dic en R65C02; etc.), el idioma de especificar explícitamente el acumulador con a is
innecesario ya que se seleccionará la forma adecuada si no hay un argumento explícito. De hecho,
para mantener la coherencia con la entrega de la etiqueta, si hay una etiqueta llamada a, esto en realidad
generar código que haga referencia a esa etiqueta como una ubicación de memoria y no como el acumulador.
De lo contrario, el ensamblador se quejará.
Las etiquetas y los códigos de operación pueden tardar expresiones como sus argumentos para permitir valores calculados, y
ellos mismos pueden hacer referencia a otras etiquetas y / o al contador del programa. Una expresión como
lab1 + 1 (que opera sobre el valor actual de la etiqueta lab1 y lo incrementa en uno) puede
utilice los siguientes operandos, dados de mayor a menor prioridad:
* multiplicación (prioridad 10)
/ división de enteros (prioridad 10)
+ adición (prioridad 9)
- resta (9)
<< desplazar a la izquierda (8)
>> desplazar a la derecha (8)
>= => mayor o igual a (7)
< mayor que (7)
<= =< menor o igual a (7)
< menos de (7)
= igual a (6)
<> >< no es igual (6)
& Y (5) bit a bit
^ XOR bit a bit (4)
| bit a bit OR (3)
&& Y lógico (2)
|| OR lógico (1)
Los paréntesis son válidos. Al redefinir una etiqueta, combinar operadores aritméticos o bit a bit
con el operador = (igual a) como += y así sucesivamente son válidos, por ejemplo,
-redeflabel += (etiqueta12 / 4)
Normalmente, xa intenta determinar el valor del operando y (cuando se refiere a un
ubicación de la memoria) utilice direccionamiento de página cero, 16 bits o (para 65816) 24 bits cuando corresponda
y donde sea compatible con el código de operación particular. Esto genera un código más pequeño y rápido, y
casi siempre es preferible.
No obstante, puede utilizar estos operadores de prefijo para forzar una interpretación particular del
operando. Los que generan un resultado de ocho bits también se pueden utilizar en el direccionamiento de 8 bits.
modos, como inmediato y página cero.
< bajo byte de expresión, p. ej., lda #
> alto byte de expresión
! en situaciones donde la expresión podría entenderse como un absoluto o
valor de página cero, no intente optimizar a un argumento de página cero para aquellos
códigos de operación que lo admiten (es decir, mantener una palabra de 16 bits)
@ renderizar como una cantidad de 24 bits para 65816 (debe especificar -w opción de línea de comandos). Este is
Requisitos a especificar any 24 bits ¡cantidad!
` forzar una mayor optimización, incluso si la longitud de la instrucción no se puede
determinado de forma fiable (ver NOTAS Y ERRORES)
Las expresiones pueden ocurrir como argumentos para códigos de operación o dentro del preprocesador (ver PREPROCESADOR
para la sintaxis). Por ejemplo,
lda etiqueta2 + 1
toma el valor en etiqueta2 + 1 (usando el valor de nuestra etiqueta anterior, esto sería $ d021), y
será ensamblado como $ anuncio $21 $ d0 al disco. Similar,
lda #
tomará los 8 bits más bajos de label2 (es decir, $ 20) y asígnelos al acumulador
(ensamblando la instrucción como $ a9 $20 al disco).
Los comentarios se especifican con un punto y coma (;), como
;esta is a comentario
También se pueden especificar en el estilo del lenguaje C, usando /* */ y // que son
entendido en el PREPROCESADOR nivel (qv).
Normalmente, los dos puntos (:) separan declaraciones, como
label4 lda # 0: sta $ d020
or
etiqueta2: lda #2
(observe el uso de dos puntos para especificar una etiqueta, similar a algunos otros ensambladores, que
xa también entiende con o sin los dos puntos). Esto también se aplica a los comentarios con punto y coma,
tal que
; a comentario: lda #0
se entiende como un comentario seguido de un código de operación. Para vencer esto, use el -M de línea de comandos
opción para permitir dos puntos dentro de los comentarios. Esto no se aplica a /* */ y // comentarios,
que se tratan en el nivel del preprocesador (qv).
PSEUDO-OPS
Pseudooperaciones son códigos de operación falsos utilizados por el ensamblador para denotar comandos meta o en línea.
Como la mayoría de los ensambladores, xa tiene un rico conjunto.
.byt valor1, valor2, valor3, ...
Especifica una cadena de bytes que se colocarán directamente en el objeto ensamblado. El
los argumentos pueden ser expresiones. Se puede especificar cualquier número de bytes.
asc "Texto 1" , "texto2", ...
Especifica una cadena de caracteres que se insertará en el objeto ensamblado.
Las cadenas se entienden de acuerdo con el juego de caracteres especificado actualmente; por
Por ejemplo, si se especifica ASCII, se mostrarán como ASCII, y si PETSCII es
especificado, se traducirán al equivalente Commodore ASCII equivalente.
Otros ASCII no estándar como ATASCII para computadoras Atari deben usar el ASCII
caracteres equivalentes; Se deben especificar los caracteres gráficos y de control.
usando explícitamente .byt para el carácter preciso que desea. Tenga en cuenta que al especificar
el argumento de un código de operación, asc no es necesario; el personaje citado puede simplemente
ser insertado (p. ej., lda #"A" ), y también se ve afectado por el juego de caracteres actual.
Se puede especificar cualquier número de cadenas de caracteres.
.byt y asc son sinónimos, por lo que puede mezclar cosas como .byt $43, 22, "a personaje
cuerda" y obtenga el resultado esperado. La cadena está sujeta al conjunto de caracteres actual,
pero los bytes restantes se insertan sin modificación.
.aasc "Texto 1" , "texto2", ...
Especifica una cadena de caracteres que es always representado en verdadero ASCII independientemente de
el juego de caracteres actual. Me gusta asc, es sinónimo de .byt.
.palabra valor1, valor2, valor3 ...
Especifica una cadena de palabras de 16 bits que se colocarán en el objeto ensamblado en 6502
formato little-endian (es decir, byte bajo / byte alto). Los argumentos pueden ser
Expresiones Se puede especificar cualquier número de palabras.
.dsb longitud, fillbyte
Especifica un bloque de datos; un total de de largo repeticiones de byte de relleno será insertado
en el objeto ensamblado. Por ejemplo, .dsb 5, $ 10 insertará cinco bytes, cada uno
siendo 16 decimal, en el objeto. Los argumentos pueden ser expresiones.
.bin desplazamiento, longitud, "nombre de archivo"
Inserta un archivo binario sin una interpretación adicional especificada por nombre de archivo obtenidos de
compensar compensar a la longitud de largo. Esto le permite insertar datos como un
archivo de objeto previamente ensamblado o una imagen u otra estructura de datos binarios,
en línea directamente en el objeto de este archivo. Si de largo es cero, entonces la longitud de
nombre de archivo, menos el desplazamiento, se utiliza en su lugar. Los argumentos pueden ser expresiones.
.( Abre un nuevo bloque para el alcance. Dentro de un bloque, todas las etiquetas definidas son locales a ese
bloque y cualquier sub-bloque, y salen del alcance tan pronto como el bloque circundante es
cerrado (es decir, de ámbito léxico). Todas las etiquetas definidas fuera del bloque siguen
visible dentro de él. Para declarar explícitamente una etiqueta global dentro de un bloque, preceda el
etiqueta con + o precederlo con & para declararlo dentro del nivel anterior solamente (o
globalmente si solo tiene un nivel de profundidad). Se permiten dieciséis niveles de alcance.
.) Cierra un bloque.
.como .Alabama .xs .SG
Solo relevante en el modo 65816 (con el -w opción especificada). Estas pseudo-operaciones establecen
qué tamaño de acumulador y registro X / Y deben usarse para instrucciones futuras; .como
y .xs establecer operandos de 8 bits para el acumulador y los registros de índice, respectivamente,
y .Alabama y .SG establecer operandos de 16 bits. Estas pseudo-operaciones a propósito no
automáticamente emitirá sep y reps instrucciones para establecer el ancho especificado en la CPU;
configure los bits del procesador como necesite o considere la posibilidad de construir una macro. .Alabama y .SG
generar errores si -w no se especifica
Las siguientes pseudooperaciones se aplican principalmente a objetos .o65 reubicables. Una discusión completa
del formato reubicable está fuera del alcance de esta página de manual, ya que actualmente es un formato
en flujo. La documentación sobre el formato v1.2 propuesto está en doc / fileformat.txt en la pestaña xa
directorio de instalación.
.text .datos .bss .cero
Estas pseudo-operaciones cambian entre los diferentes segmentos, siendo .text el código real
sección, .data es el segmento de datos, .bss es espacio de etiqueta no inicializado para
asignación y .zero es espacio de página cero sin inicializar para la asignación. En .bss
y .zero, solo se evalúan las etiquetas. Estas pseudo-operaciones son válidas en términos relativos y
modos absolutos.
.alinear propuesta de
Alinea el segmento actual a un límite de bytes (2, 4 o 256) según lo especificado por propuesta de
(y lo coloca en el encabezado cuando el modo relativo está habilitado). Otros valores generan
un error.
.fopt tipo, valor1, valor2, valor3, ...
Actúa como .byt / .asc excepto que los valores están incrustados en el archivo de objeto como
opciones de archivo. El argumento tipo se utiliza para especificar la opción de archivo que se
referenciado. Una tabla de estas opciones está en el formato de archivo o65 reubicable
descripción. El resto de las opciones se interpretan como valores para insertar. Ningún
se puede especificar un número de valores y también pueden ser cadenas.
PREPROCESADOR
xa implementa un preprocesador muy similar al del preprocesador de lenguaje C cpp(1)
y muchas rarezas se aplican a ambos. Por ejemplo, como en C, el uso de /* */ para comentarios
Los delimitadores también se admiten en xay también los comentarios que utilizan la barra doble //.
el preprocesador también admite líneas de continuación, es decir, líneas que terminan con una barra invertida (\);
la siguiente línea se le agrega como si no hubiera una nueva línea divisoria. Esto también
se maneja a nivel de preprocesador.
Por razones de memoria y complejidad, toda la amplitud del cpp(1) la sintaxis no es completa
soportado. En particular, las definiciones de macro pueden no estar definidas hacia adelante (es decir, una macro
definición solo puede hacer referencia a una definición de macro previamente definida), excepto para
funciones, donde se apoya la evaluación recursiva; por ejemplo, a #definir WW AA , AA debe tener
ya ha sido definido. Algunas otras directivas no son compatibles, ni la mayoría de las
macros predefinidas, y existen otros límites en la evaluación y la longitud de la línea. Porque el
mantenedores de xa reconocer que algunos archivos requerirán una preparación más complicada que
el preprocesador incorporado puede suministrar, el preprocesador aceptará cpp(1) -estilo
salida de línea / nombre de archivo / banderas. Cuando estas líneas se ven en el archivo de entrada, xa tratará
ellos como cc lo haría, excepto que las banderas se ignoran. xa no acepta archivos en estándar
entrada por motivos de análisis, por lo que debe volcar su cpp(1) salida a un intermedio
archivo temporal, como
cc -E prueba.s > prueba.xa
xa prueba.xa
No es necesario pasar argumentos especiales a xa; la presencia de cpp(1) salida detectada
automáticamente.
Tenga en cuenta que pasar su archivo cpp(1) puede interferir con xapropio preprocesador
directivas. En este caso, para enmascarar directivas de cpp(1), utilice el -p opción para especificar una
personaje alternativo en lugar de #, como la tilde (p. ej., -p '~' ). Con esta opción y
argumento especificado, entonces en lugar de #incluir, por ejemplo, también puede utilizar ~ incluiren
además de #incluir (que también será aceptado por el xa preprocesador, asumiendo
cualquiera sobrevive cpp(1)). Se puede utilizar cualquier carácter, aunque, francamente, las elecciones patológicas pueden
dar lugar a fallos divertidos y frustrantes durante el análisis. También puede utilizar esta opción para
diferir las directivas del preprocesador que cpp(1) puede interpretar demasiado pronto hasta que el archivo realmente
llega a xa sí mismo para su procesamiento.
Se admiten las siguientes directivas de preprocesador.
#incluir "nombre del archivo"
Inserta el contenido del archivo nombre de archivo en esta posición. Si no se encuentra el archivo,
se busca utilizando las rutas especificadas por el -I opción de línea de comando o la
Variable ambiental ENTRADA XAIN (qv). Cuando se inserta, el archivo también se analizará
para directivas de preprocesador.
#eco comentario
Inserta un comentario comentario en el archivo de registro de errores, especificado con el -e de línea de comandos
.
#impresión expresión
Calcula el valor de la expresión expresión y lo imprime en el archivo de registro de errores.
#definir DEFINIR texto
Equivale a macro DEFINIR con texto texto tal que donde sea DEFINIR aparece en la
fuente de montaje, texto se sustituye en su lugar (al igual que cpp(1) haría). En
Además, #definir puede especificar funciones macro como cpp(1) tal que una directiva
como uno #definir mult (a, b) ((a) * (b)) generaría el resultado esperado siempre que un
expresión de la forma mult (a, b) aparece en la fuente. Esto también se puede especificar
en la línea de comando con el -D opción. Los argumentos de una función macro pueden ser
evaluado de forma recursiva, a diferencia de otros #definirs; el preprocesador intentará volver a
evaluar cualquier argumento refenciendo otra definición de preprocesador hasta diez veces
antes de quejarse.
Las siguientes directivas son condicionales. Si no se cumple el condicional, entonces el
código fuente entre la directiva y su terminación #terminara si están borrados y no
ensamblado. Se admiten hasta quince niveles de anidamiento.
#terminara si Cierra un bloque condicional.
#else Implementa una ruta alternativa para un bloque condicional.
#ifdef DEFINIR
Verdadero solo si macro DEFINIR está definido.
#siempre DEFINIR
Lo contrario; verdadero solo si macro DEFINIR no ha sido definido previamente.
#Si expresión
Verdadero si expresión expresión se evalúa como distinto de cero. expresión puede hacer referencia
otras macros.
#ifluido Etiqueta
Verdadero si etiqueta Etiqueta se ha utilizado (pero no necesariamente instanciado con un valor).
Este funciona on etiquetas, no macros!
#ifldef Etiqueta
Verdadero si etiqueta Etiqueta se define y asignado con un valor. Este funciona on etiquetas,
no macros!
Los bloques condicionales no cerrados al final de los archivos incluidos generan advertencias; no cerrado
Los bloques condicionales al final del ensamblaje generan un error.
#ifluido y #ifldef son útiles para crear una biblioteca basada en etiquetas. Por ejemplo,
puede usar algo como esto en el código de su biblioteca:
#ifluido Etiqueta
#ifldef Etiqueta
#eco Etiqueta ya haya utilizado definido, bibliotecas función Etiqueta no puede be insertado
#else
Etiqueta /* a tu manera código */
#terminara si
#terminara si
MEDIO AMBIENTE
xa utiliza las siguientes variables de entorno, si existen:
ENTRADA XAIN
Incluya la ruta del archivo; los componentes deben estar separados por `, '.
SALIDA XA
Ruta del archivo de salida.
NOTAS Y ERRORES
Las instrucciones R65C02 ina (a menudo representado Cª a) y DEA (dic a) debe representarse como
desnudo Cª y dic instrucciones respectivamente.
Etiquetas definidas hacia adelante, es decir, etiquetas que se definen después de la instrucción actual
se procesa: no se puede optimizar en instrucciones de página cero incluso si la etiqueta termina
definiéndose como una ubicación de página cero, porque el ensamblador no conoce el valor de
la etiqueta por adelantado durante la primera pasada cuando se calcula la longitud de una instrucción.
En la segunda pasada, se emitirá una advertencia cuando una instrucción que podría haber sido
optimizado no puede ser debido a esta limitación. (Obviamente, esto no se aplica a
instrucciones de ramificación o salto porque no son optimizables de todos modos, y esas
instrucciones que pueden only tomar un parámetro de 8 bits siempre se convertirá en un parámetro de 8 bits
cantidad.) Si la etiqueta no se puede definir de otro modo antes de la instrucción, la
prefijo de comilla invertida ` se puede utilizar para forzar una mayor optimización sin importar dónde esté la etiqueta
definido siempre que la instrucción lo admita. Forzar indiscriminadamente el problema puede ser
plagado de peligros, sin embargo, y no se recomienda; para desalentar esto, el ensamblador
se quejará de su uso en situaciones de modo de direccionamiento en las que no existe ambigüedad, como
como indexado indirecto, ramificado, etc.
Además, como una consecuencia adicional de la forma en que se gestiona la optimización, repetimos que all
Cantidades y etiquetas de 24 bits que hacen referencia a una cantidad de 24 bits en el modo 65816, anteriormente
declarado o no, DEBE anteponerse con el @ prefijo. De lo contrario, el ensamblador
intente optimizar a 16 bits, lo que puede ser indeseable.
Utilice xa en línea utilizando los servicios de onworks.net