Articulo de referencia

Prefijo del segmento del programa

El prefijo de segmento de programa (PSP) es una estructura de datos utilizada en sistemas DOS para almacenar el estado de un programa . Se asemeja a la página cero del sistema o...

El prefijo de segmento de programa (PSP) es una estructura de datos utilizada en sistemas DOS para almacenar el estado de un programa . Se asemeja a la página cero del sistema operativo CP/M . El PSP tiene la siguiente estructura:

La PSP se usa con mayor frecuencia para obtener los argumentos de la línea de comandos de un programa DOS; por ejemplo, el comando "FOO.EXE /A /F" ejecuta FOO.EXE con los argumentos '/A' y '/F'.

Si la entrada PSP para la longitud de la línea de comandos no es cero y el puntero al segmento de entorno no es ni 0000h ni FFFFh , los programas deben intentar primero recuperar la línea de comandos de la variable de entorno %CMDLINE% antes de extraerla de la PSP. De esta forma, es posible pasar líneas de comandos de más de 126 caracteres a las aplicaciones.

La dirección del segmento del PSP se pasa en el registro DS cuando se ejecuta el programa. También se puede determinar posteriormente utilizando la función 51h o la función 62h de la instrucción Int 21h. Cualquiera de las dos funciones devolverá la dirección del PSP en el registro BX. [ 6 ]

Alternativamente, en los programas .COM cargados en el desplazamiento 100h, se puede acceder directamente al PSP simplemente usando los desplazamientos mencionados anteriormente. El desplazamiento 000hapunta al inicio del PSP, 0FFhapunta al final, etc.

Por ejemplo, el siguiente código muestra los argumentos de la línea de comandos:

org 100h ; .COM - no utiliza ds; INT 21h subfunción 9 requiere '$' para terminar la cadena xor bx , bx mov bl ,[ 80h ] cmp bl , 7Eh ja exit ; evitando 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 (Code Segment) 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 (ya que el registro DS se carga con el segmento PSP) junto con una palabra cero en la pila al inicio del programa y finalizar el programa con una instrucción RETF, que extraía el valor del segmento guardado de la pila y saltaba a la dirección 0 del PSP, que contenía una instrucción INT 20h.

; guardar empujar ds xor ax , ax empujar ax; mover al grupo de datos predeterminado (@data) mov ax , @ data mov ds , ax; imprimir mensaje en mess1 (subfunción 9 de 21h) 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 llamando a la función INT 21h 0. Sin embargo, el programador aún tenía que asegurarse de que el registro CS contuviera la dirección de segmento del PSP al finalizar el programa. Por lo tanto,

inicio de saltomess1 db '¡Hola mundo!$'inicio: mov dx , mess1 mov ah , 9 int 21hint 20h

En DOS 2.x y versiones posteriores, la terminación del programa se realizaba mediante la función 4Ch de la instrucción INT 21h, que no requería que el registro CS contuviera el valor del segmento del PSP.

Véase también

