El formato de archivo de objeto OS / 360 es el formato de archivo de módulo de objeto estándar para los sistemas operativos de mainframe IBM DOS / 360 , OS / 360 y VM / 370 , [1] Univac VS / 9 , [2] y Fujitsu BS2000 [3] . En la década de 1990, el formato se le dio una extensión con el registro de tipo XSD para el MVS sistema operativo para apoyar nombres de los módulos más largos en el lenguaje de programación C . [4] Este formato todavía lo utiliza el sistema operativo z / VSE (la continuación de DOS / 360Sistema operativo). Por el contrario, ha sido reemplazado por el formato de archivo GOFF en el sistema operativo MVS (la continuación del sistema operativo OS / 360 ) y en el sistema operativo z / VM (la continuación del sistema operativo VM / 370 ). Dado que el MVS y z / VM cargadores seguirán manejar este formato anterior, algunos compiladores han optado por seguir produciendo este formato en lugar de la más reciente GOFF formato. [5]
Usar
Este formato proporciona la descripción del código de objeto de una aplicación compilada, que puede enviarse a un editor de vínculos para convertirlo en un programa ejecutable, o ejecutarse directamente a través de un cargador de módulo de objeto. Lo crea el ensamblador o un compilador de lenguaje de programación. Para el resto de este artículo, a menos que se requiera una razón para ser explícito en la diferencia entre un compilador de lenguaje y un ensamblador, el término "compilar" incluye "ensamblar" y "compilador" incluye "ensamblador".
Debilidades
Este formato se consideró adecuado para la época en que se desarrolló originalmente, alrededor de 1964. Con el tiempo, tuvo una serie de debilidades, entre las que se encuentra que
- solo admite nombres de 8 bytes de longitud (y, por lo general, existe una convención de que los nombres son solo MAYÚSCULAS y están restringidos a ciertos símbolos en el nombre, consulte la discusión a continuación).
- no se puede especificar la alineación.
- no se puede especificar un módulo que es pura información y no es ejecutable.
- no se puede especificar un módulo reentrante (a diferencia de uno de solo lectura).
- no puede distinguir entre una subrutina (una rutina que maneja datos solo a través de argumentos) y una función (una rutina que devuelve datos a través de un valor de retorno).
- no se puede especificar un módulo diseñado para que sea móvil (en lugar de simplemente reentrante).
- Las constantes de dirección no se pueden identificar como punteros (por ejemplo, para acceder a una estructura de datos) a diferencia de, digamos, el acceso a una tabla (que no se modifica) o a un método virtual en un registro dinámico.
- los atributos no se pueden asignar a referencias externas (una referencia es un código frente a una referencia a datos).
- no hay medios para permitir que los procedimientos o funciones verifiquen o validen tipos de argumentos o validen estructuras externas.
- ningún medio para declarar un objeto, donde parte de la estructura son datos y parte es código (métodos que operan sobre los datos del objeto).
- la tabla simbólica SYM está limitada en la información que puede proporcionar.
Estas y otras debilidades hicieron que este formato fuera reemplazado por el formato de archivo del módulo GOFF . Pero fue una buena elección ya que fue satisfactoria para las necesidades de los lenguajes de programación que se usaban en ese momento, funcionó y fue fácil de implementar (especialmente donde las máquinas en ese momento pueden haber tenido tan solo 8K de memoria, muchas de las cuales funcionan múltiples trabajos simultáneos o consecutivos con tan solo 64K, y que realmente realizan un trabajo útil), fáciles de usar y para programas simples (la orientación a objetos y los conceptos como métodos virtuales serían décadas en el futuro desde cuando se desarrolló originalmente), aún se pueden adecuado. Además, el formato sigue siendo satisfactorio para seguir utilizándose para programas más antiguos que nunca se cambiaron o donde el código fuente no está disponible y los archivos objeto son la única parte restante del programa.
Tenga en cuenta que el formato de archivo GOFF simplemente reemplazó a este formato (y proporcionó más información para un compilador de lenguaje o el ensamblador), el formato sigue siendo válido, puede seguir utilizándose y no ha quedado obsoleto. Este formato tiene la ventaja de que es fácil y simple de crear, y un compilador para un lenguaje que puede vivir con sus restricciones, que son nombres de módulos con un máximo de 8 caracteres en mayúsculas, aplicaciones no mayores de 2 ^ 24 en tamaño ( 16 megabytes) para código y datos, significa que cualquier lenguaje de programación que pueda escribir archivos binarios de formato fijo de 80 bytes (básicamente cualquier cosa, incluidos COBOL y FORTRAN, no solo Assembler), puede usarse para crear un compilador para este formato de objeto. De hecho, la Comisión de Energía Atómica de Australia Pascal Compiler 8000 's para el IBM 360/370, sí escrito en Pascal como autoalojamiento posterior del compilador en 1978-1980, creado directamente sus propios archivos de objetos sin utilizar el ensamblador como un paso intermedio .
Tipos de registro
Hay 6 tipos de registros diferentes:
- Los registros ESD definen programas principales, subrutinas, funciones, secciones ficticias, Fortran Common y cualquier módulo o rutina que otro módulo pueda llamar. Se utilizan para definir los programas o segmentos de programa que se compilaron en esta ejecución del compilador y las rutinas externas utilizadas por el programa (como exit () en C , CALL EXIT en Fortran ; new () y dispose ( ) en Pascal ). Los registros de ESD deben ocurrir antes de cualquier referencia a un símbolo de ESD.
- Los registros TXT contienen las instrucciones de la máquina o los datos que tiene el módulo.
- Los registros RLD se utilizan para reubicar direcciones. Por ejemplo, un programa que hace referencia a una dirección ubicada a 500 bytes dentro del módulo, almacenará internamente la dirección como 500, pero cuando el módulo se carga en la memoria, seguramente se ubicará en otro lugar, por lo que un registro RLD informa al editor de enlace o al cargador qué direcciones para cambiar. Además, cuando un módulo hace referencia a un símbolo externo, generalmente establecerá el valor del símbolo en cero, luego incluirá una entrada RLD para ese símbolo para permitir que el cargador o editor de enlaces altere la dirección al valor correcto.
- Se agregaron registros SYM para permitir proporcionar información adicional sobre un símbolo, como el tipo de datos (caracteres o numéricos) y el tamaño del elemento.
- Se agregaron registros XSD para proporcionar información adicional más allá de la proporcionada en el registro ESD sobre símbolos públicos como procedimientos y funciones, y para expandir el tamaño de un procedimiento o nombre de función a más de 8 caracteres.
- Los registros END indican el final de un módulo y, opcionalmente, dónde debe comenzar la ejecución del programa.
Formato
Todos los registros tienen exactamente 80 bytes de longitud; los campos no utilizados deben llenarse en blanco. El primer byte de cada registro es siempre el valor binario 02. Los siguientes 3 bytes son siempre el tipo de registro. Los valores de los caracteres están en EBCDIC . El resto de los campos de cada registro dependen del tipo de registro. Por convención, si el módulo se nombró en la instrucción TITLE de un programa en lenguaje ensamblador (o el compilador del lenguaje decide darle un nombre al módulo), su nombre aparece justificado a la izquierda en las posiciones 73–80 de cada registro; si el nombre tiene menos de 8 caracteres o no se dio ningún nombre, aparecerá un número de secuencia (en caracteres, justificado a la derecha con relleno de cero) para el resto de cada registro. En la práctica, el campo del número de secuencia puede estar en blanco o contener cualquier cosa que el traductor de idiomas quiera poner allí, y es esencialmente un campo de comentario.
El ensamblador (o compilador, en el caso de un lenguaje de alto nivel como C , COBOL , Fortran , Pascal , PL / I o RPG III ), crearía un registro ESD para cada subrutina, función o programa, y para Bloques comunes en el caso de programas Fortran. Se crearían entradas ESD adicionales en los registros ESD para declaraciones ENTRY (un alias para un módulo o un punto de entrada alternativo para un módulo), para subrutinas adicionales, funciones o bloques COMUNES en blanco o con nombre Fortran incluidos como parte de módulos compilados o ensamblados, y para nombres de subrutinas externas y funciones llamadas por un módulo.
Tenga en cuenta que hay dos tipos de tipos de símbolos públicos, entradas ESDID y entradas LDID. Las entradas ESDID son CSECTS y DSECTS (programas, procedimientos y funciones, y posiblemente declaraciones de registro o estructura) y las entradas LDID son declaraciones ENTRY (puntos de entrada alternativos o de alias a un CSECT o DSECT). El espacio de numeración de ESDID está separado del espacio de numeración de LDID y, por lo tanto, dos símbolos con nombres diferentes, uno un ESDID y otro un LDID, pueden tener el valor binario 0001.
El código de objeto ejecutable y los datos del programa se almacenarían en registros TXT. Las llamadas a otras subrutinas, funciones o bloques COMUNES se resuelven mediante registros RLD, que modifican la dirección almacenada en un registro TXT para determinar la dirección completa de la subrutina o función. Opcionalmente, un lenguaje puede proporcionar información de referencia simbólica, como nombres de objeto e información de tipo de datos o símbolos de depuración a través de registros SYM, y luego la declaración END indica el final de un archivo de módulo de objeto y la dirección de inicio opcional para la subrutina, función o programa que este archivo debe iniciarse en, si la dirección de inicio de la rutina no es el primer byte de la primera rutina (algunas rutinas pueden tener datos no ejecutables antes de su código real o la primera rutina ensamblada o compilada no es el programa "principal" o módulo "primario".) Como se ha informado, algunas personas descubrieron debido a la forma en que trabajaban los ensambladores más antiguos (alrededor de 1968-1975), un programa compilaba más rápido si coloca los datos "encima" de un programa antes del código del programa, una vez el ensamblador comenzó a notar las instrucciones, era mucho más lento, por lo que los programadores escribían rutinas donde colocaban los datos y las constantes primero, luego incluían el código para el programa. Cuando el montaje de un programa podía llevar de 30 minutos a una hora en lugar de unos pocos segundos como ahora, esto supuso una gran diferencia.
Tenga en cuenta que, si bien no es obligatorio, es una convención que los nombres simbólicos y de módulo están en mayúsculas , que el primer carácter de un campo de nombre es una letra o los símbolos @, # o $, y que los caracteres subsiguientes de un nombre constan de esos caracteres más los dígitos de los caracteres del 0 al 9, aunque el software antiguo puede procesar correctamente o no archivos de módulo de objeto que usaban identificadores en minúsculas. La mayoría de los lenguajes de programación que no sean Assembly no pueden llamar módulos que tengan nombres que contengan @ o # (especialmente Fortran , razón por la cual su biblioteca en tiempo de ejecución tiene un nombre con un # para que no entre en conflicto con ningún nombre elegido por un programador), por lo tanto, la mayoría de los programas, subrutinas o funciones se escribieron para usar solo una letra para el primer carácter, y si el nombre tenía más de 1 carácter, para usar solo letras y dígitos para el segundo al (hasta) octavo carácter. Si bien la mayoría de los lenguajes no ensambladores no pueden manejar $ en el nombre, una excepción es Fortran, que puede reconocer nombres de subrutinas con $ en ellos. (Tenga en cuenta que esta opción de no usar # @ o $ no se aplica a un programa "principal" escrito en Assembler o cualquier lenguaje que pueda usar estos identificadores, al cargador de programas no le importa el nombre del módulo). , los módulos escritos para usarse como subrutinas generalmente se restringían a 6 caracteres o menos, ya que las versiones de Fortran antes de 1978 tampoco pueden usar subrutinas o módulos que usen más de 6 caracteres de longitud. El compilador COBOL normalmente descarta el carácter de guión si aparece en el PROGRAM-ID de un programa o en una instrucción CALL a un módulo externo.
En la década de 1990, se agregó un nuevo tipo de registro, el registro XSD para extender el uso de este formato de módulo de objeto para abarcar nombres de módulo más largos de 8 caracteres y permitir nombres de mayúsculas y minúsculas, como lo requiere el lenguaje de programación C.
Prefijo (Byte 1) | Tipo (bytes 2 a 4) | Propósito | Dirección (Bytes 6–8) en binario si se usa | Tamaño de la información en bytes 17+ (bytes 11-12) | Marcar bits (registro XSD) o espacios en blanco (bytes 13-14) | ESDID binario (bytes 15-16) | Datos | Ident (bytes 73–80) | |
---|---|---|---|---|---|---|---|---|---|
(Bytes 17–64) | (Bytes 65–72) | ||||||||
02 | ESD | Tipo de módulo | Espacios en blanco | Tamaño utilizado en bytes 17-64 | Espacios en blanco | ESDID binario del primer símbolo de módulo no LD en los bytes 17–64 o en blanco si todos los símbolos de este registro son LD | Símbolos de módulo de 1 a 3 de 16 bytes (ver más abajo) | Espacios en blanco | ID de cubierta, número de secuencia o ambos |
TXT | Programa o datos | Dirección relativa de datos en los bytes 17 a 72 de este registro | Tamaño utilizado en bytes 17–72 | Espacios en blanco | ESDID | 1-56 bytes de datos (los "datos" pueden ser instrucciones de programa, datos de programa o ambos) | |||
RLD | Información reubicable | Espacios en blanco | Tamaño utilizado en bytes 17–72 | Espacios en blanco | Espacios en blanco | 1 a 13 entradas de reubicación de longitud variable (consulte la tabla a continuación) | |||
SYM | Información de la tabla de símbolos | Espacios en blanco | Tamaño utilizado en bytes 17–72 | Espacios en blanco | Espacios en blanco | Datos de símbolo de longitud variable (consulte la tabla siguiente) | |||
XSD | Información ampliada sobre símbolos | Espacios en blanco | Tamaño utilizado en bytes 17–72 | Bits de bandera (consulte la tabla a continuación) | Identificador de LDID si XSD es para un LD; de lo contrario, el ESDID | Datos XSD (consulte la tabla a continuación) | |||
FINAL | Fin del módulo | Dirección de entrada si se especifica o en blanco | Espacios en blanco | espacios en blanco | ESDID de la dirección de entrada o espacios en blanco | Datos finales (ver tabla a continuación) |
Campo | Tamaño | Notas | ||
---|---|---|---|---|
Nombre | 8 | Identifica el Programa, Función, Subrutina o Bloque COMÚN FORTRAN (Esto estará en blanco para PC o DATOS DEL BLOQUE COMÚN o sin nombre en blanco) | ||
Tipo | 1 | Valor (hexadecimal) | Tipo de módulo | Que es el modulo |
00 | Dakota del Sur | START, CSECT, DSECT (sección ficticia; no tendrá ningún registro TXT) o Fortran denominado módulo BLOCK DATA | ||
01 | LD | ENTRADA (Definición de etiqueta dentro de un CSECT previamente identificado) | ||
02 | ER | EXTRN (referencia externa) | ||
04 | ordenador personal | Código privado (START o CSECT que no tiene nombre o módulo BLOCK DATA sin nombre de Fortran; este módulo no se puede llamar como una función o subrutina desde otro programa) | ||
05 | CM | Fortran con nombre o en blanco COMÚN (solo proporciona el tamaño; los registros CM nunca tienen registros TXT) | ||
06 | XD (PR) | Sección ficticia externa o pseudo registro | ||
0A | WX | WXTRN (Weak Extern: una rutina externa que no tiene que estar presente para que el módulo funcione) | ||
0D | Dakota del Sur | START o CSECT con alineación cuádruple | ||
0E | ordenador personal | Código privado con alineación cuádruple | ||
0F | CM | Común de alineación cuádruple (solo proporciona tamaño; COMÚN nunca tiene registros TXT) | ||
Habla a | 3 | Dirección de inicio binaria de este módulo; dirección del símbolo dentro del módulo para LD | ||
Bandera | 1 | |||
Alineación en binario para XD; En blanco para ER, LD o WX; para SD, CM o PC, utilice lo siguiente: | ||||
Bits | Valor | Propósito | ||
0-1 | No utilizado | |||
2 | 0 | Utilice el bit 5 para el valor de RMODE | ||
1 | RMODE 64 bits | |||
3 | 0 | Utilice los bits 6 a 7 para AMODE | ||
1 | AMODE 64 bits | |||
4 | 0 | El módulo es de lectura / escritura | ||
1 | RSECT (el módulo es de solo lectura y no se modifica automáticamente) | |||
5 | 0 | RMODE 24 bits | ||
1 | RMODE 31 bits o RMODE CUALQUIER | |||
6–7 | 00 | AMODE 24 bits | ||
01 | AMODE 24 bits | |||
10 | AMODE 31 bits | |||
11 | AMODE CUALQUIER | |||
Tamaño | 3 | Longitud en binario para PC, CM o SD; un espacio en blanco seguido de LDID binario de 2 bytes para LD (y los números de ESDID están separados de los números de LDID; un ESDID puede numerarse 0001 y será un identificador diferente del LDID con el número 0001); espacios en blanco para ER, XD, PR o WX. Tenga en cuenta que un compilador de programas que crea un registro SD que no sabe cuánto tiempo va a durar el módulo puede dejar este campo en blanco y luego especificar la longitud de este módulo en el registro END. |
Tenga en cuenta que la primera entrada de reubicación de un registro RLD debe tener 8 bytes. Si el campo de bandera de alguna entrada tiene el bit 7 establecido, la entrada siguiente usa los mismos valores para los valores de Reubicación y Posición que esta entrada, y la siguiente entrada tiene 4 bytes, solo tiene los campos de bandera y dirección. Si el campo de bandera de esa entrada tiene el bit 7 activado, esto continúa para la entrada que le sigue; si el bit de bandera de esa entrada no está establecido, la siguiente entrada que le sigue (si hay entradas adicionales en este registro) usa 8 bytes completos. Para hacer esto simple, suponga, por ejemplo, que un programa en C llamado basura llama a la función exit (). | ||||
Campo | Tamaño | Notas | ||
---|---|---|---|---|
Reubicación | 2 | ESDID binario del símbolo a reubicar; este es el símbolo extranjero (salir) | ||
Posición | 2 | ESDID binario donde se realizará la reubicación; este es el módulo que hace referencia al símbolo de reubicación de arriba (basura) | ||
Bandera | 1 | |||
Bits | Significado | |||
0 | Reservado | |||
1 | Si es 1, sume 4 para abordar el valor de longitud constante en los bits 4-5 | |||
2-3 | Valor | Dirección Tipo constante | ||
0 | A - Dirección externa, puede ser una tabla de datos o podría ser un módulo externo | |||
1 | V | |||
2 | Q | |||
3 | CXD | |||
4-5 | Longitud constante de dirección - 1 | |||
6 | Dirección de reubicación (0 para sumar; 1 para restar) La resta generalmente solo se usa para constantes de dirección de tipo A | |||
7 | si es 1, los campos de valor de Posición y Reubicación de la entrada que sigue a esta en este registro RLD son los mismos que esta, y esa entrada tiene solo 4 bytes de longitud. La última entrada de un registro RLD debe borrar este bit. | |||
Habla a | 3 | Dirección absoluta en el módulo de entrada de posición a reubicar. |
Tenga en cuenta que para la información de símbolos, las entradas se empaquetan una tras otra; solo los dos primeros campos están siempre presentes. El campo de nombre se omite si el bit 4 de Organización es 1; los campos posteriores también se omiten para elementos que no son de datos (el bit 0 de Organización es 0). En el caso de un elemento de datos (el bit 0 de la organización es 1), solo los campos de longitud y tipo de datos estarán siempre presentes, y el campo de longitud puede ser de 1 o 2 bytes según el tipo de datos. | |||||
Campo | Byte No. | Tamaño | Notas | ||
---|---|---|---|---|---|
Organización | 1 | 1 | |||
Bits | Valor | Significado | |||
0 | 0 | Tipo sin datos | |||
1 | Tipo de datos | ||||
(Para tipos que no son de datos) | |||||
1-3 | 000 | Espacio | |||
001 | Sección de control | ||||
010 | Sección de control ficticio | ||||
011 | Común | ||||
100 | Instrucción de la máquina | ||||
101 | CCW | ||||
(Para tipo de datos) | |||||
1 | 0 | Sin multiplicidad | |||
1 | Multiplicidad (indica presencia de campo M) | ||||
2 | 0 | Independiente (no es una constante decimal empaquetada o dividida en zonas) | |||
1 | Clúster (constante decimal empaquetada o dividida en zonas) | ||||
3 | 0 | Sin escala | |||
1 | Escala (indica presencia de campo S) | ||||
Tanto de tipo de datos como de no tipo de datos | |||||
4 | 0 | Tiene nombre | |||
1 | Sin nombre proporcionado | ||||
5-7 | Longitud del nombre - 1 | ||||
Habla a | 2 | 3 | Desplazamiento desde el inicio de Csect | ||
Nombre | 0-8 | Si el bit 4 del byte 1 es 1, este campo no está presente, de lo contrario, 1-8 bytes | |||
Los siguientes campos están presentes solo para elementos de datos (el bit 0 del byte 1 es 1) | |||||
Tipo de datos | 1 | Valor en hexadecimal | |||
00 | Carácter (C - Tipo; 2 bytes de longitud) | ||||
04 | Hexadecimal (tipo X; longitud de 2 bytes) | ||||
08 | Binario (tipo B; longitud de 2 bytes) | ||||
10 | Tipo F, entero de 32 bits (longitud de 1 byte, normalmente 4) | ||||
14 | Tipo H, entero de 16 bits (1 byte de longitud, normalmente 2) | ||||
18 | Tipo E, punto flotante de 32 bits (precisión simple) (longitud de 1 byte, normalmente 4) | ||||
1C | Tipo D, punto flotante de 64 bits (precisión doble) (longitud de 1 byte, normalmente 8) | ||||
20 | Dirección o valor de tipo A o tipo Q de 32 bits (longitud de 1 byte, normalmente 4) | ||||
24 | Tipo Y, dirección o valor de 16 bits (longitud de 1 byte, normalmente 2) | ||||
28 | Tipo S (1 byte de longitud) | ||||
2C | Símbolo externo de tipo V de 32 bits (longitud de 1 byte, normalmente 4) | ||||
30 | Tipo P, decimal empaquetado de longitud variable (longitud de 1 byte) | ||||
34 | Tipo Z, decimal con zona de longitud variable (longitud de 1 byte) | ||||
38 | Tipo L (1 byte de longitud) | ||||
Largo | 1 o 2 | Longitud - 1; 2 bytes para caracteres, hexadecimal o binario (es decir, tamaño de 1 a 32,768 bytes); 1 byte para todos los demás tipos (tamaño de 1 a 256 bytes) | |||
Multiplicidad | 0 o 3 | Campo M; recuento de repetición de 3 bytes o valor presunto de 1 (no repetido) si este campo no está presente (el bit 1 de Organización es 0) | |||
Escala | 0 o 2 | Campo S; Valor de escala de 2 bytes (presente solo para datos de tipo F, H, E, D, L, P y Z) o se supone que la escala es 0 si este campo no está presente (el bit 3 de Organización es 0) |
El tipo de registro XSD se agregó en la década de 1990 para permitir que MVS admita nombres de módulo más largos para el compilador de C. | |||||
Campo | Byte No. | Tamaño | Notas | ||
---|---|---|---|---|---|
Marcar Byte 1 | 13 | 1 | Los bits 1-6 se utilizan para XPLINK; El bit 7 se utiliza para AMODE 64; ninguno de estos es usado por el aglutinante; El bit 8 es siempre 0. | ||
Marcar Byte 2 | 14 | 1 | Un poco | Significado | |
1 | El nombre puede tener varias definiciones | ||||
2 | El nombre está destrozado | ||||
3 | Enlace interno | ||||
4 | Plantilla | ||||
5 | Concat | ||||
6 | Nombre elegible para importación o exportación | ||||
7 | 1 si el nombre es una función | ||||
8 | 1 si se asignó el nombre (por ejemplo, #pragma map) | ||||
Largo | 17-20 | 4 | Longitud del nombre | ||
Compensar | 21-24 | 4 | Desplazamiento del primer byte del nombre o subcadena del nombre (origen de 1) | ||
Tipo | 25 | 1 | Valor (hexadecimal) | Tipo de módulo | Que es el modulo |
00 | Dakota del Sur | START, CSECT, DSECT (sección ficticia; no tendrá ningún registro TXT) o Fortran denominado módulo BLOCK DATA | |||
01 | LD | ENTRADA (Definición de etiqueta dentro de un CSECT previamente identificado) | |||
02 | ER | EXTRN (referencia externa) | |||
04 | ordenador personal | Código privado (START o CSECT que no tiene nombre o módulo BLOCK DATA sin nombre de Fortran; este módulo no se puede llamar como una función o subrutina desde otro programa) | |||
05 | CM | Fortran con nombre o en blanco COMÚN (solo proporciona el tamaño; los registros CM nunca tienen registros TXT) | |||
06 | XD (PR) | Sección ficticia externa o pseudo registro | |||
0A | WX | WXTRN (Weak Extern: una rutina externa que no tiene que estar presente para que el módulo funcione) | |||
0B | UR | ||||
Habla a | 26-28 | 3 | Dirección de símbolo de 24 bits | ||
Especificación | 29 | 1 | Depende del tipo de módulo (valor del byte 25) | ||
Tipo de módulo | Valor | Significado | |||
LD ER CM Nulo o WX | Blanco | No utilizado | |||
PR | Factor de alineación | ||||
00 | Alineación de bytes | ||||
01 | Alineación de media palabra | ||||
03 | Alineación de palabras | ||||
07 | Alineación de dos palabras | ||||
SD o PC | Bits 1-2 | No utilizado | |||
Bit 3 | Si es 1, RMODE 64; de lo contrario, utilice el valor del bit 6 | ||||
Poco 4 | Si es 1, AMODE 64; de lo contrario, utilice el valor de los bits 7 y 8 | ||||
Poco 5 | 1 si RSECT | ||||
Poco 6 | 0 = RMODE 24; 1 = RMODE 31; (Ignorado si el bit 3 es 1) | ||||
Bits 7-8 | 00 o 01 = AMODE 24; 10 = AMODE 31; 11 = AMODE cualquiera (ignorado si el bit 4 es 1) | ||||
Longitud o identificador | 30-32 | 3 | Valor | Significado | |
Cero | Si la longitud se especifica en el registro END para los tipos SD, PC, CM | ||||
Largo | Longitud de la sección de control Para los tipos SD, PC, CM; Longitud del pseudoregistro para el tipo PR | ||||
Identificador | Identificador de la entrada SD que contiene el nombre del tipo LD | ||||
Blanco | Si el tipo es ER o WX | ||||
Nombre | 33-72 | Varía | Nombre o subcadena de nombre |
Un módulo termina con los datos del registro END. | |||
Campo | Byte No. | Tamaño | Notas |
---|---|---|---|
Iniciar ESDID | 15-16 | 2 | Para el registro END de tipo 1 (consulte el byte 33) ESDID binario del punto de inicio de este módulo, si se proporciona; espacios en blanco si el registro END de Tipo 2 o no se proporciona. Tenga en cuenta que el ESDID inicial de este módulo puede ser un símbolo externo. Esto permite que un módulo inicie automáticamente una biblioteca en tiempo de ejecución o un código de inicio en lugar de a sí mismo. (El compilador de lenguaje siempre asignaría el mismo nombre al programa principal de un programa que compiló o crearía un nombre de "entrada" de alias, ya sea una entrada SD o LD con un nombre estándar que sea siempre el mismo y al que pueda transferir controlar hasta cuándo estaba listo para iniciar el programa del usuario). |
Nombre de inicio | 17-24 | 8 | Para el registro END de tipo 2 (ver byte 33) el nombre del punto de inicio de este módulo, si se proporciona; espacios en blanco si el registro END de Tipo 1 o no se proporciona |
Tamaño del módulo | 29-32 | 4 | Longitud binaria del módulo en bytes si no se especifica en la entrada SD del registro ESD; el byte 29 es cero si se especificó allí; espacios en blanco si no se proporcionan. Esto permite que un compilador sea esencialmente de "una pasada" y escriba el código objeto en un archivo objeto a medida que lo compiló, luego indique el tamaño del módulo después de haberlo compilado, cuando realmente "sabe" qué tan grande es el programa. |
Formato FIN o recuento IDR | 33 | 1 | Carácter de dígito EBCDIC '1', '2' o en blanco; indica el tipo de formato del registro END. Tenga en cuenta que algunas versiones del ensamblador utilizan este byte para indicar el número de registros de identificador (IDR) (valores en los bytes 34–52, o en 53–71 si están presentes) que se encuentran en este registro. El espacio en blanco puede significar que hay 1 registro presente, o ninguno, o puede usarse para indicar que es un registro de ensamblador de tipo 1. Los campos de identificador son esencialmente un campo de comentario, por lo que podrían usarse posiblemente para cualquier cosa (especialmente el campo Número de pedido), o podrían estar en blanco. |
Tenga en cuenta que los bytes 34–52 se denominan colectivamente un registro IDR. Los bytes 53–71 se conocen como registro IDR secundario. Pueden estar en blanco o ambos. Además, a diferencia de otros campos de información que contienen números, los valores en un IDR son todos texto y ninguno se expresa en binario. | |||
N º de pedido. | 34-43 | 9 | Número de orden del ensamblador o identificador del compilador, puede tener letras o dígitos |
Versión | 44-45 | 2 | Número de versión de 2 dígitos del ensamblador o compilador |
Revisión | 46-47 | 2 | Número de revisión de 2 dígitos del ensamblador o compilador |
Año de ejecución | 48-49 | 2 | Los dos últimos dígitos del año en que se ejecutó este ensamblaje o se compiló el programa, por ejemplo, 80 para 1980 o 2080. Dado cuando se desarrolló el formato, 00 y los números superiores a 63 probablemente pertenecen al siglo XX (1964-2000) y todos los números por encima de 0 y los menores de 64 años probablemente estén en el puesto 21 (2001-2063). |
Día de ejecución | 50-52 | 3 | Día del año de 3 dígitos en que se ejecutó esta asamblea o se compiló el programa, por ejemplo, 001 para el 1 de enero; 032 para el 1 de febrero, etc. Los números posteriores a 059 (lo que siempre significaría el 28 de febrero) podrían ser un día o el día después de esa fecha, dependiendo de si el programa original se compiló o ensambló en un año bisiesto; 060 sería el 29 de febrero en un año bisiesto o el 1 de marzo en cualquier otro año. 365 sería el 30 o 31 de diciembre dependiendo de si el año en que se compiló fue bisiesto o no. 366 siempre significaría un módulo ensamblado o compilado el 31 de diciembre de un año bisiesto. |
Identificador adicional | 53-71 | 18 | Es esencialmente el mismo formato que 33–52 si se incluye, o son espacios en blanco. |
Referencias
- ^ OS / VS - VM / 370 Assembler Programmer's Guide , GC33-4021-4, Fifth Edition, IBM, San Jose, CA (septiembre de 1982) http://www.textfiles.com/bitsavers/pdf/ibm/370/asm /GC33-4021-4_OS_VS_VM_370_Assembler_Programmers_Guide_Sep82.pdf
- ^ Manual de referencia del ensamblador VS / 9: Guía de programación para las computadoras mainframe de las series Univac 90/60, 90/70 y 90/80 , Sperry Univac, Cinnamonson, Nueva Jersey, 1978
- ^ Manual de referencia de ASSEMBH , U5223-J-Z125-3-7600, Fujitsu Technology Solutions GmbH, junio de 2010, http://manuals.ts.fujitsu.com/file/957/assh_bs.pdf (Consultado el 7 de agosto de 2013)
- ^ High Level Assembler for z / OS & z / VM & z / VSE Programmer's Guide , Apéndice C. Release 6, SC26-4941-05, IBM, San Jose, CA, julio de 2008 http://publibfp.boulder.ibm. com / cgi-bin / bookmgr / download / asmp1020.pdf ( obtenido el 27 de marzo de 2010)
- ^ Declaraciones de control del sistema IBM z / VSE: Versión 5 Release 1 , SC34-2637-00, IBM, 1984, 2011.
- OS / MVS Program Management: Advanced Facilities , SA22-7644-07, octava edición, IBM, Poughkeepsie, NY, octava edición, septiembre de 2007 http://publibz.boulder.ibm.com/epubs/pdf/iea2b270.pdf (recuperado 9 de agosto de 2013
- John R. Ehrman, How the Linkage Editor Works: A Tutorial on Object / Load Modules, Link Editors, Loaders, and What They Do for (and to) You , IBM Silicon Valley (Santa Teresa) Laboratory, San José, 1994, 2001 ftp://ftp.boulder.ibm.com/software/websphere/awdtools/hlasm/s8169a.pdf (Consultado el 29 de julio de 2013)