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 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 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.
[…] 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)
…]
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. […]
{{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]4DOS5TIP.TXT
archivo, que es parte de la MPDOSTIP.ZIP
colección). [17]