El lenguaje ensamblador IBM Basic y sus sucesores es una serie de lenguajes ensambladores y ensambladores creados para el sistema mainframe IBM System/360 y sus sucesores hasta IBM Z.
El primero de ellos, el lenguaje ensamblador básico ( BAL ), es un lenguaje ensamblador extremadamente restringido , introducido en 1964 y utilizado en sistemas 360 con solo 8 KB de memoria principal, y solo un lector de tarjetas , un perforador de tarjetas y una impresora para entrada/salida , como parte de IBM Basic Programming Support (BPS/360). El ensamblador básico para BAL también estaba disponible como parte de Basic Operating System/360 (BOS/360).
Posteriormente, apareció un lenguaje ensamblador para el System/360 que tenía características más potentes y usabilidad, como soporte para macros . Este lenguaje, y la línea de ensambladores que lo implementaron, continuaron evolucionando para el System/370 y las arquitecturas que siguieron, heredando y extendiendo su sintaxis. Algunos en la industria informática se referían a ellos bajo el término genérico "Lenguaje ensamblador básico" o "BAL". [1] Sin embargo, muchos no lo hacían, e IBM mismo generalmente se refería a ellos simplemente como el "Lenguaje ensamblador del System/360", [2] como el "Ensamblador" para un sistema operativo o plataforma dados, [3] o nombres similares. Los ensambladores específicos eran conocidos por nombres como [a] Ensamblador E, Ensamblador F, Ensamblador H, etc. Los programadores que utilizan este lenguaje, y esta familia de ensambladores, también se refieren a ellos como ALC (por Assembly Language Coding), o simplemente "el ensamblador".
El último lenguaje derivado se conoce como Ensamblador de alto nivel de IBM ( HLASM ).
Como es un lenguaje ensamblador , BAL utiliza el conjunto de instrucciones nativo de la arquitectura de mainframe de IBM en la que se ejecuta, System/360 .
Los sucesores de BAL utilizan los conjuntos de instrucciones nativos de las arquitecturas de mainframe de IBM en las que se ejecutan, incluidos System/360 , System/370 , System/370-XA , ESA/370 , ESA/390 y z/Architecture .
La simplicidad de las instrucciones de máquina significa que el código fuente de un programa escrito en ensamblador normalmente será mucho más largo que un programa equivalente en, por ejemplo, COBOL o Fortran . En el pasado, se creía que la velocidad de los programas en ensamblador codificados a mano compensaba este inconveniente, pero con la llegada de los compiladores optimizadores, C para mainframes y otros avances, el ensamblador ha perdido gran parte de su atractivo. Sin embargo, IBM continúa mejorando el ensamblador y todavía se utiliza cuando la necesidad de velocidad o un control muy preciso es primordial. Sin embargo, todos los sucesores de IBM de BAL han incluido una sofisticada función de macros que permite escribir código fuente mucho más compacto.
Otra razón para utilizar ensamblador es que no se puede acceder a todas las funciones del sistema operativo en lenguajes de alto nivel. Las interfaces de programación de aplicaciones de los sistemas operativos mainframe de IBM se definen como un conjunto de instrucciones "macro" en lenguaje ensamblador, que normalmente invocan instrucciones Supervisor Call ( SVC
) [p. ej., en z/OS] o Diagnose ( DIAG
) [p. ej., en z/VM] para invocar rutinas del sistema operativo. Es posible utilizar servicios del sistema operativo desde programas escritos en lenguajes de alto nivel mediante el uso de subrutinas de ensamblador.
El formato de las declaraciones en lenguaje ensamblador refleja el diseño de una tarjeta perforada de 80 columnas, aunque las versiones sucesivas han relajado la mayoría de las restricciones.
El lenguaje ensamblador básico también permite un formato de instrucción alternativo, en el que la instrucción comienza en la columna 25, lo que permite que la instrucción ensamblada se inserte en la misma tarjeta comenzando en la columna 1. Esta opción no se mantuvo en versiones posteriores del ensamblador.
En el código fuente de un programa escrito en ensamblador se encuentran tres tipos principales de instrucciones.
Las instrucciones del ensamblador, a veces denominadas directivas , pseudooperaciones o pseudoops en otros sistemas, son solicitudes al ensamblador para que realice varias operaciones durante el proceso de generación de código. Por ejemplo, CSECT
significa "iniciar una sección de código aquí"; DSECT
proporciona definiciones de datos para una estructura, pero no genera código; DC
define una constante que se colocará en el código objeto.
Una de las instrucciones de ensamblador más importantes es USING
, que admite el direccionamiento por desplazamiento de base de la arquitectura S/360. Guía al ensamblador para determinar qué registro base y desplazamiento debe usar para una dirección relativa. En BAL, estaba limitada a la forma
USANDO base,reg-1,...,reg-n
Las direcciones de instrucciones de máquina en S/360 especifican un desplazamiento (0–4095 bytes) a partir del valor en un registro base ; aunque versiones posteriores de la arquitectura agregaron formatos de dirección relativa, muchas instrucciones aún usan los formatos más antiguos. USING
permite al programador indicarle al ensamblador que se supone que los registros base especificados contienen la dirección de "base", base+4096 (si se especifican varios registros), etc. Esto solo proporciona un atajo para el programador, que de lo contrario tendría que especificar el registro base en cada instrucción. Los programadores aún son responsables de cargar realmente la dirección de "base" en el registro antes de escribir el código que depende de este valor.
La instrucción del ensamblador relacionada DROP
anula una anterior USING
.
Existe una relación uno a uno con las instrucciones de la máquina . El conjunto completo de instrucciones mnemotécnicas se describe en el manual Principles of Operation [4] para cada conjunto de instrucciones. Ejemplos:
*Esta es una línea de comentarios * Cargar el entero de palabra completa almacenado en el * ubicación denominada 'ZIGGY' en el registro general 3: L 3,ZIGGY SLA 4,5 desplaza el valor en el registro general 4 a la izquierda en 5 bits MVC TARGET,SOURCE mueve personajes desde la ubicación 'SOURCE' a 'TARGET' AP COUNT,=P'1' suma 1 al valor en la ubicación de memoria 'COUNT' (formato decimal empaquetado) B SIGUIENTE rama incondicional a la etiqueta 'SIGUIENTE' AQUI EQU * Esta es una etiqueta CLC TARGET,=C'ADDRESS' Compara la ubicación de memoria 'TARGET' con la cadena 'ADDRESS' Rama BE THERE si es igual a la etiqueta del programa 'THERE'
Los estándares generalmente aceptados, aunque de ninguna manera obligatorios, incluyen la identificación de registros de propósito general con mnemónicos. A diferencia de los ensambladores para algunos otros sistemas, como el lenguaje ensamblador X86 , los mnemónicos de registro no son símbolos reservados sino que se definen mediante EQU
instrucciones en otras partes del programa. Esto mejora la legibilidad de los programas en lenguaje ensamblador y proporciona una referencia cruzada del uso de registros. Por lo tanto, normalmente puede ver lo siguiente en un programa ensamblador:
R3 EQU 3 ... izq. r3,ziggy
Algunos mnemónicos de instrucciones notables son BALR
[b] para una llamada que almacena la dirección de retorno y el código de condición en un registro, SVC
[ c] DIAG
, [d] y [5]ZAP
.
Las instrucciones de la máquina System/360 tienen una longitud de una, dos o tres medias palabras (de dos a seis bytes). Originalmente, había cuatro formatos de instrucciones, designados por los dos primeros bits del campo de código de operación; z/Architecture agregó formatos adicionales.
El ensamblador de Soporte Básico de Programación no admitía macros . Las versiones posteriores del ensamblador, a partir del Ensamblador D [6], permiten al programador agrupar instrucciones en macros y agregarlas a una biblioteca, que luego se puede invocar en otros programas, generalmente con parámetros, como las funciones de preprocesador en C y lenguajes relacionados. Las macros pueden incluir instrucciones condicionales del ensamblador, como AIF
(una construcción 'if'), que se utiliza para generar código diferente según los parámetros elegidos. Eso hace que la función de macro de este ensamblador sea muy poderosa. Si bien las macros multilínea en C son una excepción, las definiciones de macro en ensamblador pueden tener fácilmente cientos de líneas.
La mayoría de los programas requerirán servicios del sistema operativo , y el SO proporciona macros estándar para solicitar esos servicios. Son análogas a las llamadas al sistema de Unix . Por ejemplo, en MVS (posteriormente z/OS), (con el parámetro) asigna dinámicamente un bloque de memoria y recupera el siguiente registro lógico de un archivo.STORAGE
OBTAIN
GET
Estas macros dependen del sistema operativo; a diferencia de varios lenguajes de nivel superior, los lenguajes ensambladores de mainframe de IBM no proporcionan instrucciones o bibliotecas independientes del sistema operativo para asignar memoria, realizar operaciones de E/S, etc., y los distintos sistemas operativos de mainframe de IBM no son compatibles en el nivel de servicio del sistema. Por ejemplo, escribir un archivo secuencial se codificaría de forma diferente en z/OS y en z/VSE.
El siguiente fragmento muestra cómo se realizaría la lógica "Si SEXO = 'M', sumar 1 a HOMBRES; de lo contrario, sumar 1 a MUJERES" en ensamblador.
CLI SEXO, C'M' ¿Hombre? BNE IS_FEM Si no, ramifica alrededor L 7, MALES Carga el valor actual de MALES en el registro 7 LA 7,1(7) añadir 1 ST 7, MALES almacena el resultado B GO_ON Terminé con esta parte IS_FEM EQU * Una etiqueta L 7,HEMBRAS Cargar el valor actual en HEMBRAS en el registro 7 LA 7,1(7) añadir 1 ST 7, MUJERES almacenan el resultado GO_ON EQU * - resto del programa - * MALES DC F'0' Contador para MALES (inicialmente=0) MUJERES DC F'0' Contador para MUJERES (inicialmente=0)
El siguiente es el omnipresente programa "¡Hola, mundo!" , y al ejecutarse en un sistema operativo IBM como OS/VS1 o MVS , mostraría las palabras "¡Hola, mundo!" en la consola del operador:
HOLA CSECT El nombre de este programa es 'HOLA' * Registre 15 puntos aquí al ingresar desde OPSYS o llamante. STM 14,12,12(13) Guarda los registros 14,15 y 0 a 12 en el área de guardado del llamador LR 12,15 Configurar el registro base con la dirección del punto de entrada del programa USANDO HELLO,12 Indica al ensamblador qué registro estamos usando para pgm.base LA 15, GUARDAR Ahora apunta a nuestra propia área de guardado ST 15,8(13) Establecer cadena hacia adelante ST 13,4(15) Cadena de retroceso LR 13,15 Establezca R13 en la dirección de la nueva área de guardado * -Fin de la limpieza (similar para la mayoría de los programas) - Operador de escritura "Hola, mundo" de la OMC (macro del sistema operativo) * L 13,4(13) restaurar la dirección al área de guardado proporcionada por el llamante XC 8(4,13),8(13) Cadena de avance clara LM 14,12,12(13) Restaurar registros como en la entrada GOTA 12 El opuesto de 'USAR' SR 15,15 Establece el registro 15 en 0 para que el código de retorno (R15) sea cero BR 14 Regresar a la llamada * GUARDAR DS 18F Define 18 palabras completas para guardar los registros del programa de llamada FIN HOLA Este es el final del programa.
WTO
es una macro de ensamblador que genera una llamada al sistema operativo. Debido a que guarda registros y luego los restaura y devuelve, este pequeño programa se puede usar como un programa por lotes invocado directamente por el lenguaje de control de tareas (JCL) del sistema operativo de esta manera:
// EJECUTAR PGM=HOLA
o, alternativamente, se puede llamar como una subrutina desde dicho programa:
Llama 'HOLA'
Con la excepción de los ensambladores para el IBM System/360 Model 20 , los ensambladores de IBM eran en gran medida compatibles con versiones anteriores. Las diferencias se encontraban principalmente en la complejidad de las expresiones permitidas y en el procesamiento de macros. Los ensambladores de OS/360 se designaban originalmente según sus requisitos de memoria.
El ensamblador para BPS es el verdadero "ensamblador básico". Fue pensado para ser cargado desde tarjetas y se ejecutaría en un System/360 de 8 KB (excepto el Modelo 20). No tiene soporte para macroinstrucciones o mnemotecnias extendidas (como BH en lugar de BC 2 para bifurcar si el código de condición 2 indica una comparación alta). Puede ensamblar solo una única sección de control y no permite secciones ficticias (definiciones de estructura). No se permiten expresiones entre paréntesis y las expresiones están limitadas a tres términos con los únicos operadores '+', '-' y '*'. [7] : 59–61
El sistema operativo básico tiene dos versiones de ensamblador. Ambas requieren 16 KB de memoria, una residente en cinta y la otra en disco. [8] : 7–8
El ensamblador D era el ensamblador DOS/360 para máquinas con un tamaño de memoria de 16 KB. Se presentó en dos versiones: una variante de 10 KB para máquinas con un mínimo de 16 KB de memoria y una variante de 14 KB para máquinas con 24 KB. También estaba disponible un ensamblador de nivel F para máquinas DOS con 64 KB o más. Los ensambladores D ofrecían casi todas las características de las versiones superiores. [9] : 7
El ensamblador E fue diseñado para ejecutarse en un sistema OS/360 con un mínimo de 32 KB de almacenamiento principal, y el ensamblador en sí mismo requiere 15 KB. [10] : 2 El ensamblador F puede ejecutarse en DOS/360 o OS/360 en un sistema con una memoria de 64 KB, y el ensamblador requiere 44 KB. [11] [12] [13] Estos ensambladores son una parte estándar de OS/360; la versión que se generó se especificó en la generación del sistema (SYSGEN).
Assembler H funciona en OS/360 y sucesores ; era más rápido y más potente que Assembler F, pero el lenguaje de macros no era totalmente compatible.
La versión 2 de Assembler H se anunció en 1981 e incluye soporte para Arquitectura Extendida (XA), incluidas las directivas AMODE
y RMODE
. [14] : 3-28 Se retiró de la comercialización en 1994 y el soporte finalizó en 1995. Fue reemplazado por High Level Assembler. [15]
Assembler XF es una actualización mayoritariamente compatible de Assembler F que incluye las nuevas instrucciones de la arquitectura System/370. Esta versión proporciona un ensamblador común para sistemas OS/VS, DOS/VS y VM. Otros cambios incluyen la relajación de las restricciones sobre expresiones y procesamiento de macros. Assembler XF requiere un tamaño mínimo de partición/región de 64 KB (virtual). El tamaño recomendado es de 128 KB. [16] : 73
High Level Assembler o HLASM fue lanzado en junio de 1992 en reemplazo de Assembler H Version 2 de IBM. [17] [18] Fue el traductor predeterminado para System/370 y System/390, y admitió los sistemas operativos MVS, VSE y VM. A partir de 2023 es el lenguaje de programación ensamblador actual de IBM para sus sistemas operativos z/OS , z/VSE , z/VM y z/TPF en computadoras mainframe z/Architecture . La versión 6 y posteriores también se ejecutan en Linux y generan archivos de objetos ELF o GOFF (este entorno a veces se conoce como Linux en IBM Z ). [19] Mientras trabajaba en IBM, John Robert Ehrman creó y fue el desarrollador principal de HLASM [e] y es considerado el "padre del ensamblador de alto nivel". [21]
A pesar del nombre, HLASM por sí solo no tiene muchas de las características normalmente asociadas con un ensamblador de alto nivel . El nombre puede provenir de las capacidades adicionales del lenguaje de macros, como la capacidad de escribir funciones definidas por el usuario. El ensamblador es en su mayoría similar a Assembler H y Assembler(XF), incorporando las modificaciones de SLACCSECT
(Stanford Linear Accelerator). Entre las características agregadas se encuentran una indicación de / DSECT
para el contador de ubicación, declaraciones dependientes [f] y etiquetadas [g] USING
, una lista de USING
declaraciones actualmente activas, una indicación de si una variable se lee o escribe en la referencia cruzada y permite nombres de símbolos con mayúsculas y minúsculas. [22] La RSECT
directiva (Read-only Control Section) permite al ensamblador verificar la reentrada en cada sección. RSECT
anteriormente "no estaba documentada y se implementó de manera inconsistente en Assembler H". [23] : 41
El kit de herramientas de ensamblador de alto nivel es un complemento del ensamblador de alto nivel que se vende por separado. El kit de herramientas contiene: [24]
El paquete de soporte IBM 7090/7094, conocido como SUPPAK, "consta de tres programas diseñados para permitir que los programas escritos para un Sistema 360 se ensamblen, prueben y ejecuten en un IBM 709, 7090, 7094 o 7094 II".
Este ensamblador cruzado se ejecuta en un sistema 7090 o 7094 y se utilizó mientras System/360 estaba en desarrollo. [7] [25] Este ensamblador admite el conjunto de caracteres BCD de seis bits , así como EBCDIC de ocho bits .
IBM suministró dos ensambladores para el Modelo 20: el ensamblador básico del Modelo 20 y el ensamblador DPS/TPS del Modelo 20. Ambos admitían únicamente instrucciones disponibles en el Modelo 20, incluidas las instrucciones únicas CIO
, TIO
, XIOB
, SPSW
, BAS
, BASR
, y HPR
. [26] : 110 El ensamblador básico es una versión ligeramente más restringida del ensamblador básico del System/360; [27] en particular, los símbolos están restringidos a cuatro caracteres de longitud. Esta versión es capaz de ejecutarse en un sistema con 4 KB de memoria, y el soporte de macros está limitado a macros IOCS . Las versiones de tarjeta son ensambladores de dos pasadas que solo admiten entrada/salida de tarjeta. Las versiones residentes en cinta son de una sola pasada, utilizando cinta magnética para almacenamiento intermedio. Los programas ensamblados con el ensamblador CPS pueden abordar un máximo de 16 KB. [27] : 7–8
El ensamblador DPS/TPS es una versión algo restringida del ensamblador BPS/BOS de System/360. [26] : 132–134
El ensamblador del sistema de programación IBM System/360 Modelo 44 procesa un lenguaje que es un "subconjunto seleccionado" del lenguaje ensamblador OS/360 y DOS/360.
Lo más significativo es que el ensamblador del Modelo 44 carece de compatibilidad con macros y declaraciones de continuación. Por otro lado, tiene una serie de características que no se encuentran en otros ensambladores del Sistema/360, en particular instrucciones para actualizar un conjunto de datos de origen de la imagen de una tarjeta , nombres comunes y una definición implícita de SETA
las variables del ensamblador. [28]
No tiene soporte para instrucciones de almacenamiento a almacenamiento (SS) o las instrucciones de conversión a binario ( CVB
), conversión a decimal ( CVD
), lectura directa ( RDD
) y escritura directa ( WRD
). [29] Incluye cuatro instrucciones exclusivas del Modelo 44: Cambiar máscara de prioridad ( CHPM
), Cargar PSW especial ( LPSX
), Leer palabra directa ( RDDW
) y Escribir palabra directa ( WRDW
).
También incluye directivas para actualizar el programa fuente, una función realizada por programas de utilidad en otros sistemas ( SKPTO
, REWND
, NUM
, OMIT
y ENDUP
). [29] : 53, 73
El ensamblador del sistema de tiempo compartido System/360 Modelo 67 tiene varias diferencias en las directivas para admitir características exclusivas del TSS. La PSECT
directiva genera una sección de control del prototipo que contiene constantes de dirección reubicables y datos modificables utilizados por el programa. [30] : 143
"Assembler G" es un conjunto de modificaciones realizadas al Assembler F en los años 70 por la Universidad de Waterloo (Assembler F era/es de código abierto). Las mejoras se centran principalmente en un mejor manejo de la entrada/salida y un almacenamiento en búfer mejorado que acelera considerablemente los ensamblajes. [31] "Assembler G" nunca fue un producto de IBM.
Han existido varios ensambladores compatibles con IBM para entornos especiales. [32]
Originalmente, todos los sistemas operativos System/360 se escribieron en lenguaje ensamblador y todas las interfaces del sistema se definieron mediante definiciones de macros. El acceso desde lenguajes de alto nivel (HLL) estaba restringido a lo que proporcionaba ese lenguaje y otras llamadas al sistema debían codificarse como subrutinas de ensamblador llamadas desde programas HLL. Además, IBM permitía la personalización de las características del sistema operativo mediante una instalación a través de lo que se conocía como Exits (rutinas proporcionadas por el usuario que podían ampliar o alterar las funciones normales del sistema operativo). Estas salidas debían codificarse en lenguaje ensamblador. Más tarde, IBM recodificó OS/360 en un lenguaje de programación de sistemas, PL/S , pero, a excepción de una breve prueba, decidió no lanzar el compilador PL/S a los usuarios. Como resultado de estos factores, el lenguaje ensamblador se utilizó significativamente en los sistemas IBM durante muchos años.
BASR
instrucciones similares.SVC
han sido reemplazados por una PC
instrucción.DIAG
como una HVC
instrucción.USING
es aquel que especifica una expresión reubicable en lugar de una lista de registros: USANDO IHADCB,SYSPRINT ... TM DCBOPTCD,DCBOPTC Prueba OPTCD en SYSPRINT ...
USING
es aquella que solo afecta a las instrucciones que hacen referencia explícita a ella calificando una expresión con una etiqueta: LA R4,SISTEMA LA R5,SISTEMA DE IMPRESIÓNAL UTILIZAR IHADCB,R4FUERA DE USO IHADCB,R5 ... TM IN.DCBOFLGS,DCBOFTM Prueba OFLGS en SYSIN ... TM OUT.DCBOPTCD,DCBOPTC Prueba OPTCD en SYSPRINT ...