Академический Документы
Профессиональный Документы
Культура Документы
Antes de que el COMMAND.COM pase el control al programa que se pretende ejecutar, se crea un
bloque de 256 bytes llamado PSP (Program Segment Prefix), cuya descripción detallada se verá en el
próximo capítulo. En él aparecen datos tales como la dirección de retorno al dos cuando finalice el programa,
la dirección de retorno en caso de Ctrl-Break y en caso de errores críticos. Además de la cantidad de memoria
disponible y los posibles parámetros suministrados del programa. Cuando el programa toma el control, DS
y ES apuntan al PSP. Tipos de programas:
Si el programa es COM podemos terminarlo con la interrupción 20h (INT 20h), o simplemente con
un RET si la pila no está desequilibrada (apunta a un INT 20h que hay en la posición 0 del PSP); otra
manera de acabar es por medio de la función 4Ch del sistema (disponible desde el DOS 2.0) que acaba
cualquier programa sin problemas y sin ningún tipo de requerimientos adicionales, tanto COM como EXE.
Los programas de tipo COM se cargan en memoria tal y como están en disco, entregándoseles el
control. Los de tipo EXE, que pueden llegar a manejar múltiples segmentos de código de hasta 64 Kb, se
almacenan en disco «semiensamblados». En realidad, al ser cargados en memoria, el DOS tiene que realizar
la última fase de montaje, calculando las direcciones de memoria absolutas. Por ello, estos programas tienen
un formato especial en disco, generado por los ensambladores y compiladores, y su imagen en memoria no
se corresponde realmente con lo que está grabado en el disco, aunque esto al usuario no le importe. Por ello,
no se extrañe el lector de haber visto alguna vez ficheros EXE de más de 640 Kb: evidentemente, no se
cargan enteros en memoria aunque lo parezca. Los programas COM no hacen referencias a datos o
direcciones separados más de 64 Kb, por lo que todos los saltos y desplazamientos son relativos a los
registros de segmento (no se cambia CS ni DS) con lo que no es necesaria la fase de «montaje». No obstante,
un programa COM puede hacer lo que le de la gana con los registros de segmento y acceder a más de 64
Kb de memoria, por cuenta y riesgo del programador. En general, la programación en ensamblador está hoy
en día relegada a pequeños programas residentes, controladores de dispositivos o rutinas de apoyo a
programas hechos en otros lenguajes, por lo que no es estrictamente necesario trabajar con programas EXE
realizados en ensamblador. Salvo excepciones, la mayoría de los programas desarrollados en este libro serán
de tipo COM ya que los EXE ocuparían algo más, aunque el ensamblador da algo más de comodidad al
programador en los mismos.
El siguiente ejemplo escribe una cadena en pantalla llamando a uno de los servicios estándar de
impresión del DOS (función 9 de INT 21h):
92 EL UNIVERSO DIGITAL DEL IBM PC, AT Y PS/2
Olvidándonos de los comentarios que comienzan por «;», en las primeras lineas las directivas EQU
definen dos constantes para el preprocesador del compilador: cr=13 y lf=10. El programa, de tipo COM,
consta de un único segmento. La directiva ASSUME indica que, por defecto, las instrucciones máquina se
ensamblarán para el registro CS en este segmento (lo más lógico, por otra parte); también conviene asumir
el registro DS, de lo contrario, si hubiera que acceder a una variable, el ensamblador añadiría el prefijo del
segmento CS a la instrucción al no estar seguro de que DS apunta a los datos, consumiendo más memoria.
Se pueden añadir los demás registros de segmento en el ASSUME, aunque es redundante. El ORG 100h es
obligatorio en programas COM, ya que estos programas serán cargados en memoria en la posición CS:100h.
Al final, la dirección del texto a imprimir se coloca en DS:DX (CS=DS=ES=SS en un programa COM recién
ejecutado) y se llama al DOS. El carácter ’$’ delimita la cadena a imprimir, lo cual es una herencia del CP/M
(sería más interesante que fuera el 0 el delimitador) por razones históricas. Se acaba el programa con INT
20h. El punto de arranque es indicado con la directiva END, aunque en realidad en los programas COM el
punto indicado (en el ejemplo, «inicio») debe estar forzosamente al principio del programa. Obsérvese que
no se genera código hasta llegar a la línea «inicio:», todo lo anterior son directivas.
Los programas EXE (listado en la página siguiente) requieren algo más de elaboración. En primer
lugar, es necesario definir una pila y reservar espacio para la misma. Al contrario que los programas COM
(cuya pila se sitúa al final del segmento compartido también con el código y los datos) esta característica
obliga a definir un tamaño prudente en función de las necesidades del programa. Téngase en cuenta que en
la pila se almacenan las direcciones de retorno de las subrutinas y al llamar a una función de la BIOS la pila
es usada con intensidad. En general, con medio kilobyte basta para programas tan sencillos como el del
ejemplo, e incluso para otros mucho más complejos. El límite máximo está en 64 Kb. El segmento de pila
se nombra siempre STACK y con el TLINK de Borland es necesario indicar también la clase ’STACK’.
Como se ve, son definidos por separado el segmento de código, pila y datos, lo que también ayuda
a estructurar más el programa. El segmento de código se define como procedimiento FAR, entre otras razones
para que el ensamblador ensamble el RET del final (con el que se vuelve al DOS) como un RETF. La
directiva ASSUME asocia cada registro de segmento con su correspondiente segmento. Como puede
observarse al principio del programa, es necesario preparar «a mano» la dirección de retorno al sistema. El
PUSH DS del principio coloca el segmento del PSP en la pila; el XOR AX,AX coloca un cero en AX (esta
instrucción gasta un byte menos que MOV AX,0) y el PUSH AX mete ese 0 en la pila. Con ello, al volver
EL ENSAMBLADOR EN ENTORNO DOS 93
al DOS con RET (RETF en realidad) el control pasará a DS:0, esto es, a la primera instrucción del PSP (INT
20h). Aunque pueda parecer un tanto lioso, es un juego de niños y estas tres instrucciones consecutivas
(PUSH DS / XOR AX,AX / PUSH AX) son la manera de empezar de cientos de programas EXE, que
después acaban con RET. En general, a partir del DOS 2.0 es más aconsejable terminar el programa con la
función 4Ch del DOS, que no requiere que CS apunte al PSP ni precisa de preparación alguna en la pila y
además permite retornar un código de ERRORLEVEL en AL: en los programas futuros esto se hará con
bastante frecuencia.
También debe observarse cómo se inicializa DS, ya que en los programas EXE por defecto no apunta
a los datos. Ahora puede preguntarse el lector, por curiosidad, ¿qué valdrá «datos»?: datos tiene un valor
relativo asignado por el ensamblador; cuando el programa sea cargado en memoria, en el proceso de montaje
y en función de cuál sea la primera posición de memoria libre, se le asignará un valor determinado por el
montador del sistema operativo.
cr EQU 13
lf EQU 10
; Segmento de datos
datos SEGMENT
texto DB cr,lf,"Texto a imprimir",cr,lf,"$"
datos ENDS
; Segmento de pila
; Segmento de código
codigo SEGMENT
ejemplo PROC FAR
ASSUME CS:codigo, DS:datos, SS:pila
; escribir texto
; volver al DOS
ejemplo ENDP
Programa EXE
94 EL UNIVERSO DIGITAL DEL IBM PC, AT Y PS/2
6.4.1. - TASM/MASM.
Es el programa que convierte nuestro listado fuente en código objeto, es decir, lenguaje máquina en
el que sólo faltan las referencias a rutinas externas. Permite la obtención de listados de código y de
referencias cruzadas (símbolos, etiquetas, variables). En general, bastará con hacer TASM nombre_programa
(se supone la extensión .ASM por defecto). El fichero final tiene extensión OBJ. En general, la sintaxis del
TASM y MASM es más o menos equivalente: en el primero se obtiene ayuda con /H y en el segundo con
/HELP. Con TASM, cuando se va a obtener la versión definitiva del programa, o si éste es corto -o el
ordenador rápido- merece la pena utilizar el parámetro /m3, con objeto de que de dos/tres pasadas y optimize
más el código. Por su lado, MASM presenta estadísticas adicionales si se indica /v y se puede cambiar con
/Btamaño el nº de Kb de memoria que destina al fichero fuente, entre 1 y 63. La sintaxis es (tanto para
TASM como MASM):
Se puede omitir el fichero de listado y el de referencias cruzadas. Cuando se emplea MASM 6.X,
para ensamblar los listados de este libro hay que indicar la opción /Zm para mantener la compatibilidad con
las versiones anteriores del ensamblador, siendo además obligatorio indicar la extensión; como se genera
directamente el fichero EXE hay que indicar /c si se desea evitar esto (si no se quiere que linke). La sintaxis
quedaría:
ML /Zm fihero_fuente.asm
A continuación se listan los parámetros comunes a TASM 2.0 (y posterior) y MASM 4.0/5.0 (NO la 6.X):
6.4.2. - TLINK/LINK.
El montador o linkador permite combinar varios módulos objeto, realizando las conexiones entre ellos
y, finalmente, los convierte en módulo ejecutable de tipo EXE (empleando el ML de MASM 6.X se obtiene
EL ENSAMBLADOR EN ENTORNO DOS 95
directamente el fichero EXE ya que invoca automáticamente al linkador). El linkador permite el uso de
librerías de funciones y rutinas. TLINK, a diferencia de LINK, permite generar un fichero de tipo COM
directamente de un OBJ si se indica el parámetro /t, lo que agiliza aún más el proceso. Puede obtenerse ayuda
ejecutándolo sin parámetros. Los parámetros de TLINK son sensibles a mayúsculas y minúsculas, por lo que
/T no es lo mismo que /t. Con LINK se obtiene ayuda indicando /HELP. Aunque los parámetros de uno y
otro son bastante distintos, la sintaxis genérica de ambos es:
Los ficheros no necesarios se pueden omitir (o indicar NUL): para linkar el fichero prog1.obj y el
prog2.obj con la librería math.lib generando PROG1.EXE basta con ejecutar TLINK prog1+prog2,,,math.
Alternativamente se puede indicar TLINK @fichero para que tome los parámetros del fichero de texto
FICHERO, en el caso de que estos sean demasiados y sea incómodo teclearlos cada vez que se linka. Los
ficheros de texto de extensión MAP contienen información útil para el programador sobre la distribución de
memoria de los segmentos.
6.4.3. - EXE2BIN.
Los ficheros EXE generados por TLINK o LINK no son copia exacta de lo que aparece en la
memoria, sino que el DOS -tras cargarlos- debe realizar una última operación de «montaje». Un programa
COM en memoria es una copia del fichero del disco, es algo más corto y más sencillo de desensamblar. Al
contrario de lo que algunos opinaron en su día, el tiempo ha demostrado que nunca llegarían a ser
directamente compatibles con los actuales entornos multitarea.
EXE2BIN permite transformar un fichero EXE en COM siempre que el módulo ocupe menos de 64K
y que esté ensamblado con ORG 100h. Si no se indicó el parámetro /t en TLINK, será necesario este
programa (al igual que cuando se utiliza LINK). Cuando se crean programas SYS (que se diferencian de los
COM básicamente en que no tienen ORG 100h) no se puede ejecutar TLINK /t, por lo que es necesaria la
ayuda de EXE2BIN para convertir el programa EXE en SYS. Sintaxis:
Si el programa no contiene ORG 100h, EXE2BIN genera un fichero binario puro de extensión BIN.
Si además existen referencias absolutas a segmentos, EXE2BIN preguntará el segmento en que va a correr
(algunas versiones permiten indicarlo de la manera /Ssegmento): esto permite generar código para ser
ejecutado en un segmento determinado de la memoria (como pueda ser una memoria EPROM o ROM).
6.4.4. - TLIB/LIB.
El gestor de librerías permite reunir módulos objeto en un único fichero para poder tomar de él las
rutinas que se necesiten en cada caso. En este libro no se desarrollan programas tan complejos que justifiquen
su utilización. En cualquier caso, la sintaxis es la siguiente:
Por ejemplo, para añadir el módulo QUICK.OBJ, borrar el SLOW.OBJ y reemplazar el SORT.OBJ
por una nueva versión en LIBRERIA.LIB se ejecutaría:
Si la lista es muy larga se puede incluir en un fichero y ejecutar TLIB @fichero para que la lea del
mismo (si no cabe en una línea del fichero, puede escribirse & al final antes de pasar a la siguiente).
6.4.5. TCREF/CREF.
Esta utilidad genera listados en orden alfabético de los símbolos, como ayuda a la depuración. Con
el MASM la opción /c crea un fichero de referencias cruzadas de extensión CRF (respondiendo
afirmativamente cuando pregunta por el mismo o indicándolo explícitamente en la línea de comandos); la
opción /c de TASM lo incluye en el listado, aunque si se indica el nombre del fichero de referencias cruzadas
genera un fichero de extensión XRF. CREF y TCREF interpretan respectivamente los ficheros CRF y XRF
generando un fichero de texto con extensión REF que contiene el listado de referencias cruzadas. Ej.:
TASM fichero,,,fichero
TCREF fichero
Las referencias cruzadas son un listado de todos los símbolos del programa, indicando los números
de línea del mismo en que son referenciados (la línea en que son definidos se marca con #); estos números
de línea son relativos al listado de ensamblaje del programa (y no al fichero fuente). Es útil para depurar
programas grandes y complejos.
6.4.6. - MAKE.
Esta utilidad se apoya en unos ficheros especiales, al estilo de los BAT del DOS, de cara a
automatizar el proceso de ensamblaje. Sólo es recomendable para programas grandes, divididos en módulos,
en los que MAKE chequea la fecha y hora para ensamblar sólo las partes que hayan sido modificadas.
La utilidad DEBUG incluída en los sistemas MS-DOS, es una herramienta para depuración de
programas muy interesante que permite desensamblar los módulos y, además, ejecutar programas paso a paso,
viendo las modificaciones que sufren los registros y banderas. Se trata de un programa menos complejo,
cómodo y potente que depuradores de código como Turbo Debugger (de Borland) o Codeview (Microsoft),
pero en algunos casos es más útil. Veremos ahora los principales comandos del DEBUG, los cuales también
son admitidos en su mayoría por Codeview, por lo que el tiempo invertido en aprenderlos será útil no sólo
para conocer el clásico y mítico DEBUG.
Antes de empezar con ellos, conviene hacer referencia al programa SYMDEB que acompaña al
MASM de Microsoft: se trata de un DEBUG mejorado, con ayuda, más rápido e inteligente (indica el tipo
de función del sistema cuando al tracear un programa éste llama al DOS) y, en la práctica, es 99%
compatible. También admite las instrucciones adicionales del 286 y los NEC V20/V30. Su diferencia principal
es que al abandonarlo para volver al DOS restaura los vectores de interrupción, lo que puede no ser deseable
en algunos casos muy concretos. Además, desde la versión 4.0 se admite el parámetro /S (con SYMDEB /S
nomfich.ext) lo que permite conmutar entre la pantalla de depuración y la de ejecución pulsando la tecla ’\’.
Los programas pueden ser de tipo EXE o COM; en el caso de los primeros se les cargará ya
montados y con los registros inicializados, listos para su ejecución. Evidentemente, los programas COM
también se cargan con los registros inicializados y el correspondiente PSP preparado, así como con IP=100h.
EL ENSAMBLADOR EN ENTORNO DOS 97
Los parámetros opcionales no son los de el DEBUG o SYMDEB sino los que normalmente se suministrarían
al programa a depurar. También se pueden cargar otros ficheros de cualquier extensión o simplemente entrar
en el programa sin cargar ningún fichero. Al entrar, aparecerá el prompt particular del DEBUG: un guión (-).
Entonces se pueden teclear órdenes que constarán generalmente de una sola letra. La mayoría de las mismas
admiten parámetros, que normalmente irán separados por comas. Estos parámetos pueden ser números
hexadecimales de hasta dos o cuatro dígitos, registros y, además:
- Cadenas de caracteres: Encerradas entre comillas simples o dobles. El texto puede a su vez encerrar
fragmentos entrecomillados, empleando comillas distintas a las más exteriores. Ejemplo:
La cadena ’ES:’ no será bien traducida a sus correspondientes valores ASCII. Con DEBUG
este problema no existe.
- Direcciones: Pueden expresarse con sus correspondientes valores numéricos o bien apoyándose en
algún registro de segmento, aunque el offset siempre será numérico: 1E93:AD21, CS:100, ES:19AC
- Rangos: Son dos direcciones separadas por una coma; o bien una dirección, la letra ’L’ y un valor
numérico que indica el número de bytes a partir de la dirección.
El DEBUG del MS-DOS 5.0 y el SYMDEB poseen una ayuda invocable con el comando ?, en la
que se resumen las principales órdenes. A continuación se listan las más interesantes:
Los saltos inter-segmento deben especificarse como FAR (ej., CALL FAR [100]) a no ser
que sea evidente que lo son (ej. CALL 1234:5678).
E <dirección> [<lista>] (enter): permite consultar y modificar la memoria, byte a byte. Por
98 EL UNIVERSO DIGITAL DEL IBM PC, AT Y PS/2
ejemplo, con E 230 1,2,3 se introducirían los bytes 1, 2 y 3 a partir de DS:230. Si no se indica
<lista>, se visualizará la memoria byte a byte, pudiéndose modificar los bytes deseados, avanzar al
siguiente (barra espaciadora) o retroceder al anterior (signo -). Para acabar se pulsa RETURN.
R [<registro>] (register): permite visualizar y modificar el valor de los registros. Por ejemplo, si
se ejecuta la orden ’rip’, se solicitará un nuevo valor para IP; con RF se muestran los flags y se
permite modificar alguno:
Flag Activo Borrado
Desbordamiento OV NV
Dirección DN (↓) UP (↑)
Interrupción EI DI
Signo NG (<0) PL (>0)
Cero ZR (=0) NZ (!=0)
Acarreo auxiliar AC NA
Paridad PE (par) PO (impar)
Acarreo CY NC
G [=<dirección> [,<dirección>,...]] (go): ejecuta código desde CS:IP (a menos que se indique una
dirección concreta). Si se trabaja sobre memoria ROM no debe indicarse la segunda dirección. Para
que el flujo del programa se detenga en la 2ª dirección o posteriores debe pasar necesariamente por
ella(s). Se puede indicar hasta 10 direcciones donde debe detenerse.
T [<veces>] (trace): ejecuta una instrucción del programa (a partir de CS:IP) mostrando a
continuación el estado de los registros y la siguiente instrucción. Ejecutar T10 equivaldría a ejecutar
16 veces el comando T. Si la instrucción es CALL o INT, se ejecutará como tal introduciéndose en
la subrutina o servidor de interrupciones correspondiente (SYMDEB no entra en los INT 21h).
S <rango> <lista> (search): busca una cadena de bytes por la memoria. Para buscar la cadena
EL ENSAMBLADOR EN ENTORNO DOS 99
"PEPE" terminada por cero en un área de 512 bytes desde DS:100 se haría: S 100 L 200 "PEPE",0
(por defecto se busca en DS:). No se encontraría sin embargo "pepe" (en minúsculas).
F <rango> <lista> (fill): llena la zona de memoria especificada con repeticiones de la lista de
bytes indicada. Por ejemplo, para rellenar códigos 0AAh 100h bytes a partir de 9800h:0 se ejecutaría
F 9800:0 L 100 AA; en vez de AA se podría haber indicado una lista de bytes o cadenas de
caracteres.
C <rango> <dirección> (compare): compara dos zonas de memoria mostrando las diferencias. Por
ejemplo, para comparar 5 bytes de DS:100 y DS:200 se hace: C 100 L 5 200.
M <rango> <dirección> (move): Más que mover, copia una zona de memoria en otra de manera
inteligente (controlando los posibles solapamientos de los bloques).
H <valor1> <valor2> (hexaritmetic): muestra la suma y resta de valor1 y valor2, ambos operandos
de un máximo de 16 bits (si hay desbordamiento se trunca el resultado, que tampoco excede los 16
bits).
También existen comandos en DEBUG para acceder a la memoria expandida: XS (obtener el estado
de la memoria expandida), XA npag (localizar npag páginas), XD handle (desalojar el handle indicado) y XM
pagina_logica pagina_fisica handle (mapear páginas).
Con SYMDEB pueden además colocarse, con suma facilidad, puntos de ruptura (breakpoints); con
DEBUG se pueden implementar con la orden G (indicando más de una dirección hasta un máximo de 10,
donde debe detenerse el programa si pasa por ellas) aunque es más incómodo. En SYMDEB se pueden definir
con BP dirección, borrarse con BC num_breakpoint, habilitarse con BP num_breakpoint (necesario antes de
emplearlos), deshabilitarse con BD num_breakpoint y listar los definidos con BL. Además, SYMDEB puede
visualizar datos en coma flotante de 32, 64 y 80 bits con el comando D (DS, DL y DT).
Una posibilidad interesante de DEBUG y SYMDEB es que admiten el redireccionamiento del sistema
operativo. Ello permite, por ejemplo, crear ficheros ASCII con órdenes y después suministrárselas al
programa, como en el siguiente ejemplo: DEBUG < ORDENES.TXT. La última orden de este fichero deberá
ser Q (quit), de lo contrario no se devolvería el control al DOS ni se podría parar el programa (la entrada por
defecto -el teclado- no actúa). También es versátil la posibilidad de redireccionar la salida. Por ejemplo, tras
DEBUG > SALIDA.TXT, se puede teclear un comando para desensamblar (U) y otro para salir (Q): en el
disco aparecerá el fichero con los datos del desensamblaje (se teclea a ciegas, lógicamente, porque la salida
por pantalla ha sido redireccionada al fichero). Por supuesto, también es posible redireccionar entrada y salida
a un tiempo: DEBUG < ORDENES.TXT > SALIDA.
El código de la BIOS, almacenado en las memorias ROM del ordenador, constituye la primera capa
de software de los ordenadores compatibles. La BIOS accede directamente al hardware, liberando a los
programas de usario de las tareas más complejas. Parte del código de la BIOS es actualizado durante el
arranque del ordenador, con los ficheros que incluye el sistema operativo. El sistema operativo o DOS
100 EL UNIVERSO DIGITAL DEL IBM PC, AT Y PS/2
propiamente dicho se instala después: el DOS no realiza ningún acceso directo al hardware, en su lugar se
apoya en la BIOS, constituyendo una segunda capa de software. El DOS pone a disposición de los programas
de usuario unas funciones muy evolucionadas para acceder a los discos y a los recursos del ordenador. Por
encima del DOS se suele colocar habitualmente al COMMAND.COM, aunque realmente el COMMAND no
constituye capa alguna de software: es un simple programa de utilidad, como cualquier otro, ejecutado sobre
el DOS y que además no pone ninguna función a disposición del sistema (al menos, documentada), su única
misión es cargar otros programas.
FUNCIONES DE LA BIOS
Las funciones de la BIOS se invocan, desde los programas de usuario, ejecutando una interrupción
software con un cierto valor inicial en los registros. La BIOS emplea un cierto rango de interrupciones, cada
una encargada de una tarea específica:
La mayoría de las interrupciones se invocan solicitando una función determinada (que se indica en
el registro AH al llamar) y se limitan a devolver un resultado en ciertos registros, realizando la tarea
solicitada. En general, sólo resultan modificados los registros que devuelven algo, aunque BP es corrompido
en los servicios de vídeo de las máquinas más obsoletas.
El DOS emplea varias interrupciones, al igual que la BIOS; sin embargo, cuando se habla de
funciones del DOS, todo el mundo sobreentiende que se trata de llamar a la INT 21h, la interrupción más
importante con diferencia.
Las funciones del DOS se invocan llamando a la INT 21h e indicando en el registro AH el número
de función a ejecutar. Sólo modifican los registros en que devuelven los resultados, devolviendo normalmente
el acarreo activo cuando se produce un error (con un código de error en el acumulador). Muchas funciones
de los lenguajes de programación frecuentemente se limitan a llamar al DOS.
En general, se debe intentar emplear siempre las funciones que requieran la menor versión posible
del DOS; sin embargo, no es necesario buscar la compatibilidad con el DOS 1.0: esta versión no soporta
subdirectorios, y el sistema de ficheros se basa en el horroroso método FCB. Los FCB ya no están soportados
siquiera en la ventana de compatibilidad DOS de OS/2, siendo recomendable ignorar su existencia y trabajar
con los handles, al estilo del UNIX, que consisten en unos números que identifican a los ficheros cuando son
abiertos. Existen 5 handles predefinidos permanentemente abiertos: 0 (entrada estándar -teclado-), 1 (salida
estándar -pantalla-), 2 (salida de error estándar -también pantalla-), 3 (entrada/salida por puerto serie) y 4
(salida por impresora): la pantalla, el teclado, etc. pueden ser manejados como simples ficheros.
Las funciones precedidas de un asterisco son empleadas o mencionadas en este libro, y pueden
consultarse en el apéndice al efecto al final del mismo.
ENTRADA/SALIDA DE CARACTERES
AH AL Versión Nombre original Traducción
01 -- DOS 1+ - READ CHARACTER FROM STANDARD INPUT, WITH ECHO . . . . . . LEER CARACTER DE LA ENTRADA ESTANDAR, CON IMPRESION
*02 -- DOS 1+ - WRITE CHARACTER TO STANDARD OUTPUT . . . . . . . . . . . . . . . . . ESCRIBIR CARACTER EN LA SALIDA ESTANDAR
03 -- DOS 1+ - READ CHARACTER FROM STDAUX . . . . . . . . . . . . . . . . . . . . . . . . . LEER CARACTER DEL PUERTO SERIE
04 -- DOS 1+ - WRITE CHARACTER TO STDAUX . . . . . . . . . . . . . . . . . . . . . . . ESCRIBIR CARACTER EN EL PUERTO SERIE
05 -- DOS 1+ - WRITE CHARACTER TO PRINTER . . . . . . . . . . . . . . . . . . . . . . . . ESCRIBIR CARACTER EN LA IMPRESORA
06 -- DOS 1+ - DIRECT CONSOLE OUTPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SALIDA DIRECTA A CONSOLA
06 -- DOS 1+ - DIRECT CONSOLE INPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ENTRADA DIRECTA POR CONSOLA
07 -- DOS 1+ - DIRECT CHARACTER INPUT, WITHOUT ECHO . . . . . . . . . . . . . . LECTURA DIRECTA DE CARACTER, SIN IMPRESION
08 -- DOS 1+ - CHARACTER INPUT WITHOUT ECHO . . . . . . . . . . . . . . . . . . . . . LECTURA DE CARACTERES, SIN IMPRESION
*09 -- DOS 1+ - WRITE STRING TO STANDARD OUTPUT . . . . . . . . . . . . . . . . . . . . ESCRIBIR CADENA EN LA SALIDA ESTANDAR
*0A -- DOS 1+ - BUFFERED INPUT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ENTRADA DESDE TECLADO POR BUFFER
0B -- DOS 1+ - GET STDIN STATUS . . . . . . . . . . . . . . . . . . . . . . . . . . . OBTENER ESTADO DE LA ENTRADA ESTANDAR
0C -- DOS 1+ - FLUSH BUFFER AND READ STANDARD INPUT . . . . . . . . . . . . . LIMPIAR BUFFER Y LEER DE LA ENTRADA ESTANDAR
GESTION DE FICHEROS
14 -- DOS 1+ - SEQUENTIAL READ FROM FCB FILE . . . . . . . . . . . . . . . . . . LECTURA SECUENCIAL DE FICHERO EMPLEANDO FCB
15 -- DOS 1+ - SEQUENTIAL WRITE TO FCB FILE . . . . . . . . . . . . . . . . . ESCRITURA SECUENCIAL EN FICHERO EMPLEANDO FCB
*1A -- DOS 1+ - SET DISK TRANSFER AREA ADDRESS . . . . . . . . . . . . . . . . . ESTABLECER EL AREA DE TRANSFERENCIA A DISCO
21 -- DOS 1+ - READ RANDOM RECORD FROM FCB FILE . . . . . . . . . . . . . . . . LECTURA ALEATORIA DE REGISTRO EMPLEANDO FCB
22 -- DOS 1+ - WRITE RANDOM RECORD TO FCB FILE . . . . . . . . . . . . . . . . ESCRITURA ALEATORIA DE REGISTRO EMPLEANDO FCB
24 -- DOS 1+ - SET RANDOM RECORD NUMBER FOR FCB . . . . . . . . . . . . . PASAR DE E/S SECUENCIAL A ALEATORIA EMPLEANDO FCB
27 -- DOS 1+ - RANDOM BLOCK READ FROM FCB FILE . . . . . . . . . . . . . . . . . . LECTURA ALEATORIA DE BLOQUE EMPLEANDO FCB
28 -- DOS 1+ - RANDOM BLOCK WRITE TO FCB FILE . . . . . . . . . . . . . . . . . ESCRITURA ALEATORIA DE BLOQUE EMPLEANDO FCB
*2F -- DOS 2+ - GET DISK TRANSFER AREA ADDRESS . . . . . . . . . . . OBTENER LA DIRECCION DEL AREA DE TRANSFERENCIA A DISCO
*3F -- DOS 2+ - "READ" - READ FROM FILE OR DEVICE . . . . . . . . . . . . . . . . . . . . LEER DE UN FICHERO EMPLEANDO HANDLE
*40 -- DOS 2+ - "WRITE" - WRITE TO FILE OR DEVICE . . . . . . . . . . . . . . . . . . ESCRIBIR EN UN FICHERO EMPLEANDO HANDLE
102 EL UNIVERSO DIGITAL DEL IBM PC, AT Y PS/2
42 -- DOS 2+ - "LSEEK" - SET CURRENT FILE POSITION . . . . . . . . MOVER EL PUNTERO RELATIVO EN EL FICHERO EMPLEANDO HANDLE
5C -- DOS 3+ - "FLOCK" - RECORD LOCKING . . . . . . . . . . . . . BLOQUEAR/DESBLOQUER UNA ZONA DEL FICHERO EMPLEANDO HANDLE
MANEJO DE DISCO
CONTROL DE PROCESOS
GESTION DE MEMORIA
FUNCIONES MISCELANEAS
18 -- DOS 1+ - NULL FUNCTION FOR CP/M COMPATIBILITY . . . . . . . . . . . . . . . . . FUNCION NULA PARA COMPATIBILIDAD CP/M
1D -- DOS 1+ - NULL FUNCTION FOR CP/M COMPATIBILITY . . . . . . . . . . . . . . . . . FUNCION NULA PARA COMPATIBILIDAD CP/M
1E -- DOS 1+ - NULL FUNCTION FOR CP/M COMPATIBILITY . . . . . . . . . . . . . . . . . FUNCION NULA PARA COMPATIBILIDAD CP/M
1F -- DOS 1+ - GET DRIVE PARAMETER BLOCK FOR DEFAULT DRIVE . . . . . . . . . . . . . OBTENER EL DPB DE LA UNIDAD POR DEFECTO
20 -- DOS 1+ - NULL FUNCTION FOR CP/M COMPATIBILITY . . . . . . . . . . . . . . . . . FUNCION NULA PARA COMPATIBILIDAD CP/M
*25 -- DOS 1+ - SET INTERRUPT VECTOR . . . . . . . . . . . . . . . . . . . . . . . . . . . ESTABLECER VECTOR DE INTERRUPCION
*30 -- DOS 2+ - GET DOS VERSION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . OBTENER VERSION DEL DOS
32 -- DOS 2+ - GET DOS DRIVE PARAMETER BLOCK FOR SPECIFIC DRIVE . . . . . . . . . . . OBTENER EL DPB DE LA UNIDAD INDICADA
33 -- DOS 2+ - EXTENDED BREAK CHECKING . . . . . . . . . . . . . . . . . . . . CONTROLAR EL NIVEL DE DETECCION DE CTRL-BREAK
33 02 DOS 3.x+ internal - GET AND SET EXTENDED CONTROL-BREAK CHECKING STATE . . INDICAR/OBTENER NIVEL DETECCION CTRL-BREAK
33 05 DOS 4+ - GET BOOT DRIVE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DETERMINAR UNIDAD DE ARRANQUE
33 06 DOS 5.0 - GET TRUE VERSION NUMBER . . . . . . . . . . . . . . . . . . . . . . . . . . . OBTENER VERSION REAL DEL DOS
*34 -- DOS 2+ - GET ADDRESS OF INDOS FLAG . . . . . . . . . . . . . . . . . . . . . . . . . . . OBTENER LA DIRECCION DE INDOS
*35 -- DOS 2+ - GET INTERRUPT VECTOR . . . . . . . . . . . . . . . . . . . OBTENER LA DIRECCION DE UN VECTOR DE INTERRUPCION
37 00 DOS 2+ - "SWITCHAR" - GET SWITCH CHARACTER . . . . . . . . . . . . . . . . OBTENER EL CARACTER INDICADOR DE PARAMETROS
37 01 DOS 2+ - "SWITCHAR" - SET SWITCH CHARACTER . . . . . . . . . . . . . . ESTABLECER EL CARACTER INDICADOR DE PARAMETROS
37 -- DOS 2.x and 3.3+ only - "AVAILDEV" - SPECIFY \DEV\ PREFIX USE . . . . . . . . . . CONTROLAR EL USO DEL PREFIJO \DEV\
*38 -- DOS 2+ - GET COUNTRY-SPECIFIC INFORMATION . . . . . . . . . . . . . . . . . . . OBTENER INFORMACION RELATIVA AL PAIS
38 -- DOS 3+ - SET COUNTRY CODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ESTABLECER EL CODIGO DEL PAIS
44 00 DOS 2+ - IOCTL - GET DEVICE INFORMATION . . . . . . . . . . . . . . CONTROL E/S: OBTENER INFORMACION DEL DISPOSITIVO
44 01 DOS 2+ - IOCTL - SET DEVICE INFORMATION . . . . . . . . . . . . . CONTROL E/S: ESTABLECER INFORMACION DEL DISPOSITIVO
44 02 DOS 2+ - IOCTL - READ FROM CHARACTER DEVICE CONTROL CHANNEL . . . . . CONTROL E/S: LEER DE CANAL CONTROL DISP. CARAC.
44 03 DOS 2+ - IOCTL - WRITE TO CHARACTER DEVICE CONTROL CHANNEL . . . . CONTROL E/S: ESCRIBIR EN CANAL CONTROL DISP. CARAC.
44 04 DOS 2+ - IOCTL - READ FROM BLOCK DEVICE CONTROL CHANNEL . . . . . . . CONTROL E/S: LEER DE CANAL CONTROL DISP. BLOQUE
44 05 DOS 2+ - IOCTL - WRITE TO BLOCK DEVICE CONTROL CHANNEL . . . . . . CONTROL E/S: ESCRIBIR EN CANAL CONTROL DISP. BLOQUE
44 06 DOS 2+ - IOCTL - GET INPUT STATUS . . . . . . . . . . . . . . . . . . . . . CONTROL E/S: OBTENER ESTADO DE LA ENTRADA
44 07 DOS 2+ - IOCTL - GET OUTPUT STATUS . . . . . . . . . . . . . . . . . . . . . CONTROL E/S: OBTENER ESTADO DE LA SALIDA
44 08 DOS 3.0+ - IOCTL - CHECK IF BLOCK DEVICE REMOVABLE . . . . . CONTROL E/S: COMPROBAR SI EL DISP. DE BLOQUE ES REMOVIBLE
44 09 DOS 3.1+ - IOCTL - CHECK IF BLOCK DEVICE REMOTE . . . . . . . CONTROL E/S: COMPROBAR SI EL DISP. DE BLOQUE ES REMOTO
44 0A DOS 3.1+ - IOCTL - CHECK IF HANDLE IS REMOTE . . . . . . . . . . . . . . CONTROL E/S: COMPROBAR SI UN HANDLE ES REMOTO
44 0B DOS 3.1+ - IOCTL - SET SHARING RETRY COUNT . . . . . CONTROL E/S: DEFINIR NUMERO DE REINTENTOS EN MODO DE COMPARTICION
44 0C DOS 3.2+ - IOCTL - GENERIC CHARACTER DEVICE REQUEST . . . . . . . CONTROL E/S GENERAL PARA DISPOSITIVOS DE CARACTERES
44 0D DOS 3.2+ - IOCTL - GENERIC BLOCK DEVICE REQUEST . . . . . . . . . . . CONTROL E/S GENERAL PARA DISPOSITIVOS DE BLOQUE
44 0E DOS 3.2+ - IOCTL - GET LOGICAL DRIVE MAP . . . . . . . . . . . . . . . . . . . OBTENER ASIGNACION DE UNIDADES LOGICAS
44 0F DOS 3.2+ - IOCTL - SET LOGICAL DRIVE MAP . . . . . . . . . . . . . . . . . . . DEFINIR ASIGNACION DE UNIDADES LOGICAS
*52 -- U> DOS 2+ internal - "SYSVARS" - GET LIST OF LISTS . . . . . . . . . . . OBTENER EL LISTADO DE LAS LISTAS DEL SISTEMA
53 -- DOS 2+ internal - TRANSLATE BIOS PARAMETER BLOCK TO DRIVE PARAM BLOCK . . . . . . . . . . . . . . TRADUCIR BPB A DPB
55 -- DOS 2+ internal - CREATE CHILD PSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CREAR PSP HIJO
*59 -- DOS 3+ - GET EXTENDED ERROR INFORMATION . . . . . . . . . . . . . . . . . . OBTENER INFORMACION EXTENDIDA DE ERRORES
*5D 06 U> DOS 3.0+ internal - GET ADDRESS OF DOS SWAPPABLE DATA AREA . . . OBTENER DIRECCION DEL AREA INTERCAMBIABLE DEL DOS
*5D 0A DOS 3.1+ - SET EXTENDED ERROR INFORMATION . . . . . . . . . . . . . . . . ESTABLECER INFORMACION EXTENDIDA DE ERRORES
*5D 0B U> DOS 4.x only internal - GET DOS SWAPPABLE DATA AREAS . . . . . . . . . . . . OBTENER AREAS INTERCAMBIABLES DEL DOS
60 -- DOS 3.0+ - CANONICALIZE FILENAME OR PATH . . . . . EXPANDIR NOMBRE DE FICHERO A ESPECIFICACION COMPLETA DE DIRECTORIOS
61 -- DOS 3+ - UNUSED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NO USADA AUN
64 -- DOS 3.2+ internal - SET DEVICE DRIVER LOOKAHEAD FLAG . . . . ESTABLECER BANDERIN DE LECTURA ADELANTADA DE DISPOSITIVO
65 -- DOS 3.3+ - GET EXTENDED COUNTRY INFORMATION . . . . . . . . . . . . . . . . . OBTENER INFORMACION EXTENDIDA DEL PAIS
65 23 U> DOS 4+ internal - DETERMINE IF CHARACTER REPRESENTS YES/NO RESPONS . . . . DETERMINAR SI UNA LETRA INDICA SI O NO
65 -- U> DOS 4+ internal - COUNTRY-DEPENDENT FILENAME CAPITALIZATION . . . . MAYUSCULIZACION DE NOMBRE DEPENDIENTE DEL PAIS
66 01 DOS 3.3+ - GET GLOBAL CODE PAGE TABLE . . . . . . . . . . . . . . . . . . . . . . OBTENER LA PAGINA DE CODIGOS GLOBAL
66 02 DOS 3.3+ - SET GLOBAL CODE PAGE TABLE . . . . . . . . . . . . . . . . . . . . ESTABLECER LA PAGINA DE CODIGOS GLOBAL
69 -- U> DOS 4+ internal - GET/SET DISK SERIAL NUMBER . . . . . . . . . . OBTENER/ESTABLECER EL NUMERO DE SERIE DE UN DISCO
6B -- U> DOS 5.0 - NULL FUNCTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . FUNCION NULA
6C 00 DOS 4+ - EXTENDED OPEN/CREATE . . . . . . . . . . . . . . . APERTURA/CREACION DE FICHEROS EXTENDIDA EMPLEANDO HANDLE