stringtranslate.com

Prefijo del segmento del programa

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 parece a la página cero del sistema operativo CP/M . El PSP tiene la siguiente estructura:

El PSP se utiliza 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 de 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 PSP. De esta manera, es posible pasar líneas de comandos de más de 126 caracteres a las aplicaciones.

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

Como alternativa, en los programas .COM cargados en offset 100h, se puede acceder al PSP directamente utilizando simplemente los offsets enumerados anteriormente. Offset 000hapunta al comienzo del PSP, 0FFhapunta al final, etc.

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

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 desbordamiento      byte mov [ bx + 81h ], '$'  ; imprime la cadena mov ah , 9 mov dx , 81h int 21h   salida: 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 (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 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 ax , ax empujar ax   ; moverse 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 21h   retracto

Si el ejecutable era un archivo .COM, este procedimiento no era necesario 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 todavía tenía que asegurarse de que el registro CS contuviera la dirección del segmento del PSP al finalizar el programa. Por lo tanto,

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

En DOS 2.x y superiores, la terminación del programa se lograba con la función INT 21h 4Ch que no requería que el registro CS contuviera el valor del segmento del PSP.

Véase también

Referencias

  1. ^ ab Taylor, Roger; Lemmons, Phil (junio de 1982). "Upward immigration - Part 1: Translators - Using translation programs to move CP/M-86 programs to CP/M and MS-DOS" [Usando programas de traducción para mover programas CP/M a CP/M-86 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 2020-01-16 . Consultado el 2020-01-15 . […] Para obtener acceso a CP/M-86 […] Para obtener acceso a CP/M-86 es necesario colocar el código de función en el registro CL, el parámetro de byte en el registro DL o el parámetro de palabra en el registro DX, el segmento de datos en el registro DS (el segmento de datos no suele modificarse en el caso de 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. Por lo tanto, la conversión de programas de CP/M-80 a CP/M-86 requiere reemplazar la llamada a la ubicación 5 por la interrupción de software INT #224. Otro cambio necesario implica el arranque en caliente . En 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 de 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 muchos 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 a 36. En lo que respecta a las llamadas al sistema dentro del rango de funciones permitido, el programador no tiene que hacer nada con los programas traducidos para que se ejecuten en MS-DOS, excepto asignar correctamente los registros. MS-DOS también admite la función de arranque en caliente de CP/M-80. Un salto a la posición 0 en MS-DOS ejecuta una interrupción de software, INT #32 , que es funcionalmente un fin 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)
  2. ^ Paul, Matthias R. (2002-10-07) [2000]. "Re: Ejecutar un archivo COM". Grupo de noticias : alt.msdos.programmer. Archivado desde el original el 2017-09-03 . Consultado el 2017-09-03 .[15] (NB. Tiene detalles sobre las convenciones de llamada de programas COM de DOS).
  3. ^ Necasek, Michal (13 de septiembre de 2011). "¿Quién necesita el envoltorio de direcciones, 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 , usaban un truco inteligente. 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 parte del segmento de la llamada lejana, se diseñó de tal manera que, cuando se combinaba con el desplazamiento, se envolvía (una característica bien entendida 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 emulación DOS bajo Windows NT y OS/2, y esos sistemas ciertamente no pueden funcionar con la línea A20 deshabilitada. ¿Cómo funciona eso entonces? […] En lugar de cortar bits de dirección, el sistema refleja los cinco bytes en 0:C0h en 1000C0h. La misma técnica se había utilizado de hecho en DOS 5 y superior ejecutándose 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 ) (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 a HTML del archivo MSDOSTIP.TXT.) [16]
  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 .(NB: El enlace proporcionado apunta a una versión convertida a HTML del 4DOS5TIP.TXTarchivo, que es parte de la MPDOSTIP.ZIPcolección). [17]
  6. ^ "INT 21h,62h - Obtener dirección PSP (DOS 3.x)". Archivado desde el original el 7 de febrero de 2012.
  7. ^ abc Schulman, Andrew; Brown, Ralf D .; Maxey, David; Michels, Raymond J.; Kyle, Jim (1994) [noviembre de 1993]. DOS no documentado: 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.ª edición). Reading, Massachusetts, EE. UU.: Addison Wesley . ISBN 0-201-63287-X.(xviii+856+vi páginas, disquete de 3,5") Erratas: [18][19]

Lectura adicional

Enlaces externos