Manual de Ensamblador PDF
Manual de Ensamblador PDF
Manual de Ensamblador PDF
Registros de segmento 1.1.2.1. Segmentacin y direccionamiento 1.1.3. Registro apuntador de instrucciones (IP). 1.1.4. Registros apuntadores (SP y BP). 1.1.5. Registros ndice (SI y DI). 1.1.6. Registro de banderas, flags, o registro de estado (FL). 1.2. Modos de direccionamiento 1.2.1. Registros de segmento por defecto 1.2.2. Direccionamiento de localidades de memoria 1.3. Pila (stack). 2. Conjunto de instrucciones. 3. Programacin del PC sobre dos 3.1. Directivas del ensamblador 3.1.1. Directivas para declaracin y manejo de segmentos. 3.1.2. Directivas para definicin de datos. 3.1.3. Etiquetas y variables 3.1.4. Constantes numricas 3.1.5. La Directiva EQU. 3.2. Esquema de un programa 3.3. Ensamblado, linkado y montado 3.4. Procedimientos 3.4.1. Paso de parmetros a procedimientos 3.4.1.1. Registros 3.4.1.2. Memoria Intermedia 3.4.1.3. Pila 3.5. Macros 3.5.1. Paso de parmetros a las macros 3.6. Interrupciones en el PC 3.6.1. Tratamiento de interrupciones 3.6.2. Interrupciones sectorizadas 3.6.3. Tipos de interrupciones. 3.6.4. Capturar una interrupcin 3.7. La memoria de vdeo 3.7.1. El sistema de visualizacin 3.7.2. El modo texto. 3.7.3. El modo grfico 3.8. Programas .COM 3.9. Programas residentes
www.detodoprogramacion.com
Juegos, Revistas, Cursos, Software, Sistemas Operativos, Antivirus y ms Gratis para el Conocimiento...! www.detodoprogramas.com Vistanos y comprubalo
Material para los amantes de la Programacin Java, C/C++/C#,Visual.Net, SQL, Python, Javascript, Oracle, Algoritmos, CSS, Desarrollo Web, Joomla, jquery, Ajax y Mucho Mas www.detodoprogramacion.com Visitanos
0.- INTRODUCCIN.
Este documento, ms que un manual de programacin en ensamblador del procesador de Intel 8086, es una manual de prcticas para los alumnos de Arquitectura e Computadores, ya que se han omitido intencionalmente muchos detalles y caractersticas de este lenguaje. Adems slo se hace mencin a la programacin en MS-DOS y con el ensamblador TASM de Borland.
www.detodoprogramacion.com
Los registros del procesador tienen como misin fundamental almacenar las posiciones de memoria que van a sufrir repetidas manipulaciones, ya que los accesos a memoria son mucho ms lentos que los accesos a los registros. El 8086 dispone de 14 registros de 16 bits que se emplean para controlar la ejecucin de instrucciones, direccionar la memoria y proporcionar capacidad aritmtica y lgica. Cada registro puede almacenar datos o direcciones de memoria. Los registros son direccionables por medio de un nombre. Por convencin los bits de un registro se numeran de derecha a izquierda: 15 1 14 0 13 0 12 0 11 0 10 1 9 1 8 0 7 1 6 0 5 0 4 0 3 1 2 1 1 1 0 0
Los diferentes registros del 8086 se clasifican en: registros de propsito general o de datos, registros de segmento, registro apuntador de instrucciones (IP), registros apuntadores (SP y BP), registros ndice (SI y DI) y registro de banderas, FLAGS o registro de estado (FL). AX BX CX DX Registros de propsito general o de datos SP BP SI DI Registros punteros y Registros ndice CS DS SS ES Registros de segmento IP FLAGS o FL Registro puntero de instrucciones; y Registro de banderas, FLAGS o de estado (FL)
Los registros de propsito general se pueden direccionar como una palabra o como un byte. El byte de la izquierda es la parte alta o byte ms significativo y el byte de la derecha es la parte o byte menos significativo.
www.detodoprogramacion.com
RX RH RL Siguiendo esta nomenclatura, es posible referirse a cada uno de los dos bytes, byte de orden alto o ms significativo y byte de orden bajo o menos significativo, de cada uno de estos registros. Por ejemplo: AH es el byte ms significativo del registro AX, mientras que AL es el byte menos significativo. As, por ejemplo, si AX contiene 00FFh, AH=00h (su parte alta) y AL=FFh (su parte baja); si lo incrementamos en 1, AX pasa a valer 0100h (lgicamente), y con ello AH=01h, AL=00h. Si en lugar de incrementar en 1 AX lo hacemos con AL (byte inferior), AH se quedar como estaba y AL ser FFh+01h=00h, es decir, AX=0000h (vamos, que cuando se manipula una parte del registro la otra no se ve afectada en absoluto, pero, obviamente, s el registro completo) Uno puede mover los datos de unos registros a otros con prcticamente total libertad. Tambin podremos realizar operaciones sobre ellos, como sumar el contenido de BX y DX para guardar el resultado en DX, y cosas as. La primera restriccin al respecto (y bastante razonable) es que los operandos tendrn que ser del mismo tamao (no podremos sumar BX con DH, por ejemplo).
www.detodoprogramacion.com
Figura 4. Construccin de una direccin de memoria en base a una direccin de segmento y una direccin de offset. Como vemos en la figura anterior, lo primero que se hace es aadir 4 bits a 0 al valor que se encuentra en el registro de segmento, lo cual es equivalente a multiplicar dicho valor por 16. Es por esto que cualquier segmento empieza siempre en una direccin de memoria (de 20 bits) mltiplo de 16, esto es, el segmento 0 comenzara en la direccin 00000h y acabara en la 0FFFFh; el segmento 1 comenzara en la direccin 00010h (16 en hexadecimal) y acabara en la 1000Fh; etc 16 bytes 00000h (0000:0000) 00010h (0001:0000) SEG 0 SEG 1 0FFFFh (0000:FFFF) 16 bytes 1000Fh (0001:FFFF)
Figura 5. Segmentacin de la memoria Por tanto, como podemos ver en la figura, los distintos segmentos se solapan, esto es, hay pares segmento-offset que apuntan a la misma direccin de memoria. Por ejemplo, dado el segmento 045EH y un desplazamiento de 0032H: Direccin del segmento: Desplazamiento dentro del segmento: Direccin real: y, dado el segmento 045FH y un desplazamiento de 0022H: Direccin del segmento: Desplazamiento dentro del segmento: Direccin real: 045F0H +0022H 04612H 045E0H +0032H 04612H
www.detodoprogramacion.com
Ahora bien, un programa puede tener uno o varios segmentos, los cuales pueden comenzar en casi cualquier lugar de la memoria, variar en tamao y estar en cualquier orden, pero en general, tendr un segmento para el cdigo, otro para los datos y otro para la pila. Para apuntar a estos segmentos es para lo que sirven los registros de segmento: Registro CS Registro DS Registro SS Registro ES Registro Segmento de Cdigo. Establece el rea de memoria dnde est el programa durante su ejecucin. Registro Segmento de Datos. Especifica la zona donde los programas leen y escriben sus datos. Registro Segmento de Pila. Permite la colocacin en memoria de una pila, para almacenamiento temporal de direcciones y datos. Registro Segmento Extra. Para acceder a un segmento distinto de los anteriores sin necesidad de modificar los otros registros de segmento.
El segmento de cdigo contiene las instrucciones que sern ejecutadas, mientras que el segmento de datos contiene los datos a los que las instrucciones hacen referencia.
En general, el registro IP indica el desplazamiento de la instruccin actual que es ejecutada dentro del segmento de cdigo; el registro SP indica el desplazamiento dentro del segmento de pila, apuntando al ltimo elemento introducido en la pila; y un operando (que sea una referencia a memoria) de una instruccin indica un desplazamiento en el segmento de datos del programa.
www.detodoprogramacion.com
Los registros de ndice se pueden usar como registros de datos sin problemas para sumas, movimiento de datos... no as los de segmento, que tienen fuertes limitaciones. Cuando se diga "un registro" como operando de una instruccin, eso incluye en principio cualquier registro menos los de segmento.
Los bits 0, 2, 4, 6, 7 y 11 son indicadores de condicin que reflejan los resultados de las operaciones del programa; los bits 8 al 10 son indicadores de control que, modificados por el programador, sirven para controlar ciertos modos de procesamiento, y el resto no se utilizan. El significado de cada uno de los bits es el siguiente:
www.detodoprogramacion.com
OF DF IF TF SF ZF AF PF CF
Bit de Overflow o desbordamiento. Indica desbordamiento de un bit de orden alto (ms a la izquierda), despus de una operacin aritmtica. Bit de Direccin. Designa la direccin, creciente (0) o decreciente (1), en operaciones con cadenas de caracteres. Bit de Interrupcin. Indica que una interrupcin externa, como la entrada desde el teclado, sea procesada o ignorada. Bit de Trap o Desvo. Procesa o ignora la interrupcin interna de trace (procesamiento paso a paso). Bit de Signo. Indica el valor del bit ms significativo del registro despus de una operacin aritmtica o de desplazamiento. Bit Cero. Se pone a 1 si una operacin produce 0 como resultado Bit de Carry Auxiliar. Se pone a 1 si una operacin aritmtica produce un acarreo del bit 3 al 4. Se usa para aritmtica especializada (ajuste BCD). Bit de Paridad. Se activa si el resultado de una operacin tiene paridad par. Bit de Acarreo. Contiene el acarreo de una operacin aritmtica o de desplazamiento de bits.
www.detodoprogramacion.com
Ejemplo: El operando fuente en MOV AX, [BX + 2] => copia en AX el contenido de la direccin DS:BX+2 5.- DIRECTO RELATIVO A UN REGISTRO INDICE. El operando es una direccin de memoria a la que se desea acceder, y se calcula en base a un registro ndice. Este registro ndice ser el SI o el DI. Ejemplo: El operando fuente en MOV AX, [SI + 10] => copia en AX el contenido de la direccin DS:SI+10 Si el desplazamiento no existe en los dos ltimos modos, hablamos de direccionamiento indirecto por registro base o por registro ndice. 6.- INDEXADO A PARTIR DE UNA BASE. El operando es una direccin de memoria a la que se desea acceder, y se calcula en base a un registro base y un registro ndice. Hay cuatro configuraciones posibles: el registro base puede ser el BX o el BP, y el registro ndice puede ser el SI o el DI. Ejemplo: El operando destino en MOV [BP + DI + 2], AX => copia en la direccin SS:BP+DI+2 el contenido de AX Estos tres ltimos modos de direccionamiento pueden resumirse en: [BX | BP] + [SI | DI] + [Desplazamiento] Si aparece BP el registro de segmento por defecto es SS, en caso contrario es DS. Nota: Los modos de direccionamiento del 3 al 6 pueden estar precedidos de un registro de segmento: MOV AX, ES: [BX + SI + 6].
IP SP BP BX SI DI
www.detodoprogramacion.com
REGISTRO
MEMORIA
3428H
2. PUSH AX: Se introduce en la pila AX se decrementa SP y se introduce el dato SS: direccin del segmento de pila ... SP=48 FA01H 3428H
www.detodoprogramacion.com
3. PUSH BX: Se introduce en la pila BX se decrementa SP y se introduce el dato SS: direccin del segmento de pila SP=46 A935H FA01H 3428H
4. POP BX: Se extrae de la pila un dato y se introduce en BX se extrae el dato y se incrementa SP. SS: direccin del segmento de pila SP=48 FA01H 3428H
www.detodoprogramacion.com
Su misin es intercambiar la informacin entre los registros y las posiciones de memoria. Las operaciones de este tipo ms relevantes son: Operacin Descripcin Banderas Formato Ejemplo MOV: Mover datos Transfiere datos entre dos registros o entre un registro y memoria, y permite llevar datos inmediatos a un registro o a memoria. No las afecta. MOV {registro/memoria},{registro/memoria/inmediato} MOV AX, 54AFH
Las operaciones MOV no permitidas son de memoria a memoria, inmediato a registro de segmento y de registro de segmento a registro de segmento. Para estas operaciones es necesario utilizar ms de una instruccin. Operacin Descripcin Banderas Formato Ejemplo XCHG: Intercambiar datos Intercambia datos entre dos registros o entre un registro y memoria. No las afecta. XCHG {registro/memoria},{registro/memoria} XCHG AL,AH
No pueden utilizarse registros de segmento como operandos, ni tampoco dos direcciones de memoria. Operacin Descripcin Banderas Formato Ejemplo Operacin Descripcin Banderas Formato Ejemplo Operacin Descripcin Banderas Formato Ejemplo PUSH: Guardar en la pila Guarda en la pila una palabra para su uso posterior. SP apunta al tope de la pila; PUSH decrementa SP en 2 y transfiere la palabra a SS:SP No las afecta PUSH {registro/memoria/inmediato(slo 286 o posteriores)} PUSH DX POP: Sacar una palabra de la pila Saca de la pila una palabra previamente guardada y la enva a un destino especificado. SP apunta al tope de la pila; POP la transfiere al destino especificado e incrementa SP en 2. No las afecta POP {registro(excepto CS, se debe usar RET)/memoria} POP BX LEA: Cargar direccin efectiva Carga una direccin cercana en un registro No las afecta LEA registro, memoria LEA AX, MEN1
La instruccin LEA AX, MEN1 es equivalente a MOV AX, OFFSET MEN1. Sin embargo no siempre ocurre as, por ejemplo, LEA DX, [SI + datos] corresponde a MOV DX, OFFSET datos, mas la instruccin ADD DX, SI.
www.detodoprogramacion.com
IMUL: Multiplicar con signo (enteros) Multiplica dos operandos con signo. IMUL trata el bit de ms a la izquierda como
www.detodoprogramacion.com
el signo CF y OF (AF, PF, SF y ZF quedan indefinidas). CF = OF = 1 => AH 0 DX 0. IMUL {registro/memoria} (Ver tabla) -Operando 2 R/M 8 bits R/M 16 bits Producto AX DX:AX Ejemplo IMUL BL IMUL BX
Operando 1 AL AX Operacin Descripcin Banderas Formato Ejemplo Dividendo AX DX:AX Operacin Descripcin Banderas Formato Ejemplo Dividendo AX DX:AX Operacin Descripcin Banderas Formato Ejemplo
DIV: Dividir sin signo Divide un dividendo sin signo entre un divisor sin signo. La divisin entre cero provoca una interrupcin de divisin entre cero. (AF, CF, OF, PF, SF y ZF quedan indefinidas) DIV {registro/memoria} (Ver tabla) -Divisor R/M 8 bits R/M 16 bits Cociente AL AX Resto AH DX Ejemplo DIV BL DIV CX
IDIV: Dividir con signo Divide un dividendo con signo entre un divisor con signo. La divisin entre cero provoca una interrupcin de divisin entre cero. IDIV trata el bit de la izquierda como el signo. (AF, CF, OF, PF, SF y ZF quedan indefinidas) IDIV {registro/memoria} -Divisor R/M 8 bits R/M 16 bits Cociente AL AX Resto AH DX Ejemplo IDIV BL IDIV CX
NEG: Niega Invierte un nmero binario de positivo a negativo y viceversa. NEG trabaja realizando el complemento a dos. AF, CF, OF, PF, SF y ZF. NEG {registro/memoria} NEG AL
www.detodoprogramacion.com
Se trata de instrucciones para realizar operaciones lgicas con los datos tales como AND, OR, XOR, etc., as como manipulacin de los mismos a nivel de bits.
www.detodoprogramacion.com
Se mueven todos los bits a la derecha, en el bit ms significativo se mete un cero, y el bit que sale por la derecha pasa a la bandera CF. 0 => => C
SAR: Desplazamiento aritmtico a la derecha Se mueven todos los bits a la derecha, en el bit ms significativo se mete la bandera SF, y el bit que sale por la derecha pasa a la bandera CF. S => => C
SHL: Desplazamiento lgico a la izquierda Se mueven todos los bits a la izquierda, en el bit menos significativo se mete un cero, y el bit que sale por la izquierda pasa a la bandera CF. C <= <= 0
SAL: Desplazamiento aritmtico a la izquierda (igual que SHL) ROR: Rotacin lgica a la derecha Se mueven todos los bits a la derecha, en el bit ms significativo se mete el bit que sale por la derecha, que se copia tambin en la bandera CF. => C
RCR: Rotacin a la derecha con acarreo Se mueven todos los bits a la derecha, en el bit ms significativo se mete el valor de la bandera CF, y el bit que sale por la derecha pasa a ser el nuevo valor de la bandera CF. CF => C
ROL: Rotacin lgica a la izquierda Se mueven todos los bits a la izquierda, en el bit menos significativo se mete el bit que sale por la izquierda, que se copia tambin en la bandera CF. C <=
RCL: Rotacin a la izquierda con acarreo Se mueven todos los bits a la izquierda, en el bit menos significativo se mete el valor de la bandera CF, y el bit que sale por la izquierda pasa a ser el nuevo valor de la bandera CF. C <=
www.detodoprogramacion.com
Dentro de esta categora de instrucciones, podemos distinguir entre instrucciones de transferencia de control condicionales e incondicionales, bucles, llamadas a procedimientos y subrutinas de atencin a la interrupcin. Las condicionales provocan una alteracin en la secuencia normal de ejecucin del programa, haciendo que el flujo de ejecucin salte de un punto del programa a otro sin que ambos sean consecutivos, dependiendo de que se cumpla o no una determinada condicin relacionada normalmente con el registro de estado. Las incondicionales tienen el mismo efecto pero sin depender de los valores que en ese momento tengan las banderas del registro de estado. Los bucles permiten ejecutar una determinada secuencia de operaciones varias veces. Por ltimo, los procedimientos o subrutinas aglutinan operaciones que se repiten reiteradamente a lo largo del programa, o bien, contienen instrucciones que realizan una accin muy especfica. 2.4.1.- Instrucciones de Transferencia de Control Condicionales. Transfieren el control dependiendo de las configuraciones en el registro de banderas. Por ejemplo, se pueden comparar dos datos y despus saltar considerando los valores de las banderas que la comparacin ha establecido. Cada instruccin posee un nico operando que no es ms que el desplazamiento que indica dnde ir si el test es positivo. Segn consideremos los datos a comparar con o sin signo, distinguimos tres tipos de saltos condicionales. Datos sin signo: Mnemnico JE/JZ JNE/JNZ JA/JNBE JAE/JNB JB/JNAE JBE/JNA Datos con signo: Mnemnico JE/JZ JNE/JNZ JG/JNLE JGE/JNL JL/JNGE JLE/JNG Tests aritmticos: Mnemnico JS JNS JC JNC JO JNO JP/JPE Descripcin Salto si signo negativo Salto si signo positivo Salto si carry Salto si no carry Salto si overflow Salto si no overflow Salto si paridad par Flags S=1 S=0 C=1 C=0 O=1 O=0 P=1 Descripcin Salto si igual Salto si no igual Salto si mayor Salto si mayor o igual Salto si menor Salto si menor o igual Flags Z=1 Z=0 Z=0yS=0 S=0 S <> O Z = 1 o S <> O Descripcin Salto si igual Salto si no igual Salto si superior Salto si superior o igual Salto si inferior Salto si inferior o igual Flags Z=1 Z=0 C=0yZ=0 C=0 C=1 C=1oZ=1
www.detodoprogramacion.com
JNP/JPO JCXZ
P=0 CX = 0
2.4.2.- Instrucciones de Transferencia de Control Incondicionales. Operacin Descripcin Banderas Formato Ejemplo 2.4.3.- Bucles. Un bucle es un grupo de instrucciones que se ejecutan cclicamente un nmero concreto de veces. Para construir bucles disponemos de las siguientes instrucciones: Operacin Descripcin LOOP: Repetir Controla la ejecucin de un grupo de instrucciones un nmero especfico de veces. Antes de iniciar el ciclo, CX debe contener el nmero de veces que ha de repetirse. LOOP aparece al final del conjunto de instrucciones que se repiten y decrementa CX. Al llegar a cero, permite que el flujo de ejecucin pase a la siguiente instruccin. En caso contrario salta a la etiqueta que determina el comienzo del bucle. No las afecta. LOOP etiqueta MOV CX,num_veces Etiqueta: ;Instrucciones del bucle LOOP Etiqueta JMP: Salto incondicional Salta a la direccin designada (operando). La direccin especificada puede ser corta (-128 a +127 bytes), cercana (dentro de 32K) o lejana (a otro segmento). No las afecta JMP {registro/memoria} JMP FINAL
Nota: LOOPE/LOOPZ tienen la misma funcin que LOOP, pero la condicin para salir del bucle es que CX = 0 Z = 0. Para LOOPNZ/LOOPNE la condicin es CX = 0 Z = 1. 2.4.4.- Llamada a procedimientos. Dentro del segmento de cdigo es posible tener cualquier nmero de procedimientos. Un procedimiento (o subrutina) es una seccin de cdigo que realiza una tarea bien definida y clara (por ejemplo, situar el cursor en una posicin concreta de la pantalla). La utilizacin de procedimientos en los programas es aconsejable porque: Reduce el nmero de lneas de cdigo. Permite una mejor organizacin del programa. Facilita la localizacin de errores. Aumenta la legibilidad del programa. La llamada a procedimientos se gestiona mediante dos instrucciones: CALL y RET. Operacin CALL: Llamar a un procedimiento
www.detodoprogramacion.com
Descripcin
Llama a un procedimiento cercano o lejano. En una llamada a un procedimiento cercano se guarda en la pila IP. Despus se carga el IP con el desplazamiento de la direccin de destino (donde se encuentra la primera instruccin del procedimiento). Si la llamada es a un procedimiento lejano, el proceso a seguir es el mismo pero ahora el tratamiento de las direcciones incluye tambin considerar el registro de segmento CS. No las afecta. CALL {registro/memoria} CALL PROCEDIMIENTO RET: Regresar de un procedimiento Regresa de un procedimiento al que se entr previamente con un CALL cercano o lejano. Lo que hace esta instruccin es recuperar de la pila la direccin de la siguiente instruccin que se almacen al hacer la llamada. Esto permitir continuar la ejecucin del programa en la siguiente instruccin al CALL. No las afecta. RET [VALOR POP] RET
2.6.- Instrucciones para Manejo de Cadenas. Una cadena es una secuencia de bytes contiguos. Las operaciones que se pueden realizar sobre las cadenas son las siguientes: Operacin Descripcin MOVSB/MOVSW: Mover cadena Mueve cadenas entre localidades de memoria. El primer operando es apuntado por ES:DI (destino) y el segundo operando por DS:SI (fuente). Normalmente se utiliza el prefijo REP que hace que la operacin se ejecute CX veces (se le resta uno a CX tras cada operacin), de forma que segn DF sea uno o cero, tras cada transferencia (byte o palabra) DI y SI disminuyen o aumentan. No las afecta. [REP] MOVSB/MOVSW MOV CX,3 REP MOVSB
Nota: CMPSB y CMPSW son similares a las dos instrucciones anteriores pero se utilizan para comparar bytes o palabras. Operacin Descripcin Banderas Formato Ejemplo LODSB/LODSW: Cargar un byte/palabra Carga el registro acumulador (AX o AL) con el valor de la localidad de memoria determinada por DS:SI. SI se incrementa tras la transferencia. No las afecta. LODSB/LODSW LODSB/LODSW
Nota: STOSB y STOSW son similares a las dos instrucciones anteriores pero se utilizan para almacenar bytes o palabras en posiciones de memoria. 2.7.- Instrucciones de entrada/salida.
www.detodoprogramacion.com
Los puertos de entrada y salida (E/S) permiten al procesador comunicarse con los perifricos. El 8086/88 utiliza buses de direcciones y datos ordinarios para acceder a los perifricos, pero habilitando una lnea que distinga el acceso a los mismos de un acceso convencional a la memoria (si no existieran los puertos de entrada y salida, los perifricos deberan interceptar el acceso a la memoria y estar colocados en un rea de la misma). Para acceder a los puertos de entrada y salida se utilizan las instrucciones IN y OUT. Operacin Descripcin Banderas Formato Ejemplo Operacin Descripcin Banderas Formato Ejemplo IN: Entrada Transfiere desde un puerto de entrada un byte a AL o una palabra a AX No las afecta. IN {AX/AL},{nmero_puerto/DX} Nmero_puerto entre [0..255] DX entre [0..65535] IN AL, 0Bh OUT: Salida Transfiere un byte desde AL o una palabra desde AX hasta el puerto. No las afecta. OUT {nmero_puerto/DX},{AX/AL} Nmero_puerto entre [0..255] DX entre [0..65535] OUT AL,0Bh
La siguiente tabla resume los distintos tipos de modelos de memoria: MODELO TINY SMALL COMPACT LARGE CARACTERSTICAS Datos y cdigo cogen en un solo segmento de 64K. Un segmento de datos y otro de cdigo. Mltiples segmentos de datos y un nico segmento de cdigo. Este modelo y el anterior son los que normalmente se utilizan. Mltiples segmentos de datos y de cdigo.
www.detodoprogramacion.com
HUGE Directiva Descripcin Formato Directiva Descripcin Formato Directiva Descripcin Formato Directiva Descripcin Formato Ejemplo Directiva Descripcin Formato
Mltiples segmentos de datos y de cdigo. Los segmentos pueden pasar 64K, pero haciendo operaciones especiales de normalizacin de direcciones. .DATA (ntese .) Las declaraciones siguientes se insertarn en el segmento de datos. Se contina donde la anterior directiva .DATA termin (vase seccin 4.2). .DATA .CODE (ntese .) Las declaraciones siguientes se insertarn en el segmento de cdigo. Se contina donde la anterior directiva .CODE termin (vase seccin 4.2) .CODE . STACK (ntese .) Las declaraciones siguientes se insertarn en el segmento de pila. Se contina donde la anterior directiva .STACK termin. (vase seccin 4.2) . STACK PROC Para definir cada uno de los procedimientos incluidos en el segmento de cdigo. NombreProc PROC ... NombreProc ENDP END Finaliza todo el programa. END [dir_inicial] ; Generalmente etiqueta del PROC principal.
Donde Dn es una de las directivas de la siguiente tabla: DIRECTIVA DB DW DD DF DQ DT EJEMPLO DESCRIPCIN Definir un byte. Sirve adems para definir cadenas de caracteres. Definir una palabra (2 bytes). Definir una palabra doble (4 bytes). Definir una palabra larga (6 bytes). Definir una palabra cudruple (8 bytes). Definir diez bytes (10 bytes). COMENTARIO
www.detodoprogramacion.com
DATO1 DATO2 DATO3 DATO4 DATO5 DATO6 DATO7 DATO8 DATO9 DATO10 DATO11 DATO12
DB DB DB DB DB DB DB DB DW DW DD DD
? 25 10101011B 1BH 1,2,3,4,5,6,7,8,9,10 5 DUP(?) 5 DUP(14) Cadena de caracteres 0FFF0H 10,12,14,16,18,20 ? 14,49
No se inicializa. Constante decimal. Constante binaria. Constante hexadecimal. Diez bytes inicializados. Cinco bytes no inicializados. Cinco bytes incializados a 14. Cadena de caracteres. 1 byte por cada caracter Constante hexadecimal. Seis palabras inicializadas. No se inicializa. Dos palabras dobles inicializadas.
Los datos se almacenan en memoria en el orden en que han sido declarados y podemos acceder a ellos usando el nombre dado en la declaracin. Por ejemplo, si declaramos los siguientes datos: Numero dw 5 Tabla 3, 4, 5 Cadena db hola El aspecto de la memoria sera el siguiente:
Cadena >
00 05 03 04 05 h o l a
Direcciones ascendentes
El nombre de cada dato es equivalente a una direccin de memoria, de forma que si sumamos o restamos un valor al nombre de una variable, accedemos a otra direccin de memoria. Por ejemplo: MOV MOV MOV MOV MOV AX, AL, AL, AL, AL, Numero Tabla Tabla + 1 Cadena Tabla + 3
www.detodoprogramacion.com
Asimismo, al igual que cuando operamos con dos registros, el tamao de la variable debe ser el mismo que el del otro operando, esto es, operaciones como las siguientes daran un error al ensamblar: MOV AL, Numero MOV AX, Tabla 3.1.3.- Etiquetas y variables. Un identificador es un nombre aplicado a elementos incluidos en el programa ensamblador. Hay dos tipos de identificadores que son: Nombre o etiqueta de dato: se refiere a la direccin de un dato almacenado en una determinada posicin de memoria, esto es, una variable. Etiqueta de instruccin: se refiere a la direccin de una instruccin. En TASM la etiqueta se debe escribir al principio de la lnea seguida de dos puntos (:) etiqueta: MOV AX, BX
Las mismas reglas se aplican tanto para los nombres como para las etiquetas: LETRAS DEL ALFABETO DGITOS CARACTERES ESPECIALES De la A a la Z. Del 0 al 9 (no puede ser el primer carcter). Signo de interrogacin ( ? ) Subrayado ( _ ) Signo del dlar ( $ ) Arroba ( @ ) Punto ( . )
Nota: ciertas palabras en lenguaje ensamblador estn reservadas para propsitos especficos y no pueden ser usadas como identificadores (instrucciones, directivas, operadores y todos aquellos smbolos predefinidos usados por el ensamblador). 3.1.4.- Constantes Numricas. Las constantes numricas se usan para definir valores aritmticos y direcciones de memoria. Las constantes numricas no llevan comillas, como sucede con las cadenas de caracteres, y van seguidas de un indicador de la base utilizada. Si se omite ste, se supone el sistema decimal. CONSTANTE DECIMAL HEXADECIMAL BINARIO FORMATO [-] 0...9[D] 0...F[H] 0/1[B] EJEMPLO 1234D 0F0AH 11101000B
Si el primer dgito de una constante hexadecimal es una letra (A..F), debe anteponerse un cero, para que el ensamblador pueda distinguir que se trata de una constante numrica y no una cadena de caracteres.
www.detodoprogramacion.com
.DATA ;declaracin de datos o variables, si las hay .CODE MOV AX, @DATA MOV DS, AX ;inicializamos DS ;aqu nuestro cdigo MOV AH, 4Ch INT 21h END Todo el texto que haya en una lnea despus de un ; (punto y coma) el TASM lo trata como un comentario. Las dos primeras lneas del cdigo sirven para que el registro DS tenga el valor del segmento donde el sistema operativo a introducido los datos al cargar el programa en memoria. Los registros CS y SS no es necesario inicializarlos, ya el Sistema Operativo se encarga de que apunten correctamente a los segmentos correspondientes, el de cdigo y el de la pila, respectivamente.
www.detodoprogramacion.com
Las dos ltimas lneas indican al Sistema Operativo que el programa ha terminado y le devuelve el control del sistema.
www.detodoprogramacion.com
Ensamblador
Linke
Cargador
Programa en ejecucin
3.4.- Procedimientos
Una procedimiento no es ms que una subrutina, o un fragmento de cdigo al que se le llama, generalmente varias veces, desde el programa principal, o desde una procedimiento, jerrquicamente superior. Un procedimiento se declara mediante la directiva PROC, y se puede declarar en cualquier parte del segmento de cdigo .CODE ... nombre_subrutina PROC ;cdigo de la subrutina RET ENDP ...
END
Cuando se llama a un procedimiento simplemente se realiza un salto al trozo de cdigo donde est definida la subrutina, y cuando sta termina se vuelve al cdigo desde el que se realiz la llamada. La llamada a la subrutina se realiza mediante la instruccin CALL y la vuelta al cdigo la realizamos con RET, por lo que es importante acabar siempre los procedimientos con esta instruccin: .CODE CALL nombre_procedimiento MOV AX, BX END nombre_ procedimiento PROC ;cdigo de la subrutina RET ENDP
Lo que ocurre realmente al hacer CALL es que, antes de realizar el salto, se almacena en la pila la direccin de retorno (la direccin de la siguiente instruccin a CALL), y la instruccin RET recupera esta direccin de la pila y salta a la misma. Una prctica muy comn y recomendable al escribir en una subrutina es guardar en la pila, al principio de su cdigo, todos los registros que vaya a modificar y volverlos a sacar al final del cdigo (antes de la instruccin RET). De esta forma el programa principal que realiza la llamada no
www.detodoprogramacion.com
tiene que preocuparse de que la subrutina pueda modificarle el valor de algn registro que le fuese necesario.
;equivalente a @DATA
www.detodoprogramacion.com
procedimientos recursivos, ya que cada vez que se llama al procedimiento se modifican los parmetros. PARAM1 DB ? PARAM2 DW ? . . . MOV PARAM1,6AH ;Guarda en PARAM1 el primer parmetro MOV PARAM2,12345D ;Guarda en PARAM2 el segundo parmetro CALL PROCEDIMIENTO ;Llama al procedimiento
3.4.1.3.- Pila.
La tercera posibilidad para pasar los parmetros es hacer uso de la pila. sta es la que se usa formalmente, aunque por su complejidad no la explicaremos en este manual. Antes de llamar a un procedimiento, el llamante introduce en la pila los parmetros del procedimiento llamado. Este mecanismo supone igual que en el caso anterior un consumo de memoria, pero en este caso slo temporalmente. Adems, esta posibilidad permite el uso de procedimientos recursivos.
3.5.- MACROS
Una macro es un fragmento de cdigo que el ensamblador copia, al ensamblar el cdigo, en las lneas que contengan llamadas a la macro, esto es, cada vez que se realiza una llamada a una MACRO se sustituye esa llamada por el cdigo de la MACRO. A diferencia del procedimiento no se realiza ningn salto ni la definicin de la macro es cdigo realmente (se convierte en cdigo cuando lo copia en el lugar de la llamada), por lo que podemos declarar la MACRO en cualquier parte, dentro o fuera de la zona de cdigo, aunque siempre la declaracin debe estar antes que la llamada. Para poder utilizar etiquetas dentro de las macros, debemos declararlas como locales, ya que en caso contrario, al hacer distintas llamadas, tendramos varias etiquetas con el mismo nombre. nombre_macro MACRO LOCAL etiqueta_local ... ENDM .CODE ;programa principal ... nombre_macro ;llamada a la MACRO. Esta lnea se sustituye por el cdigo dentro de la MACRO
END
www.detodoprogramacion.com
www.detodoprogramacion.com
Se ejecuta la instruccin que sigue a aquella que estaba ejecutndose cuando se produjo la interrupcin. La rutina de tratamiento de la interrupcin debe almacenar en la pila todos aquellos registros que vaya a utilizar antes de comenzar su tarea y restituirlos al finalizar, de modo que cuando se reanude la tarea interrumpida, se mantengan los valores que haba en los registros.
www.detodoprogramacion.com
(10H a 1FH) y procedimientos DOS (20H a 3FH) (el BIOS contiene un conjunto de rutinas que se encuentran en un chip de memoria ROM, o memoria de slo lectura, para dar soporte a los dispositivos). Llamada a procedimientos DOS y BIOS. Operacin Descripcin Banderas Formato Ejemplo Operacin Descripcin INT: Interrupcin Interrumpe el flujo normal de ejecucin de un programa, transfiriendo el control a una de las 256 direcciones que se encuentran almacenadas en la tabla de vectores de interrupcin. IF (0) y TF (0). INT N_Vector INT 21H IRET: Regresar de un procedimiento DOS o BIOS Descripcin Regresa de un procedimiento al que se entr previamente con INT. Lo que hace esta instruccin es recuperar de la pila la direccin de la siguiente instruccin que se almacen al hacer la llamada. Esto permitir continuar la ejecucin del programa en la siguiente instruccin a INT. No las afecta. IRET [VALOR POP] IRET
Las interrupciones internas o excepciones son generadas por el propio procesador cuando se produce una situacin anormal, como error de divisin o ejecucin paso a paso.
www.detodoprogramacion.com
La instruccin CLI inhabilita las interrupciones y STI las vuelve a habilitar. En otro punto del programa declararamos la nueva rutina de servicio: nuestra_rutina PROC ;guardar registros en la pila ... ;recuperar registros de la pila IRET ENDP
En la imagen se muestra un trozo de la pantalla en la que aparece la letra A construida con pxels. La divisin entre pxels est dibujada en un color ms suave. Las flechas al margen indican las medidas de un pxel.
www.detodoprogramacion.com
hasta llegar a la posicin (1,80), offset 158 (9EH). El offset 160 guardar el par correspondiente a la posicin (2,1) de la pantalla, y as hasta la direccin B800:0F9Eh (offset 3998) De una forma resumida, la frmula a aplicar para acceder a una posicin de la pantalla (f, c), donde f es la fila entre 1 y 25 y c es la columna entre 1 y 80, es: offset(f,c) = ( (f-1)*80 + (c-1) ) * 2 Finalmente, cmo se codifica el atributo de un carcter de la pantalla? Las siguientes tablas dicen cmo hacerlo: Bit 7 6-4 3 2-0 Bits de color 000b 001b 010b 011b 100b 101b 110b 111b Descripcin Parpadeo Color de fondo Color de fuente luminoso Color de fuente Normal Negro Azul Verde Cyan Rojo Magenta Marrn Gris claro Luminoso Gris oscuro Azul claro Verde claro Cyan claro Rojo claro Magenta claro Amarillo Blanco
Con lo que el atributo 07H, en binario 00000111b, equivale a un carcter gris claro (111b) sobre un fondo negro (000b), y es el tipo de carcter por defecto en MS-DOS.
www.detodoprogramacion.com
interrupcin 10h, conseguimos introducirnos en este modo de pantalla. Poniendo AH=00h, AL=03h, conseguimos volver al modo texto 80x25.
begin:
www.detodoprogramacion.com
;cdigo MOV AH, 4Ch INT 21h END main Para gererar el ejecutable .COM con el TASM, hay que linkar usando el parmetro /t tlink /t nombre
begin: ;cdigo residente residente: ;cdigo no residente MOV DX, offset residente INT 27h END main
www.detodoprogramacion.com
Juegos, Revistas, Cursos, Software, Sistemas Operativos, Antivirus y ms Gratis para el Conocimiento...! www.detodoprogramas.com Vistanos y comprubalo
Material para los amantes de la Programacin Java, C/C++/C#,Visual.Net, SQL, Python, Javascript, Oracle, Algoritmos, CSS, Desarrollo Web, Joomla, jquery, Ajax y Mucho Mas www.detodoprogramacion.com Visitanos