Int 21h ejemplo
En este tutorial escribiremos nuestro primer programa en ensamblador y lo compilaremos. También conoceremos las dos instrucciones más básicas en ensamblador, desde nuestro punto de vista. Estas son la instrucción MOV que se utiliza para transferir datos, y la instrucción INT que llama a una interrupción del DOS.
La instrucción MOV es la que aparecerá más veces en un programa en ensamblador. Todo lo que hace es copiar una pieza de datos de una ubicación a otra. Es similar en concepto al operador MOVE en el lenguaje COBOL, pero se utiliza con mucha más frecuencia. Aquí hay algunos ejemplos de instrucciones MOV.
La instrucción INT es la instrucción que más trabajo hace en cualquier programa de ensamblador. Lo que hace es llamar a una interrupción del DOS (como una función) para realizar una tarea especial. Cuando uno quiere leer del teclado o del disco o del ratón, o escribir en la pantalla, utiliza una interrupción. Cuando se utiliza el DOS, hay más de 50 interrupciones diferentes disponibles. De éstas, el programador sólo utilizará unas pocas. Cada interrupción, sin embargo, tiene un número de sub-funciones que seleccionan la tarea individual que la función tiene que hacer. Por ejemplo, sólo hay una interrupción para acceder al ratón INT 33h, pero hay subfunciones separadas disponibles para ver si se ha pulsado un BOTÓN, para ver cuánto se ha movido el ratón, para mostrar u ocultar un puntero del ratón, etc. El mejor amigo de un programador de ensamblador es una lista de interrupciones y sus subfunciones, ya que siempre que quieras hacer alguna entrada o salida puedes simplemente bajar por la lista hasta que encuentres la subfunción de interrupción que hace lo que quieres, y usarla. Yo, como soy un tipo útil, he proporcionado aquí una breve lista de interrupciones que debería ser suficiente para la mayoría de tus necesidades.
Int 21h wikipedia
INT 21H generará la interrupción de software 0x21 (33 en decimal), haciendo que se ejecute la función apuntada por el vector 34 de la tabla de interrupciones, que suele ser una llamada a la API de MS-DOS. Esto significa simplemente que está utilizando la función 01h del tipo de interrupción 21…
Lee un carácter del dispositivo de entrada estándar y lo envía al dispositivo de salida estándar. Si no hay ningún carácter listo, espera hasta que haya uno disponible. La E/S puede ser redirigida, pero evita la detección de OEF.
La instrucción INT3 es una instrucción de un byte definida para ser utilizada por los depuradores para reemplazar temporalmente una instrucción en un programa en ejecución con el fin de establecer un punto de interrupción de código. Las instrucciones más generales INT XXh se codifican utilizando dos bytes.
Siempre tenemos que poner algún número (número de la función) en el registro ah cuando estamos usando una interrupción. en ah=4ch int 21h , el programa terminará el control al sistema operativo. (terminar el programa) Y int 21h es una interrupción de dos.
# 09H- visualización de la cadena – Muestra la cadena hasta llegar a ‘$’. – DX debe tener la dirección de la cadena a mostrar. # OBH- Comprobar estado del teclado – Devuelve FF en AL si el carácter de entrada está disponible en el buffer del teclado.
Mov ah,4ch int 21h
Este artículo incluye una lista de referencias generales, pero carece de las correspondientes citas en línea. Por favor, ayude a mejorar este artículo introduciendo citas más precisas. (Mayo de 2015) (Aprende cómo y cuándo eliminar este mensaje de la plantilla)
La API del DOS es una API que se originó con el 86-DOS y se utiliza en el MS-DOS/PC DOS y otros sistemas operativos compatibles con el DOS. La mayoría de las llamadas a la API del DOS se invocan utilizando la interrupción de software 21h (INT 21h). Llamando a INT 21h con un número de subfunción en el registro del procesador AH y otros parámetros en otros registros, se pueden invocar varios servicios del DOS. Estos incluyen el manejo de la entrada del teclado, la salida de vídeo, el acceso a los archivos de disco, la ejecución del programa, la asignación de la memoria, y varias otras actividades. A finales de la década de 1980, los extensores del DOS junto con la interfaz de modo protegido del DOS (DPMI) permiten que los programas se ejecuten en modo protegido de 16 o 32 bits y sigan teniendo acceso a la API del DOS.
La API original del DOS en 86-DOS y MS-DOS 1.0 fue diseñada para ser funcionalmente compatible con CP/M. Se accedía a los archivos mediante bloques de control de archivos (FCB). La API del DOS fue ampliada en gran medida en MS-DOS 2.0 con varios conceptos de Unix, incluyendo el acceso a los archivos usando manejadores de archivos, directorios jerárquicos y control de E/S de dispositivos[1] En DOS 3.1, se añadió el soporte de redirección de red. En MS-DOS 3.31, las funciones INT 25h/26h fueron mejoradas para soportar discos duros de más de 32 MB. MS-DOS 5 añadió soporte para el uso de bloques de memoria superiores (UMBs). Después de MS-DOS 5, la API del DOS no se modificó en las sucesivas versiones independientes del DOS.
Int 00h
Hola. ¿Alguien ha conseguido escribir un procedimiento BASM para enganchar la INT 21h? Intenté hacer uno que sólo pasara la interrupción : procedure newdos; assembler; asm pushf (también lo intenté sin esto) call olddos (usando el par estándar get/set intvec) end; pero se bloqueó. También intenté declararlo como un procedimiento de interrupción. ¿Alguien sabe cómo hacerlo? Por favor, envíenme las respuestas a mí también, ya que el operador de nuestro servidor de noticias está jugando con él. Gracias. Will Bryant brya…@winston.riccarton.school.nz
En el artículo <Pine.SOL.3.91.951208201826.10983B-100…@sun2.ruf.uni-freiburg.de> Alexander Schweimler <schwe…@sun2.ruf.uni-freiburg.de> escribe: Quote>El 8 de diciembre de 1995, Will Bryant escribió: >> Hola. ¿Alguien ha conseguido escribir un procedimiento BASM para enganchar la INT 21h? He intentado >> hacer uno que sólo pasara la interrupción : >> procedimiento newdos; assembler; >> asm >> pushf (también lo intenté sin esto) >> llamar a olddos (usando el par estándar get/set intvec) >> end; >> pero se bloqueó. También intenté declararlo como un procedimiento de interrupción. >> ¿Alguien sabe cómo hacerlo? >El problema es: El DOS no es reentrante, lo que significa que no puedes llamar a una >función del DOS dentro de una función del DOS, así que si enganchas a 21h el procedimiento >llamado no debería usar el DOS, ¡casi imposible bajo PASCAL! 🙁 >(No lo conseguí, por eso usé ensamblador para esto…) ? Pero en el ejemplo anterior, ¡no se llama a ninguna función del DOS! Creo que debe haber otro problema. Primero, debería haber un iret al final de este procedimiento (o debe usar un procedimiento de interrupción; pero, IMHO, assembler es mejor en este caso, porque no almacena _todos_ los registros a la pila – esto es bastante desagradable para una interrupción llamada tan a menudo como esta). Y – ¿has forzado este procedimiento a estar lejos? Tomas Hajny, XHaj…@vse.cz en Internet