Referencias

  1. 1 2 Taylor, Roger; Lemmons, Phil (junio de 1982). "Migración ascendente - Parte 1: Traductores - Uso de programas de traducción para trasladar programas de CP/M-86 a CP/M y MS-DOS" [ Uso de programas de traducción para trasladar programas de CP/M a CP/M-86 y MS-DOS ] (PDF) . BYTE . Vol.  7, n.º  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) del original el 16 de enero de 2020. Recuperado el 15 de enero de 2020 . […] Acceso a CP/M-86 […] Para acceder a CP/M-86 se requiere colocar el código de función en el registro CL, colocar el parámetro de byte en el registro DL o 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 modifica 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 doble palabra 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 implica el arranque en caliente . 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 0. Sin embargo, CP/M-86 no admite el salto a la ubicación 0. Como resultado, debe cambiar esta salida del 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 se asignen correctamente, no debería haber mayores problemas para que el programa traducido acceda a las funciones del sistema CP/M-86. […] Obtención de 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 de 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 permitido, el programador no tiene que hacer nada a los programas traducidos para que se ejecuten en MS-DOS, salvo asignar 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 en la práctica es el final de un programa y la forma habitual de salir de él. […](13 páginas)
  2. Paul, Matthias R. (2002-10-07) [2000]. "Re: Ejecutar un archivo COM" . Grupo de noticias : alt.msdos.programmer . Recuperado el 2017-09-03 . {{cite newsgroup}}: CS1 maint: servicio de archivado obsoleto ( enlace )(Nota: Incluye detalles sobre las convenciones de llamada a programas COM de DOS).
  3. Necasek, Michal (13 de septiembre de 2011). "¿Quién necesita el desbordamiento de direcciones, de todos modos?" . Museo OS/2 . Archivado del original el 19 de febrero de 2020 . Recuperado el 19 de febrero de 2020 . […] 86-DOS , y por lo tanto PC DOS / MS-DOS , usaban un truco ingenioso. El byte en el desplazamiento 5 del 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 de desplazamiento de la llamada lejana. La palabra en el desplazamiento 8, que servía como la parte del segmento de la llamada lejana, estaba diseñada de tal manera que cuando se combinaba con el desplazamiento, se desbordaba (una característica bien conocida de la CPU 8086 ) y apuntaba a la dirección 0:C0h, que contiene el vector de interrupción 30h. […] La interfaz CALL 5 funciona incluso en la emulación de DOS bajo Windows NT y OS/2, y esos sistemas ciertamente no pueden ejecutarse con la línea A20 deshabilitada. ¿Cómo funciona entonces? […] En lugar de recortar bits de dirección, el sistema duplica 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 apropiada. […]
  4. ^ Paul, Matthias R. (1 de julio de 1997) [1 de enero de 1994]. MSDOSTIP : consejos para el uso de MS-DOS 5.0-7 (en alemán). Archivado desde el original el 22 de agosto de 2017 . Consultado el 25 de octubre de 2013 .{{cite book}}: |work=ignorado ( ayuda ) (Nota: MSDOSTIP.TXT forma parte de MPDOSTIP.ZIP, mantenido hasta 2001 y distribuido en muchos sitios en ese momento. El enlace proporcionado apunta a una versión anterior del archivo MSDOSTIP.TXT convertida a HTML).
  5. ^ Paul, Matías R. (1 de mayo de 1997) [1 de marzo de 1995]. "Hinweise zu JPSofts 4DOS 5.5b/c, 5.51, 5.52a y NDOS" . MPDOSTIP (en alemán). Archivado desde el original el 4 de noviembre de 2016 . Consultado el 8 de mayo de 2015 .(Nota: El enlace proporcionado apunta a una versión del 4DOS5TIP.TXTarchivo convertida a HTML, que forma parte de la MPDOSTIP.ZIPcolección).
  6. "INT 21h,62h - Obtener dirección de PSP (DOS 3.x)" . Archivado del original el 7 de febrero de 2012.
  7. 1 2 3 Schulman, Andrew; Brown, Ralf D .; Maxey, David; Michels, Raymond J.; Kyle, Jim (1994) [noviembre de 1993]. Undocumented DOS: Guía del programador para funciones y estructuras de datos reservadas de MS-DOS, ampliada para incluir MS-DOS 6, Novell DOS y Windows 3.1 (2.ª ed.). Reading, Massachusetts, EE. UU.: Addison Wesley . ISBN  0-201-63287-X.(xviii+856+vi páginas, disquete de 3,5") Erratas:

Lecturas adicionales

  • 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 del original (PDF) el 23 de junio de 2019. Consultado el 13 de septiembre de 2011 .(41 páginas)
  • "Formato del prefijo del segmento de programa (PSP)" . INTER61 . 2000. Archivado del 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, disquete de 5,25")
  • Acceso a los argumentos de la línea de comandos (Microsoft.com)