tutorial de ensamblador
alguien de podria indicarme donde puedo conseguir un tutorial de ensamblador, con ejemplos sencillos. alguien puede responder este mensaje.
gracias
[email protected]
gracias
[email protected]
Recientemente ene la escuela me dejaron un programa en verdad complicado para el lenguaje ensamblador y necesito ayuda para hacerlo, si alguien conoce direcciones de inernet donde pueda ser informado, o si eres programador me gustaria que contactaramos para que me brindaras ayuda, en verdad os digo que es un reto, asi que ahi esta la direccion de correo, tal vez no pueda pagar los servicios pero puede ser un intercambio justo de informacion y programas asi como surce codes u otros banners u archivos por medio de FTP como pago,
De antemano agradesco la ayuda que mem proporcionene atte
EVANFA
De antemano agradesco la ayuda que mem proporcionene atte
EVANFA
quiero saber como hago para dar bueltas los restos de los binarios para que se lean como binarios en el lenguaje c
Hola soy bugg:
Creo que si quieres komenzar a programar en ASM con
un buen tutorial debes entrar en este sitio:
(http://usuarios.lycos.es/patricio/ensam/ensam1.htm)
Tiene una informaci貌n muy detallada de lo que es el
ensamblador y lo mejor de todo es que te hace programar al mismo tiempo con DEBUG que esta en el
windoze. Amigo creo que lo mejor que debes hacer es
leerlo ......................................................................bugg
Creo que si quieres komenzar a programar en ASM con
un buen tutorial debes entrar en este sitio:
(http://usuarios.lycos.es/patricio/ensam/ensam1.htm)
Tiene una informaci貌n muy detallada de lo que es el
ensamblador y lo mejor de todo es que te hace programar al mismo tiempo con DEBUG que esta en el
windoze. Amigo creo que lo mejor que debes hacer es
leerlo ......................................................................bugg
Hola! Necesito que alguien me pueda brindar el codigo de un programa para ensamblador que abra un archivo desde teclado, desplegar ese archivo y guardar un archivo nuevo! Si alguien me puede ayudar le estare muy agradecida! Muchisimas gracias!
Hola! Necesito que alguien me pueda brindar el codigo de un programa para ensamblador que abra un archivo desde teclado, desplegar ese archivo y guardar un archivo nuevo! Si alguien me puede ayudar le estare muy agradecida! Muchisimas gracias!
Conceptos Basicos
Informaci贸n en las computadoras.
Unidades de informaci贸n
Sistemas num茅ricos
Convertir n煤meros binarios a decimales
Convertir n煤meros decimales a binarios
Sistema Hexadecimal
M茅todos de representaci贸n de datos en una computadora.
C贸digo ASCII
M茅todo BCD
Representaci贸n de punto flotante
Trabajando con el lenguaje ensamblador.
Proceso de creaci贸n de un programa
Registros de la UCP
La estructura del ensamblador
Nuestro primer programa
Guardar y cargar los programas
Condiciones, ciclos y bifurcaciones
Interrupciones
Unidades de informaci贸n
Para que la PC pueda procesar la informaci贸n es necesario que 茅sta se encuentre en celdas especiales llamadas registros.
Los registros son conjuntos de 8 o 16 flip-flops (basculadores o biestables).
Un flip-flop es un dispositivo capaz de almacenar dos niveles de voltaje, uno bajo, regularmente de 0.5 volts y otro alto comunmente de 5 volts. El nivel bajo de energ铆a en el flip-flop se interpreta como apagado o 0, y el nivel alto como prendido o 1. A estos estados se les conoce usualmente como bits, que son la unidad mas peque帽a de informaci贸n en una computadora.
A un grupo de 16 bits se le conoce como palabra, una palabra puede ser dividida en grupos de 8 bits llamados bytes, y a los grupos de 4 bits les llamamos nibbles.
Sistemas num茅ricos
El sistema num茅rico que utilizamos a diario es el sistema decimal, pero este sistema no es conveniente para las m谩quinas debido a que la informaci贸n se maneja codificada en forma de bits prendidos o apagados; esta forma de codificaci贸n nos lleva a la necesidad de conocer el c谩lculo posicional que nos permita expresar un n煤mero en cualquier base que lo necesitemos.
Es posible representar un n煤mero determinado en cualquier base mediante la siguiente formula:
Donde n es la posici贸n del d铆gito empezando de derecha a izquierda y numerando a partir de cero. D es el d铆gito sobre el cual operamos y B es la base num茅rica empleada.
Convertir n煤meros binarios a decimales
Trabajando en el lenguaje ensamblador nos encontramos con la necesidad de convertir n煤meros del sistema binario, que es el empleado por las computadoras, al sistema decimal utilizado por las personas.
El sistema binario est谩 basado en unicamente dos condiciones o estados, ya sea encendido (1) o apagado (0), por lo tanto su base es dos.
Para la conversi贸n podemos utilizar la formula de valor posicional:
Por ejemplo, si tenemos el numero binario 10011, tomamos de derecha a izquierda cada d铆gito y lo multiplicamos por la base elevada a la nueva posici贸n que ocupan:
Binario: 1 1 0 0 1
Decimal:1*2^0+1*2^1+0*2^2+0*2^3+1*2^4
= 1 + 2 + 0 + 0 + 16 = 19 decimal.
El caracter ^ es utilizado en computaci贸n como s铆mbolo de potenciaci贸n y el caracter * se usa para representar la multiplicaci贸n.
Convertir n煤meros decimales a binarios
Existen varios m茅todos de conversi贸n de n煤meros decimales a binarios; aqu铆 solo se analizar谩 uno. Naturalmente es mucho mas f谩cil una conversi贸n con una calculadora cient铆fica, pero no siempre se cuenta con ella, as铆 que es conveniente conocer por lo menos una forma manual para hacerlo.
El m茅todo que se explicar谩 utiliza la divisi贸n sucesiva entre dos, guardando el residuo como d铆gito binario y el resultado como la siguiente cantidad a dividir.
Tomemos como ejemplo el n煤mero 43 decimal.
43/2 = 21 y su residuo es 1
21/2 = 10 y su residuo es 1
10/2 = 5 y su residuo es 0
5/2 = 2 y su residuo es 1
2/2 = 1 y su residuo es 0
1/2 = 0 y su residuo es 1
Armando el n煤mero de abajo hacia arriba tenemos que el resultado en binario es 101011
Sistema hexadecimal
En la base hexadecimal tenemos 16 d铆gitos que van del 0 al 9 y de la letra A hasta la F (estas letras representan los n煤meros del 10 al 15). Por lo tanto, contamos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F.
La conversi贸n entre numeraci贸n binaria y hexadecimal es sencilla. Lo primero que se hace para una conversi贸n de un n煤mero binario a hexadecimal es dividirlo en grupos de 4 bits, empezando de derecha a izquierda. En caso de que el 煤ltimo grupo (el que quede mas a la izquierda) sea menor de 4 bits se rellenan los faltantes con ceros.
Tomando como ejemplo el n煤mero binario 101011 lo dividimos en grupos de 4 bits y nos queda:
10; 1011
Rellenando con ceros el 煤ltimo grupo (el de la izquierda):
0010; 1011
Despu茅s tomamos cada grupo como un n煤mero independiente y consideramos su valor en decimal:
0010 = 2; 1011 = 11
Pero como no podemos representar este n煤mero hexadecimal como 211 porque ser铆a un error, tenemos que sustituir todos los valores mayores a 9 por su respectiva representaci贸n en hexadecimal, con lo que obtenemos:
2BH (Donde la H representa la base hexadecimal)
Para convertir un n煤mero de hexadecimal a binario solo es necesario invertir estos pasos: se toma el primer d铆gito hexadecimal y se convierte a binario, y luego el segundo, y as铆 sucesivamente hasta completar el n煤mero.
C贸digo ASCII
ASCII generalmente se pronuncia "aski", es un acr贸nimo de American Standard Code for Information Interchange.
Este c贸digo asigna a las letras del alfabeto, a los d铆gitos decimales del 0 al 9 y a varios s铆mbolos adicionales un n煤mero binario de 7 bits (poni茅ndose el bit 8 en su estado de apagado o 0).
De esta forma cada letra, d铆gito o caracter especial ocupa un byte en la memoria de la computadora.
Podemos observar que este m茅todo de representaci贸n de datos es muy ineficiente en el aspecto num茅rico, ya que en formato binario nos basta un solo byte para representar numeros de 0 a 255, en cambio con el c贸digo ASCII un byte puede representar unicamente un d铆gito.
Debido a esta ineficiencia, el c贸digo ASCII es principalmente utilizado en la memoria para representar texto.
Metodo BCD
BCD es un acr贸nimo de Binary Coded Decimal.
En esta notaci贸n se utilizan grupos de 4 bits para representar cada d铆gito decimal del 0 al 9. Con este m茅todo podemos representar dos d铆gitos por byte de informaci贸n.
A聹n cuando este m茅todo es mucho mas pr谩ctico para representaci贸n de n煤meros en la memoria en comparaci贸n al ASCII, todav铆a se queda por debajo del binario, ya que con un byte en el m茅todo BCD solo podemos representar d铆gitos del 0 al 99, en cambio, en formato binario podemos representar todos los d铆gitos desde 0 hasta 255.
Este formato es utilizado principalmente para representar n煤meros muy grandes en aplicaciones mercantiles ya que facilita las operaciones con los mismos evitando errores de redondeo.
Representaci贸n de punto flotante
Esta representaci贸n esta basada en la notaci贸n cient铆fica, esto es, representar un n煤mero en dos partes: su mantisa y su exponente.
Poniendo como ejemplo el n煤mero 1234000, podemos representarlo como 1.123*10^6, en esta 煤ltima notaci贸n el exponente nos indica el n煤mero de espacios que hay que mover el espacio hacia la derecha para obtener el resultado original.
En caso de que el exponente fuera negativo nos estar铆a indicando el n煤mero de espacios que hay que recorrer el punto decimal hacia la izquierda para obtener el original.
Proceso de creaci贸n de un programa
Para la creaci贸n de un programa es necesario seguir cinco pasos: Dise帽o del algoritmo, codificaci贸n del mismo, su traducci贸n a lenguaje m谩quina, la prueba del programa y la depuraci贸n.
En la etapa de dise帽o se plantea el problema a resolver y se propone la mejor soluci贸n, creando diagramas esquem谩ticos utilizados para el mejor planteamiento de la soluci贸n.
La codificaci贸n del programa consiste en escribir el programa en alg煤n lenguaje de programaci贸n; en este caso espec铆fico en ensamblador, tomando como base la soluci贸n propuesta en el paso anterior.
La traducci贸n al lenguaje m谩quina es la creaci贸n del programa objeto, esto es, el programa escrito como una secuencia de ceros y unos que pueda ser interpretado por el procesador.
La prueba del programa consiste en verificar que el programa funcione sin errores, o sea, que haga lo que tiene que hacer.
La 煤ltima etapa es la eliminaci贸n de las fallas detectadas en el programa durante la fase de prueba. La correcci贸n de una falla normalmente requiere la repetici贸n de los pasos comenzando desde el primero o el segundo.
Para crear un programa en ensamblador existen dos opciones, la primera es utilizar el MASM (Macro Assembler, de Microsoft), y la segunda es utilizar el debugger, en esta primera secci贸n utilizaremos este 煤ltimo ya que se encuentra en cualquier PC con el sistema operativo MS-DOS, lo cual lo pone al alcance de cualquier usuario que tenga acceso a una m谩quina con estas caracteristicas.
Debug solo puede crear archivos con extensi贸n .COM, y por las caracter铆sticas de este tipo de programas no pueden ser mayores de 64 kb, adem谩s deben comenzar en el desplazamiento, offset, o direcci贸n de memoria 0100H dentro del segmento espec铆fico.
Registros de la UCP
La UCP tiene 14 registros internos, cada uno de 16 bits. Los primeros cuatro, AX, BX, CX, y DX son registros de uso general y tambien pueden ser utilizados como registros de 8 bits, para utilizarlos como tales es necesario referirse a ellos como por ejemplo: AH y AL, que son los bytes alto (high) y bajo (low) del registro AX. Esta nomenclatura es aplicable tambi茅n a los registros BX, CX y DX.
Los registros son conocidos por sus nombres espec铆ficos:
AX Acumulador
BX Registro base
CX Registro contador
DX Registro de datos
DS Registro del segmento de datos
ES Registro del segmento extra
SS Registro del segmento de pila
CS Registro del segmento de c贸digo
BP Registro de apuntadores base
SI Registro 铆ndice fuente
DI Registro 铆ndice destino
SP Registro del apuntador de la pila
IP Registro de apuntador de siguiente instrucci贸n
F Registro de banderas
Es posible visualizar los valores de los registros internos de la UCP utilizando el programa Debug. Para empezar a trabajar con Debug digite en el prompt de la computadora:
C:> Debug [Enter]
En la siguiente linea aparecera un gui贸n, 茅ste es el indicador del Debug, en este momento se pueden introducir las instrucciones del Debug. Utilizando el comando:
- r [Enter]
Se desplegaran todos los contenidos de los registros internos de la UCP; una forma alternativa de mostrarlos es usar el comando "r" utilizando como parametro el nombre del registro cuyo valor se quiera visualizar. Por ejemplo:
- rbx
Esta instrucci贸n desplegar谩 unicamente el contenido del registro BX y cambia el indicador del Debug de " - " a " : "
Estando as铆 el prompt es posible cambiar el valor del registro que se visualiz贸 tecleando el nuevo valor y a continuaci贸n [Enter], o se puede dejar el valor anterior presionando [Enter] sin telclear ning煤n valor.
Es posible cambiar el valor del registro de banderas, as铆 como utilizarlo como estructura de control en nuestros programas como se ver谩 mas adelante. Cada bit del registro tiene un nombre y significado especial, la lista dada a continuaci贸n describe el valor de cada bit, tanto apagado como prendido y su relaci贸n con las operaciones del procesador:
Overflow
NV = no hay desbordamiento;
OV = s铆 lo hay
Direction
UP = hacia adelante;
DN = hacia atras;
Interrupts
DI = desactivadas;
EI = activadas
Sign
PL = positivo;
NG = negativo
Zero
NZ = no es cero;
ZR = s铆 lo es
Auxiliary Carry
NA = no hay acarreo auxiliar;
AC = hay acarreo auxiliar
Parity
PO = paridad non;
PE = paridad par;
Carry
NC = no hay acarreo;
CY = S铆 lo hay
La estructura del ensamblador
En el lenguaje ensamblador las lineas de c贸digo constan de dos partes, la primera es el nombre de la instrucci贸n que se va a ejecutar y la segunda son los par谩metros del comando u operandos. Por ejemplo:
add ah bh
Aqu铆 "add" es el comando a ejecutar (en este caso una adici贸n) y tanto "ah" como "bh" son los par谩metros.
El nombre de las instrucciones en este lenguaje esta formado por dos, tres o cuatro letras. a estas instrucciones tambien se les llama nombres mnem贸nicos o c贸digos de operaci贸n, ya que representan alguna funci贸n que habr谩 de realizar el procesador.
Existen algunos comandos que no requieren parametros para su operaci贸n, as聮 como otros que requieren solo un par谩metro.
Algunas veces se utilizar谩n las instrucciones como sigue:
add al,[170]
Los corchetes en el segundo par谩metro nos indican que vamos a trabajar con el contenido de la casilla de memoria n煤mero 170 y no con el valor 170, a 茅sto se le conoce como direccionamiento directo.
Nuestro primer programa
Vamos a crear un programa que sirva para ilustrar lo que hemos estado viendo, lo que haremos ser谩 una suma de dos valores que introduciremos directamente en el programa:
El primer paso es iniciar el Debug, este paso consiste unicamente en teclear debug [Enter] en el prompt del sistema operativo.
Para ensamblar un programa en el Debug se utiliza el comando "a" (assemble); cuando se utiliza este comando se le puede dar como parametro la direcci贸n donde se desea que se inicie el ensamblado, si se omite el parametro el ensamblado se iniciar谩 en la localidad especificada por CS:IP, usualmente 0100H, que es la localidad donde deben iniciar los programas con extensi贸n .COM, y sera la localidad que utilizaremos debido a que debug solo puede crear este tipo espec铆fico de programas.
Aunque en este momento no es necesario darle un parametro al comando "a" es recomendable hacerlo para evitar problemas una vez que se haga uso de los registros CS:IP, por lo tanto tecleamos:
- a0100 [Enter]
Al hacer 茅sto aparecer谩 en la pantalla algo como: 0C1B:0100 y el cursor se posiciona a la derecha de estos n煤meros, n贸tese que los primeros cuatro d铆gitos (en sistema hexagesimal) pueden ser diferentes, pero los 煤ltimos cuatro deben ser 0100, ya que es la direcci贸n que indicamos como inicio. Ahora podemos introducir las instrucciones:
0C1B:0100 mov ax,0002 ;coloca el valor 0002 en el registro ax
0C1B:0103 mov bx,0004 ;coloca el valor 0004 en el registro bx
0C1B:0106 add ax,bx ;le adiciona al contenido de ax el contenido de bx
0C1B:0108 int 20 ; provoca la terminaci贸n del programa.
0C1B:010A
No es necesario escribir los comentarios que van despues del ";". Una vez digitado el 煤ltimo comando, int 20, se le da [Enter] sin escribir nada mas, para volver al prompt del debuger.
La 煤ltima linea escrita no es propiamente una instrucci贸n de ensamblador, es una llamada a una interrupci贸n del sistema operativo, estas interrupciones ser谩n tratadas mas a fondo en un cap铆tulo posterior, por el momento solo es necesario saber que nos ahorran un gran n煤mero de lineas y son muy 煤tiles para accesar a funciones del sistema operativo.
Para ejecutar el programa que escribimos se utliza el comando "g", al utilizarlo veremos que aparece un mensaje que dice: "Program terminated normally". Naturalmente con un mensaje como 茅ste no podemos estar seguros que el programa haya hecho la suma, pero existe una forma sencilla de verificarlo, utilizando el comando "r" del Debug podemos ver los contenidos de todos los registros del procesador, simplemente teclee:
- r [Enter]
Aparecera en pantalla cada registro con su respectivo valor actual:
AX=0006BX=0004CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000
DS=0C1BES=0C1BSS=0C1BCS=0C1BIP=010A NV UP EI PL NZ NA PO NC
0C1B:010A 0F DB oF
Existe la posibilidad de que los registros contengan valores diferentes, pero AX y BX deben ser los mismos, ya que son los que acabamos de modificar.
Otra forma de ver los valores, mientras se ejecuta el programa es utilizando como par谩metro para "g" la direcci贸n donde queremos que termine la ejecuci贸n y muestre los valores de los registros, en este caso ser铆a: g108, esta instrucci贸n ejecuta el programa, se detiene en la direcci贸n 108 y muestra los contenidos de los registros.
Tambi茅n se puede llevar un seguimiento de lo que pasa en los registros utilizando el comando "t" (trace), la funci贸n de este comando es ejecutar linea por linea lo que se ensambl贸 mostrando cada vez los contenidos de los regitros.
Para salir del Debug se utiliza el comando "q" (quit).
Guardar y cargar los programas
No ser铆a pr谩ctico tener que digitar todo un programa cada vez que se necesite, para evitar eso es posible guardar un programa en el disco, con la enorme ventaja de que ya ensamblado no ser谩 necesario correr de nuevo debug para ejecutarlo.
Los pasos a seguir para guardar un programa ya almacenado en la memoria son:
Obtener la longitud del programa restando la direcci贸n final de la direcci贸n inicial, naturalmente en sistema hexadecimal.
Darle un nombre al programa y extensi贸n
Poner la longitud del programa en el registro CX
Ordenar a Debug que escriba el programa en el disco.
Utilizando como ejemplo el programa del cap铆tulo anterior tendremos una idea mas clara de como llevar estos pasos:
Al terminar de ensamblar el programa se ver铆a as铆:
0C1B:0100 mov ax,0002
0C1B:0103 mov bx,0004
0C1B:0106 add ax,bx
0C1B:0108 int 20
0C1B:010A
- h 10a 100
020a 000a
- n prueba.com
- rcx
CX 0000
:000a
-w
Writing 000A bytes
Para obtener la longitud de un programa se utiliza el comando "h", el cual nos muestra la suma y resta de dos n煤meros en hexadecimal. Para obtener la longitud del nuestro le proporcionamos como par谩metros el valor de la direcci贸n final de nuestro programa (10A) y el valor de la direcci贸n inicial (100). El primer resultado que nos muestra el comando es la suma de los par谩metros y el segundo es la resta.
El comando "n" nos permite poner un nombre al programa.
El comando "rcx" nos permite cambiar el contenido del registro CX al valor que obtuvimos del tama帽o del archivo con "h", en este caso 000a, ya que nos interesa el resultado de la resta de la direcci贸n inicial a la direcci贸n final.
Por 煤ltimo el comando w escribe nuestro programa en el disco, indicandonos cuantos bytes escribi贸.
Para cargar un archivo ya guardado son necesarios dos pasos:
Proporcionar el nombre del archivo que se cargar谩.
Cargarlo utilizando el comando "l" (load).
Para obtener el resultado correcto de los siguientes pasos es necesario que previamente se haya creado el programa anterior.
Dentro del Debug escribimos lo siguiente:
- n prueba.com
- l
- u 100 109
0C3D:0100 B80200 MOV AX,0002
0C3D:0103 BB0400 MOV BX,0004
0C3D:0106 01D8 ADD AX,BX
0C3D:0108 CD20 INT 20
El 煤ltimo comando, "u", se utiliza para verificar que el programa se carg贸 en memoria, lo que hace es desensamblar el c贸digo y mostrarlo ya desensamblado. Los par谩metros le indican a Debug desde donde y hasta donde desensamblar.
Debug siempre carga los programas en memoria en la direcci贸n 100H, a menos que se le indique alguna otra.
Condiciones, ciclos y bifurcaciones
Estas estructuras, o formas de control le dan a la m谩quina un cierto grado de desici贸n basado en la informaci贸n que recibe.
La forma mas sencilla de comprender este tema es por medio de ejemplos.
Vamos a crear tres programas que hagan lo mismo: desplegar un n煤mero determinado de veces una cadena de caracteres en la pantalla.
- a100
0C1B:0100 jmp 125 ; brinca a la direcci贸n 125H
0C1B:0102 [Enter]
- e 102 'Cadena a visualizar 15 veces' 0d 0a '$'
- a125
0C1B:0125 MOV CX,000F ; veces que se desplegara la cadena
0C1B:0128 MOV DX,0102 ; copia cadena al registro DX
0C1B:012B MOV AH,09 ; copia valor 09 al registro AH
0C1B:012D INT 21 ; despliega cadena
0C1B:012F LOOP 012D ; si CX>0 brinca a 012D
0C1B:0131 INT 20 ; termina el programa.
Por medio del comando "e" es posible introducir una cadena de caracteres en una determinada localidad de memoria, dada como par谩metro, la cadena se introduce entre comillas, le sigue un espacio, luego el valor hexadecimal del retorno de carro, un espacio, el valor de linea nueva y por 煤ltimo el s铆mbolo '$' que el ensamblador interpreta como final de la cadena. La interrupci贸n 21 utiliza el valor almacenado en el registro AH para ejecutar una determinada funci贸n, en este caso mostrar la cadena en pantalla, la cadena que muestra es la que est谩 almacenada en el registro DX. La instrucci贸n LOOP decrementa automaticamente el registro CX en uno y si no ha llegado el valor de este registro a cero brinca a la casilla indicada como par谩metro, lo cual crea un ciclo que se repite el n煤mero de veces especificado por el valor de CX. La interrupci贸n 20 termina la ejecuci贸n del programa.
Otra forma de realizar la misma funci贸n pero sin utilizar el comando LOOP es la siguiente:
- a100
0C1B:0100 jmp 125 ; brinca a la direcci贸n 125H
0C1B:0102 [Enter]
- e 102 'Cadena a visualizar 15 veces' 0d 0a '$'
- a125
0C1B:0125 MOV BX,000F ; veces que se desplegara la cadena
0C1B:0128 MOV DX,0102 ; copia cadena al registro DX
0C1B:012B MOV AH,09 ; copia valor 09 al registro AH
0C1B:012D INT 21 ; despliega cadena
0C1B:012F DEC BX ; decrementa en 1 a BX
0C1B:0130 JNZ 012D ; si BX es diferente a 0 brinca a 012D
0C1B:0132 INT 20 ; termina el programa.
En este caso se utiliza el registro BX como contador para el programa, y por medio de la instrucci贸n "DEC" se disminuye su valor en 1. La instrucci贸n "JNZ" verifica si el valor de B es diferente a 0, esto con base en la bandera NZ, en caso afirmativo brinca hacia la direcci贸n 012D. En caso contrario contin煤a la ejecuci贸n normal del programa y por lo tanto se termina.
Una 煤tima variante del programa es utilizando de nuevo a CX como contador, pero en lugar de utilizar LOOP utilizaremos decrementos a CX y comparaci贸n de CX a 0.
- a100
0C1B:0100 jmp 125 ; brinca a la direcci贸n 125H
0C1B:0102 [Enter]
- e 102 'Cadena a visualizar 15 veces' 0d 0a '$'
- a125
0C1B:0125 MOV DX,0102 ; copia cadena al registro DX
0C1B:0128 MOV CX,000F ; veces que se desplegara la cadena
0C1B:012B MOV AH,09 ; copia valor 09 al registro AH
0C1B:012D INT 21 ; despliega cadena
0C1B:012F DEC CX ; decrementa en 1 a CX
0C1B:0130 JCXZ 0134 ; si CX es igual a 0 brinca a 0134
0C1B:0132 JMP 012D ; brinca a la direcci&oauten 012D
0C1B:0134 INT 20 ; termina el programa
En este ejemplo se us贸 la instrucci贸n JCXZ para controlar la condici贸n de salto, el significado de tal funci贸n es: brinca si CX=0
El tipo de control a utilizar depender谩 de las necesidades de programaci贸n en determinado momento.
Interrupciones
Definici贸n de interrupci贸n:
Una interrupci贸n es una instrucci贸n que detiene la ejecuci贸n de un programa para permitir el uso de la UCP a un proceso prioritario. Una vez concluido este 煤ltimo proceso se devuelve el control a la aplicaci贸n anterior.
Por ejemplo, cuando estamos trabajando con un procesador de palabras y en ese momento llega un aviso de uno de los puertos de comunicaciones, se detiene temporalmente la aplicaci贸n que estabamos utilizando para permitir el uso del procesador al manejo de la informaci贸n que est谩 llegando en ese momento. Una vez terminada la transferencia de informaci贸n se reanudan las funciones normales del procesador de palabras.
Las interrupciones ocurren muy seguido, sencillamente la interrupci贸n que actualiza la hora del d铆a ocurre aproximadamente 18 veces por segundo. Para lograr administrar todas estas interrupciones, la computadora cuenta con un espacio de memoria, llamado memoria baja, donde se almacenan las direcciones de cierta localidad de memoria donde se encuentran un juego de instrucciones que la UCP ejecutar谩 para despues regresar a la aplicaci贸n en proceso.
En los programas anteriores hicimos uso de la interrupcion n煤mero 20H para terminar la ejecuci贸n de nuestros programas, ahora utilizaremos otra interrupci贸n para mostrar informaci贸n en pantalla:
Utilizando Debug tecleamos:
- a100
2C1B:0100 JMP 011D
2C1B:0102 [ENTER]
- E 102 'Hola, como estas.' 0D 0A '$'
- A011D
2C1B:011D MOV DX,0102
2C1B:0120 MOV AH,09
2C1B:0122 INT 21
2C1B:0123 INT 20
En este programa la interrupci贸n 21H manda al monitor la cadena localizada en la direcci贸n a la que apunta el registro DX.
El valor que se le da a AH determina cual de las opciones de la interrupci贸n 21H sera utilizada, ya que esta interrupci贸n cuenta con varias opciones.
El manejo directo de interrupciones es una de las partes mas fuertes del lenguaje ensamblador, ya que con ellas es posible controlar eficientemente todos los dispositivos internos y externos de una computadora gracias al completo control que se tiene sobre operaciones de entrada y salida.
Menu principal Siguiente Capitulo
