Primer Programa
10.04.2015 07:21
Éste programa sumará 1000 + 2000 y volcará el resultado en AX
- En DOS, en el símbolo de sistema, escribir Cls y luego Debug. Aparecerá un guión (De ésta manera se inicia el debug, con el comando Debug).
- Escribir "A 0100" y presionar la tecla Enter. "A" es una orden del debug que permite ensamblar instrucciones a partir de una dirección (Normalmente se empieza en la dirección 0100h), el Debug generalmente utiliza números hexadecimales.
- Aparecerá lo siguiente ("xxxx" es el segmento en donde está el programa, aparecerá un número en éste lugar, que será el valor de CS).
-A 0100
xxxx:0100
- Escribir las siguientes instrucciones en assembler
MOV AX, 1000
MOV BX, 2000
ADD AX, BX
INT 20
- Presionar la tecla Enter
- Escribir "p 0100" (Con ésta orden se ejecuta el programa y se mostrarán los sucesivos cambios de los registros). Luego aparece "el programa ha terminado de forma normal" o "Program terminated normally".
Luego (Al terminar el programa), antes del mensaje que indica el fin del programa, aparece lo siguiente (Bloque de estado):
AX=3000 BX=2000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=XXXX ES=XXXX SS=XXXX CS=XXXX IP=0108 NV UP EI PL NZ NA PE NC
0CB3:0108 CD20 INT 20
El Debug muestra el estado de los registros antes de ejecutar la instrucción que muestra en el bloque de estado.
El programa hace lo siguiente
La instrucción MOV AX, 1000 ordena que AX tome el valor de 1000.
La instrucción MOV BX, 2000 ordena que BX tome el valor de 2000.
La instrucción ADD AX, BX ordena que AX sea sumado con BX
Por lo tanto es lógico que AX tenga el valor 3000 luego de la instrucción "ADD AX, BX", ya que se le sumó a AX el valor de BX.
La instrucción INT 20 ordena provocar una interrupción que es 20h, que le cede el control a DOS, y DOS termina el programa. Una interrupción es una interrupción de la ejecución de un programa para realizar una determinada tarea, a veces el control no vuelve al programa original (Por ejemplo en el caso de INT 20h en el DOS).
Las interrupciones pueden ejecutarse por las circunstancias más variadas, por ejemplo el usuario presiona una tecla y ésto provoca una interrupción y se ejecuta las instrucciones del controlador de teclado y almacena la tecla presionada, luego le devuelve el control al programa original (Con una instrucción sin operandos llamada IRET).
Cuando ocurre una interrupción se empuja a la pila CS e IP, y éstos 2 registros se modifican para apuntar a la rutina deseada. Los valores de éstos 2 registros están almacenados en la tabla de vectores de interrupción (Ésta está ubicada en el comienzo de la memoria en 0000:0000). Para encontrar éstos 2 valores (Llamado vector de interrupción), se multiplica el número de interrupción por 4 (El offset), y se lee 4 bytes en el offset mencionado y en el segmento 0000. Los primeros 2 bytes (El primer word) del vector de interrupción es el offset (IP), y los 2 restantes (El segundo word) es el segmento (CS).
En el caso de la interrupción 20h fue provocada por el mismo programa, para evitar interrupciones que no sean provocadas por el programa se utiliza la instrucción CLI y para luego activarlas se utiliza STI, pero no se pueden enmascarar las interrupciones menores de 8 ya que no son enmascarables. Hay que tener en cuenta que en la arquitectura x86, el microprocesador almacena en la memoria, desde los bytes menos significativos hasta los más significativos (Si no se tiene en cuenta ésto puede haber misteriosos fallos del programa que se está programando). Por lo tanto en un vector de interrupción, el primer word (Palabra) contiene el valor que se le asignará a IP (Offset), el segundo word contiene el valor que se le asignará a CS (Segmento), cuando se provoque la interrupción del correspondiente vector.