USO DE LOS RECURSOS DE UN EQUIPO DE CÓMPUTO
MEDIANTE C++
Bruno López Takeyas
Instituto Tecnológico de Nuevo Laredo
Reforma Sur 2007, C.P. 88250, Nuevo Laredo, Tamps. México
http://www.itnuevolaredo.edu.mx/takeyas
E-mail:
[email protected]
Registros de propósito especial: Guardan el estado
de la CPU y el apuntador de instrucciones que indica
la siguiente instrucción que ejecutará la CPU.
Registros de Propósito
Resumen: En esta sección se examinarán
varias funciones especiales de Turbo C++ que
permiten que los programas accedan a los
recursos de
las
funciones BIOS o DOS.
la computadora mediante
Cada procesador, sistema operativo y
entorno tiene sus propios métodos de acceder a
los recursos del sistema. Para efectos didácticos
se asumirá el uso del sistema operativo PC-DOS
y la familia de procesadores 8086.
1. Registros de la CPU
La familia de procesadores 8086 tiene 14
registros en los que se pone la información para
procesar o el programa de control. Los registros
pueden ser de las categorías siguientes:
Registros de propósito general: Son de trabajo de
la CPU. En estos registros se colocan los valores
incluye operaciones
para su procesamiento que
aritméticas, comparaciones e
instrucciones de
bifurcación o saltos.
Registros de base de puntero e índice: Se usan
para
como
direccionamiento
relativo, apuntador de pila e
instrucciones para mover bloques.
Registros de segmento: Son usados para soportar
el esquema de memoria segmentada. El registro CS
guarda el segmento de código actual, el DS el
segmento actual de datos, el ES el segmento extra y
el SS el segmento de pila.
proporcionar
soporte
cosas
a
CH
DH
CL
DL
Ïndice fuente
Índice destino
CX
DX
SI
DI
SS
ES
General
AH
BH
AL
BL
Registros de puntero e
índice
Puntero de pila
Puntero base
Registros de segmento
AX
BX
SP
BP
CS
DS
Segmento de
código
Segmento de
datos
Registro de propòsito
especial
Registro de
indicadores
Segmento de pila
Segmento extra
IP
Puntero de
instrucciones
1
Fig. 1. Registros de la CPU
Fig. 2.- Tipo REGS incluido en el archivo de
encabezado DOS.H
Como se puede observar en la Fig. 2, REGS
es una unión de dos estructuras que contiene el
archivo de encabezado DOS.H. Usar la estructura
WORDREGS permite acceder a los registros de la
CPU como cantidades de 16 bits. El uso de
BYTEREGS da acceso a los registros de 8 bits.
4. Desapareciendo el cursor
Se puede desaparecer el cursor si se coloca
un 1 en el 5º bit del registro CH (Fig. 3). Para colocar
el 5º bit con el valor de 1, se coloca el número
hexadecimal 20 en el registro CH, lo cual equivale a
00100000 en binario, lo cual indica el valor que se
necesita.
CH=
7
6
5
3
2
1
0
4
2. Interrupciones
la
Una
interrupción es un
tipo especial de
instrucción que provoca la parada de la ejecución del
programa, guarda el estado actual del sistema en la
pila y salta a una rutina de manejo de la interrupción
que se determina por el número de la interrupción.
Después de que acabe la rutina, realiza una vuelta a
la
la
ejecución del programa anterior.
interrupción que provoca que se reanude
Hay dos tipos básicos de interrupciones: las
generales por hardware y
las provocadas por
software. La CPU permite a un programa ejecutar una
interrupción software por
INT. El
número que sigue a la instrucción determina el
número de la interrupción. Por ejemplo, INT 21h
provoca la interrupción 21h.
instrucción
Muchas de estas interrupciones son usadas
por el BIOS o el DOS como un medio de acceder a
diversas
funciones que son parte del sistema
operativo. Cada
interrupción se asocia a una
categoría de servicios a las que accede que son
determinados por el valor del registro AH. Si se
necesita
los
registros AL, BX, CX y DX.
información adicional se pasa en
3. Función int86()
La función int86() de Turbo C++ se usa para
ejecutar una interrupción de software. Se declara
como
int86(int intnum, union REGS *in, union REGS *out)
El número de la interrupción en esta función es
intnum, in es una unión que contiene los registros
que se usarán para pasar la información a los
manejadores de la interrupción y out es una unión
que guardará los valores devueltos por la interrupción
(si los hay).
struct WORDREGS {
unsigned int ax, bx, cx, dx, si, di, cflag, flags;
};
struct BYTEREGS {
unsigned char al, ah, bl, bh, cl, ch, dl, dh;
};
union REGS {
struct WORDREGS x;
struct BYTEREGS h;
};
2
Colocando un 1 a este bit, se desaparece el
cursor. Colocando un 0 aparece nuevamente
Fig. 3.- Bit del cursor
/*
Programa para desaparecer el cursor
usando la funcion int86()
Instructor: M.C. Bruno Lopez Takeyas
*/
#include <dos.h> // Encabezado con la
definicion de int86()
#include <conio.h>
#include <iostream.h>
// del cursor
// equivalente a
// los registros de la CPU
void main(void)
{
union REGS regs; // Declaracion de la
union regs de tipo REGS para el uso de
clrscr();
cout << "\n\rDesapareciendo el cursor
...";
regs.h.ch=0x20; // Inicializar el
registro CH con el valor 20(hexadecimal)
00100000; es decir colocar un 1 en el
// 5o. bit del registro
CH para desaparecer el cursor
regs.h.ah=1; // Servicio 1 de la INT
10h (video) que se refiere al tama¤o
int86(0x10,®s,®s); // Invoca la
INT 10h (video)
cout << "\n\n\n\n\r<<< Oprima
cualquier tecla para aparecer el cursor
>>>";
getch();
cout << "\n\n\n\n\n\rApareciendo el
cursor ...";
regs.h.ch=0; // Inicializar el
registro CH con el valor 0(hexadecimal)
00000000; es decir colocar un 0 en el
// 5o. bit del registro
CH para aparecer el cursor
regs.h.ah=1; // Servicio 1 de la INT
10h (video) que se refiere al tama¤o
int86(0x10,®s,®s); // Invoca la
INT 10h (video)
cout << "\n\n\n\n\r<<< Oprima
cualquier tecla para aparecer el cursor
>>>";
getch();
return;
}
// equivalente a
// del cursor
Fig. 4.- Desapareciendo el cursor usando la
función int86().
5. Aplicaciones usando el
mouse
Se pueden desarrollar aplicaciones en
las que se incluya el manejo mediante el uso
del mouse a través de la INT 33h con sus
servicios correspondientes. El programa de
la Fig. 5 muestra un ejemplo de la forma de
implementar el mouse.
/*
Programa para usar el mouse
Instructor: M.C. Bruno Lopez Takeyas
*/
#include <dos.h> // Encabezado con la
definicion de int86()
#include <conio.h>
#include <iostream.h>
void main(void)
{
union REGS regs; // Declaracion de la
union regs de tipo REGS para el uso de
clrscr();
gotoxy(1,24); cout << "Oprima
cualquier tecla para salir";
regs.h.al=0x1; // Inicializar el
registro AL con el valor 1(hexadecimal)
servicio 1 de la INT 33h (mouse)
mouse
int86(0x33,®s,®s); // Invoca la
INT 33h (mouse)
while(!kbhit()) // Ciclo mientras NO
se oprima cualquier tecla
// es decir, invoca el
// para habilitar el
// los registros de la CPU
3
oprimió el botón izquierdo o en BX=2 si se
oprimió el botón derecho.
En
la Fig. 5 se muestra un
encabezado (LIBMOUSE.h) que contiene las
declaraciones necesarias y la mayoría de los
servicios necesarios para utilizar el mouse
en un programa. Sólo basta incluirlo como
mediante la siguiente línea de código:
#include “LIBMOUSE.h”
Las
rutinas contenidas en este
encabezado s on:
void zMouseDetect(struct mdata *Mptr);
/* INICIALIZAR SI SE ENCUENTRA */
void zMouseInit(struct mdata *Mptr);
/* INICIALIZA EL DRIVER */
void zMouseShow(struct mdata *Mptr);
/* MUESTRA EL CURSOR */
void zMouseHide(struct mdata *Mptr);
/* ESCONDE EL CURSOR */
void zMousePos(struct mdata *Mptr);
/* COLOCA LAS COORDENADAS x,y */
void zMouseInfo(struct mdata *Mptr);
/* CHECA LA POSICION Y EL BOTON */
void zMouseHLimit(struct mdata *Mptr);
/* COLOCA EL RANGO HORIZONTAL */
void zMouseVLimit(struct mdata *Mptr);
/* COLOCA EL RANGO VERTICAL */
// para detectar el
// es decir, invoca el
// oprime algun boton y
{
regs.h.al=0x3; // Inicializar el
registro AL con el valor 3(hexadecimal)
servicio 3 de la INT 33h (mouse)
status del mouse, o sea, si se
las coordenadas del cursor
int86(0x33,®s,®s); // Invoca
la INT 33h (mouse)
// El servicio 3 de la INT 33h devuelve
el status del mouse en el registro BX
// Si BX=1 entonces se oprimio el boton
izquierdo
// Si BX=2 entonces se oprimio el boton
derecho
if(regs.x.bx==1)
{
gotoxy(20,12); cout << "Boton
izquierdo";
gotoxy(20,12); cout << "
";
}
if(regs.x.bx==2)
{
gotoxy(40,12); cout << "Boton
derecho";
gotoxy(40,12); cout << "
";
}
}
return;
}
Fig. 5.- Manejo del mouse
El programa de la Fig. 5 inicial
Comentarios de: Uso de los recursos de un equipo de computo mediante C++ (0)
No hay comentarios