El prefijo de segmento de programa (PSP) es una estructura de datos que se utiliza en los sistemas DOS para almacenar el estado de un programa . Se asemeja a la Cero página en el CP / M sistema operativo. El PSP tiene la siguiente estructura:
Imágenes compensadas | Tamaño | Contenido |
---|---|---|
00h-01h | 2 bytes (código) | Salida similar a CP / M-80 (siempre contiene INT 20h ) [1] |
02h-03h | palabra (2 bytes) | Segmento del primer byte más allá de la memoria asignada al programa |
04h | byte | Reservado |
05h-09h | 5 bytes (código) | Entrada de llamada remota similar a CP / M-80 en DOS y tamaño del segmento del programa [1] [2] |
0Ah-0Dh | dword (4 bytes) | Terminar dirección del programa anterior (antiguo INT 22h ) |
0Eh-11h | dword | Romper la dirección del programa anterior (antiguo INT 23h ) |
12h-15h | dword | Dirección de error crítico del programa anterior (antiguo INT 24h ) |
16h-17h | palabra | Segmento de PSP de los padres (normalmente COMMAND.COM - interno) |
18h-2Bh | 20 bytes | Tabla de archivos de trabajo (JFT) (interna) |
2 canales-2Dh | palabra | Segmento medioambiental |
2Eh-31h | dword | SS: SP al entrar a la última llamada INT 21h (interna) |
32h-33h | palabra | Tamaño JFT (interno) |
34h-37h | dword | Puntero a JFT (interno) |
38h-3Bh | dword | Puntero a PSP anterior (solo utilizado por SHARE en DOS 3.3 y posteriores) |
3Ch-3Fh | 4 bytes | Reservado |
40h-41h | palabra | Versión de DOS para regresar (DOS 4 y posterior, modificable a través de SETVER en DOS 5 y posterior) |
42h-4Fh | 14 bytes | Reservado |
50h-52h | 3 bytes (código) | Entrada de llamada remota similar a Unix en DOS (siempre contiene INT 21h + RETF) |
53h-54h | 2 bytes | Reservado |
55h-5Bh | 7 bytes | Reservado (se puede utilizar para convertir el primer FCB en un FCB ampliado) |
5Ch-6Bh | 16 bytes | Estándar sin abrir FCB 1 |
6Ch-7Fh | 20 bytes | FCB 2 estándar sin abrir (se sobrescribe si el FCB 1 está abierto) |
80h | 1 byte | Número de bytes en la línea de comandos |
81h-FFh | 127 bytes | Cola de línea de comandos (terminada por 0Dh ) [3] [4] |
El PSP se utiliza con mayor frecuencia para obtener los argumentos de la línea de comandos de un programa de DOS; por ejemplo, el comando "FOO.EXE / A / F" ejecuta FOO.EXE con los argumentos '/ A' y '/ F'.
Si la entrada de PSP para la longitud de la línea de comando no es cero y el puntero al segmento de entorno no es 0000h ni FFFFh, los programas primero deben intentar recuperar la línea de comando de la variable de entorno % CMDLINE% antes de extraerla del PSP. De esta forma, es posible pasar líneas de comando de más de 126 caracteres a las aplicaciones.
La dirección de segmento del PSP se pasa al registro DS cuando se ejecuta el programa. También se puede determinar más tarde utilizando la función Int 21h 51h o la función Int 21h 62h. Cualquiera de las funciones devolverá la dirección PSP en el registro BX. [5]
Alternativamente, en los programas .COM cargados con una compensación de 100 h , uno puede dirigirse directamente al PSP usando las compensaciones enumeradas anteriormente. Offset 000h apunta al comienzo del PSP, 0FFh apunta al final, etc.
Por ejemplo, el siguiente código muestra los argumentos de la línea de comando:
org 100h ; .COM - no usa ds; La subfunción 9 de INT 21h requiere '$' para terminar la cadena xor bx , bx mov bl , [ 80h ] cmp bl , 7Eh ja exit ; previniendo el desbordamientomov byte [ bx + 81h ], '$'; imprime la cadena mov ah , 9 mov dx , 81h int 21hsalida: mov ax , 4C00h ; subfunción 4C int 21h
En DOS 1.x, era necesario que el registro CS (segmento de código) contuviera el mismo segmento que el PSP al finalizar el programa, por lo que la práctica de programación estándar implicaba guardar el registro DS en la pila al inicio del programa (ya que el registro DS es cargado con el segmento PSP) y terminando el programa con una instrucción RETF, que sacaría el valor del segmento guardado de la pila y saltaría a la dirección 0 del PSP, que contenía una instrucción INT 20h.
; guardar empujar ds xor hacha , hacha empujar hacha; mover al grupo de datos predeterminado (@data) mov ax , @ data mov ds , ax; imprimir mensaje en mess1 (21h subfunción 9) mov dx , mess1 mov ah , 9 int 21hretf
Si el ejecutable era un archivo .COM, este procedimiento era innecesario y el programa podía terminarse simplemente con una instrucción INT 20h directa o bien llamando a la función 0 de INT 21h. Sin embargo, el programador aún tenía que asegurarse de que el registro CS contenía la dirección del segmento. del PSP al finalizar el programa. Por lo tanto,
inicio jmpmess1 db '¡Hola mundo! $'inicio: mov dx , mess1 mov ah , 9 int 21hint 20h
En DOS 2.xy versiones posteriores, la terminación del programa se logró con la función INT 21h 4Ch, que no requería que el registro CS contenga el valor del segmento de la PSP.
Ver también
- Página cero (CP / M)
- LLAME 5 (DOS)
- Marco de pila (Unix) [6]
- Directorio de procesos (Multics) [6]
- Identificador de proceso (PID) [6]
- esto (programación de computadoras)
- Autorreferencia
Referencias
- ^ a b Taylor, Roger; Lemmons, Phil (junio de 1982). "Migración ascendente - Parte 1: Traductores - Uso de programas de traducción para mover programas CP / M-86 a CP / M y MS-DOS" (PDF) . BYTE . Vol. 7 no. 6. BYTE Publications Inc. págs. 321–322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344 [342, 344]. ISSN 0360-5280 . CODEN BYTEDJ . Archivado (PDF) desde el original el 16 de enero de 2020 . Consultado el 15 de enero de 2020 .
[…] Obtener acceso a CP / M-86 […] Obtener acceso a CP / M-86 requiere colocar el código de función en el registro CL, colocar el parámetro de byte en el registro DL o colocar el parámetro de palabra en el registro DX, colocar el segmento de datos en el registro DS (el segmento de datos generalmente no se cambia para un programa convertido) y ejecutar una interrupción de software, INT # 224 . El resultado se devuelve en el registro AL si es un valor de byte; si el resultado es un valor de palabra, se devuelve en los registros AX y BX. Los valores de palabra doble se devuelven con el desplazamiento en los registros BX y el segmento en el registro ES. La conversión de programas de CP / M-80 a CP / M-86, entonces, requiere reemplazar la llamada a la ubicación 5 con la interrupción de software INT # 224. Otro cambio necesario tiene que ver con la bota cálida . Bajo CP / M-80, se puede acceder al arranque en caliente mediante una llamada al sistema con un código de función de 0 para un salto a la ubicación O. Sin embargo, CP / M-86 no admite el salto a la ubicación O. Como resultado , debe cambiar la salida de este programa en el programa traducido para que el programa se ejecute correctamente. Siempre que la llamada a la ubicación 5 se reemplace con INT # 224, que se realice el cambio de arranque en caliente y que los registros estén mapeados correctamente, debería haber pocos problemas para que el programa traducido acceda a las funciones del sistema CP / M-86 . […] Obtener acceso a MS-DOS […] Aunque MS-DOS tiene un mecanismo "preferido" a través de una interrupción de software, INT # 33 , para acceder al sistema, se proporciona un mecanismo adicional para programas "preexistentes" que es compatible con las convenciones de llamada CP / M-80, al menos para funciones en el rango de 0-36. En lo que respecta a las llamadas al sistema dentro del rango de funciones permitidas, el programador no tiene que hacer nada con los programas traducidos para que se ejecuten en MS-DOS, aparte de mapear correctamente los registros. MS-DOS también admite la función de arranque en caliente de CP / M-80. Un salto a la ubicación 0 en MS-DOS ejecuta una interrupción de software, INT # 32 , que es funcionalmente un final de programa y la forma normal de salir de un programa. […]
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] (13 páginas) - ^ Necasek, Michal (13 de septiembre de 2011). "¿Quién necesita la dirección envolvente, de todos modos?" . Museo OS / 2 . Archivado desde el original el 19 de febrero de 2020 . Consultado el 19 de febrero de 2020 .
[…] 86-DOS , y por lo tanto PC DOS / MS-DOS , utilizaron un truco ingenioso. El byte en el desplazamiento 5 de la PSP contenía un código de operación de llamada lejana (9Ah); la palabra en el desplazamiento 6 del PSP contenía el valor apropiado para indicar el tamaño del segmento del programa, y también la parte del desplazamiento de la llamada lejana. La palabra en el desplazamiento 8, que sirvió como parte del segmento de la llamada lejana, se diseñó de manera que cuando se combinara con el desplazamiento, se envolvería (una característica bien entendida de la CPU 8086 ) y apuntaría a la dirección 0: C0h, que contiene vector de interrupción 30h. […] La interfaz CALL 5 funciona incluso en emulación de DOS bajo Windows NT y OS / 2, y esos sistemas ciertamente no pueden ejecutarse con la línea A20 desactivada. ¿Cómo funciona eso entonces? […] En lugar de cortar los bits de dirección, el sistema refleja los cinco bytes en 0: C0h en 1000C0h. De hecho, la misma técnica se había utilizado en DOS 5 y versiones posteriores que se ejecutaban con DOS = HIGH . En ese caso, DOS se asegura de que la dirección lineal 1000C0h contenga la llamada lejana adecuada. […]
- ^ Paul, Matthias R. (1 de julio de 1997) [1 de enero de 1994]. MSDOSTIPs: consejos para la comunicación con MS-DOS 5.0-7 . MPDOSTIP (en alemán). Archivado desde el original el 22 de agosto de 2017 . Consultado el 25 de octubre de 2013 .(NB. MSDOSTIP.TXT es parte de MPDOSTIP.ZIP, mantenido hasta 2001 y distribuido en muchos sitios en ese momento. El enlace provisto apunta a una versión anterior convertida en HTML del archivo MSDOSTIP.TXT). [15]
- ^ Paul, Matthias R. (1 de mayo de 1997) [1 de marzo de 1995]. "Hinweise zu JPSofts 4DOS 5.5b / c, 5.51, 5.52a und NDOS" . MPDOSTIP (en alemán). Archivado desde el original el 4 de noviembre de 2016 . Consultado el 8 de mayo de 2015 .(NB. El enlace provisto apunta a una versión convertida en HTML del
4DOS5TIP.TXT
archivo, que es parte de laMPDOSTIP.ZIP
colección). [16] - ^ "INT 21h, 62h - Obtener la dirección de PSP (DOS 3.x)" . Archivado desde el original el 7 de febrero de 2012.
- ^ a b c Schulman, Andrew; Brown, Ralf D .; Maxey, David; Michels, Raymond J .; Kyle, Jim (1994) [noviembre de 1993]. DOS sin documentar: una guía del programador para las funciones y estructuras de datos reservadas de MS-DOS, expandida para incluir MS-DOS 6, Novell DOS y Windows 3.1 (2 ed.). Reading, Massachusetts, EE.UU .: Addison Wesley . ISBN 0-201-63287-X. ISBN 978-0-201-63287-3 .(xviii + 856 + vi páginas, 3.5 "-floppy) Fe de erratas: [17] [18]
Otras lecturas
- 86-DOS - Sistema operativo de disco para el 8086 - Manual del programador (PDF) . Versión 0.3 (edición preliminar). Seattle, Washington, EE.UU .: Seattle Computer Products, Inc. 1980. Archivado desde el original (PDF) el 23 de junio de 2019 . Consultado el 13 de septiembre de 2011 . (41 páginas)
- "Formato de prefijo de segmento de programa (PSP)" . INTER61 . 2000. Archivado desde el original el 17 de febrero de 2020 . Consultado el 19 de diciembre de 2019 .
- Schäpers, Arne (1991). "Kapitel 5: EXEC im Detail - Prefijo de segmento de programa (PSP)". DOS 5 für Programmierer: Die endgültige Referenz (en alemán) (1 ed.). Addison Wesley (Deutschland) GmbH . págs. 148-151, 971-972. ISBN 3-89319-350-2. (1123 + v páginas, desplegable, 5,25 "-floppy)
enlaces externos
- Acceso a los argumentos de la línea de comandos (Microsoft.com)