Está en la página 1de 11

Universidad de las Ciencias Informticas Maquinas Computadoras I Curso 2006/2007

Manual del profesor

TEMA II. Microprocesadores. ACTIVIDAD #12. Clase Terico Prctica 1. Repertorio de Instrucciones y Estructura de un programa.

Sumario: 1. Repertorio de instrucciones. 2. Estructura de un programa. 3. Definicin de variables. 4. Utilizacin del repertorio de instrucciones.

Bibliografa: 1. Los microprocesadores Intel. Arquitectura, programacin e interfaces. Tomo I y II

Objetivos: 1. Describir algunas de las principales instrucciones utilizadas en el lenguaje ensamblador. 2. Definir la estructura de un programa en lenguaje ensamblador. 3. Declarar variables en ensamblador. 4. Utilizar el repertorio de instrucciones del 386 en ejemplos sencillos.

1. Introduccin al lenguaje ensamblador. En la clase anterior se dieron las primeras nociones del lenguaje ensamblador y la importancia que tiene este en el mundo de la programacin, adems vimos aspectos muy importantes en la estructura interna de las microcomputadoras. En la CTP de hoy comenzaremos a dar los primeros pasos en la programacin en ensamblador; para lo cual utilizaremos el ensamblador MASM (Microsoft Macro Assembler), del cual veremos la estructura de un programa as como sus principales instrucciones.

___________________________________________________________________________________________ Departamento de Sistemas Digitales

Mquinas Computadoras I

1- Repertorio de instrucciones.
1.1- Instrucciones de movimientos de datos MOV destino, fuente Reglas a tener en cuenta: 1. El registro fuente puede ser cualquiera. 2. El registro CS, nunca podr ser usado como destino 3. Ambos operandos deben ser del mismo tamao, 8, 16 32 bits. 4. No se pueden hacer accesos de memoria a memoria. 5. No se puede colocar un valor inmediato en un registro de segmento. 6. Los dos operandos no pueden ser registros de segmento.

Ejemplos: MOV AL,DH MOV DI,BX MOV ESI,ECX MOV BL,11001001b MOV AX,'JR';cdigo ASCII de JR MOV ECX,75371234H MOV AL, VALOR

MOVZX, transfiere y extiende el cero. Se usa para convertir nmeros de 8 16 bits, en nmeros de 16 32 bits sin signo, se rellenan con ceros la parte alta del registro destino. Ej. MOVZX SI,AL; convierte el valor de 8 bits de AL a 16 bits en SI

PUSH: Empuja datos a la pila. PUSH decrementa el puntero de pila (SP) en 2 o en 4, y luego almacena el valor dado en [SS:SP] Ejemplo: PUSH AX PUSH EAX PUSH DX

: Empujar todos los registros de propsito general. PUSHAD PUSHA

PUSHA empuja, sucesivamente, AX, CX, DX, BX, SP, BP, SI y DI a la pila, decrementando el puntero de pila en un total de 16.

___________________________________________________________________________________________ Departamento de Sistemas Digitales

Mquinas Computadoras I

PUSHAD empuja, sucesivamente, EAX, ECX, EDX, EBX, ESP, EBP, ESI y EDI a la pila, decrementando el puntero de pila en un total de 32.

PUSHF: Empuja el registro de flags.

POP oper

; Saca datos desde la pila.

POP carga un valor desde la pila desde [SS:SP] y luego incrementa el puntero de pila. Ejemplo: POP DS POP ES POP SS POP FS POP GS Sacar todos los registros de propsito general. POPA POPAD

POPA saca una palabra desde la pila en cada uno de los, sucesivamente, DI, SI, BP, SP, BX, DX, CX y AX. Invierte la operacin PUSHA. POPAD saca el doble de datos, y coloca los resultado en EDI, ESI, EBP, ESP, EBX, EDX, ECX y EAX. Invierte la operacin de PUSHAD.

POPF: Saca el registro de flags.

XCHG, intercambia el contenido de un registro con el contenido de otro registro o una localizacin de memoria; no se puede ejecutar en registros de segmento ni si los dos operandos son localizaciones de memoria.

Ejemplo: XCHG AX,BX XCHG AL,SUMA XCHG SUMA,AL ; SUMA ES UNA VARIABLE ; SUMA ES UNA VARIABLE

IN: Entrada de datos desde un puerto de E/S // Se estudiarn despus OUT: Salida de datos hacia un puerto de E/S 1.2- Instrucciones Aritmticas ADD oper1, oper2 ; realiza la suma entera: suma sus dos operandos, y deja el resultado en el

operando (el primero) destino. Los flags se activan de acuerdo al resultado de la operacin: en particular, se afecta al flag de acarreo y puede usarse en subsiguientes instrucciones ADC (suma con acarreo que veremos a continuacin)

___________________________________________________________________________________________ Departamento de Sistemas Digitales

Mquinas Computadoras I ADC oper1, oper2

; realiza la suma entera: suma los dos operandos, ms el valor del flag de acarreo, y

deja el resultado en su operando (el primero) destino. Los flag se activan de acuerdo al resultado de la operacin: en particular, se afecta al flag de acarreo y una instruccin ADC subsiguiente puede hacer uso de l.

INC oper DECoper Ejemplo: INC AL DEC BX

; incrementa en uno el nico operando que utiliza ; resta uno al operando.

INC contador ; contador es una variable

SUB oper1, oper2 SUB realiza la resta entre enteros: resta su segundo operando del primero, y deja el resultado en su operando (el primero) destino. Los flags se activan de acuerdo con el resultado de la operacin: en particular, se afecta al flag de acarreo o y se puede usar en subsiguientes instrucciones SBB.

SBB oper1, oper2 SBB realiza la resta entre enteros: resta su segundo operando, ms el valor del flag de acarreo, de su primero, y deja el resultado en el operando (el primero) destino. Los flags se activan de forma acorde con el resultado de la operacin: en particular, se afecta al flag de acarreo y se puede usar en subsiguientes instrucciones SBB. Haciendo una similitud con C++ oper1= oper1-(oper2-Carry);

CMP oper1, oper2 Compara dos operandos, la comparacin se efecta restando el primero menos el segundo, no se alteran los operandos, slo las banderas. Si la ZF=1, el resultado fue 0 y los dos nmeros son iguales Si ZF=0, el resultado es distinto de 0 y los nmeros son desiguales Si CF=0, no hubo prstamo en la resta por lo que el primer nmero es mayor que el segundo Si CF=1, hubo prstamo en la resta por lo que el primero es menor que el segundo

MUL oper Multiplicacin sin signo, se efecta la multiplicacin de dos nmeros sin signo En la multiplicacin de 2 bytes, uno de ellos debe estar en el registro AL, el otro puede ser cualquier otro registro de 8 bits o una direccin de memoria, el producto se coloca en AX. Nota: r (registro) m (memoria) - Un nmero despus de r o de m indica el tamao en bits del dato.

(*) Para MUL r/m8, AL se multiplica por el operando dado; el producto se almacena en AX. ___________________________________________________________________________________________ Departamento de Sistemas Digitales

Mquinas Computadoras I r/m8 es un registro o el contenido una direccin de memoria de 8 bits (*) Para 'MUL r/m16, AX se multiplica por el operando dado; el producto se almacena en DX:AX. r/m16 es un registro o el contenido una direccin de memoria de 16 bits. (*) Para MUL r/m32, EAX se multiplica por el operando dado; el producto se almacena en EDX:EAX. r/m32 es un registro o el contenido una direccin de memoria de 32 bits

IMUL Multiplicacin con signo (Estudio independiente)

DIV realiza la divisin entera sin signo. DIV r/m8 DIV r/m16 DIV r/m32 r/m registro o memoria El operando explcito proporcionado es el divisor; los operandos dividendo y destino estn implcitos, del siguiente modo:

(*) Para DIV r/m8, AX se divide por el operando dado; el cociente se almacena en AL y el resto en AH. (*) Para DIV r/m16, DX:AX se divide por el operando dado; el cociente se almacena en AX y el resto en DX. (*) Para DIV r/m32, EDX:EAX se divide por el operando dado; el cociente se almacena en EAX y el resto en EDX.

1.3- Instrucciones Lgicas AND oper1, oper2 AND realiza la operacin AND entre BITs entre sus dos operandos (esto es, cada BIT del resultado es 1 si y solo si los BITs correspondientes de las dos entradas son ambos 1), y almacena el resultado en el operando destino.

OR oper1, oper2 OR realiza una operacin OR a nivel de BIT entre sus dos operandos (esto es, cada BIT del resultado es 1 si y solo si al menos uno de los BITs correspondientes de las dos entradas es 1), y almacena el resultado en el operando destino.

XOR oper1, oper2 XOR realiza un OR exclusivo a nivel de BIT entre sus dos operandos (esto es, cada BIT del resultado es un 1 si y solo si exactamente uno de los BITs correspondientes de las dos entradas es 1), y almacena el resultado en su operando destino.

TEST oper1, oper2. TEST realiza mentalmente un AND a nivel de BIT de sus dos operandos, y afecta a los flags como si la operacin hubiese tenido lugar, pero no almacena en ningn lugar el resultado de la operacin.

___________________________________________________________________________________________ Departamento de Sistemas Digitales

Mquinas Computadoras I NOT oper Inversin lgica o complemento a uno, invierte todos los bits del operando.

NEG oper NEG sustituye el contenido de su operando por la negacin en complemento a dos (invierte todos los BITs y luego suma uno)

BT destino,fuente: Prueba un bit en el operando destino especificado por el operando fuente.

BTC destino,fuente: Prueba y complementa un bit en el operando destino especificado por el operando fuente. BTR destino,fuente: Prueba y hace cero un bit en el operando destino especificado por el operando fuente.

BTS destino,fuente: Prueba y hace uno un bit en el operando destino especificado por el operando fuente.

Ej. BT AX,4; prueba el bit 4 en AX, el resultado se coloca en la bandera del acarreo CF; si el bit 4 tiene un 1, CF es 1. Las otras tres instrucciones colocan el bit sometido a prueba en CF y despus hacen la operacin descrita anteriormente en la descripcin 1.4- Instrucciones de desplazamiento y rotaciones.

SHL destino, fuente Esta instruccin realiza un desplazamiento de los bits del operando destino hacia la izquierda tantas veces tenga el contenido del operando fuente. Los BITs desocupados se rellenan con cero.

SHR destino, fuente Igual que la anterior pero hacia la derecha.

ROL destino, fuente Esta instruccin realiza un desplazamiento de los bits del operando destino hacia la izquierda tantas veces tenga el contenido del operando fuente.

Ejemplo MOV AL,10010100b ROL AL,1 ; AL hora vale 00101001b

ROR destino, fuente Igual que la anterior pero hacia la derecha. Estructura de una lnea de cdigo <Etiqueta> : inst <op destino>,<op fuente>; comentario ___________________________________________________________________________________________ Departamento de Sistemas Digitales

Mquinas Computadoras I Etiqueta: son caracteres alfanumricos que comienzan por una letra. Inst: identificacin de la instruccin

op destino, op origen: los operandos de la instruccin. Hay instrucciones que son de simple operandos, otras que tienen 2 y otras que no se especifican en la instruccin pero que por diseo tienen los operando definidos

2- Estructura de un programa
.DOSSEG .MODEL SMALL .STACK .DATA ; Definicin de variables .CODE main PROC ;Instrucciones main ENDP END

Directiva .DOSSEG: indica al ensamblador que queremos los segmentos de nuestro programa cargados en un orden especfico (el segmento de cdigo 1ro y el STACK al ltimo). Directiva .MODEL SMALL: Se considera un programa como SMALL cuando contiene hasta 64K de cdigo y 64K de datos. Directiva .STACK: Define un segmento de pila. Directiva .DATA: Declara un segmento de datos que se usa para variables de memoria. Directiva .CODE: Declara un segmento de cdigos que es donde se guarda el cdigo escrito. Directiva END: Fin del programa.

Como se puede observar despus del .CODE vienen la instrucciones como tal, pero esas instrucciones estn dentro de un procedimiento (se estudiarn despus) que es el procedimiento principal del programa, esto aunque no es obligatorio para que nuestro programa funcione es una buena tcnica a la hora de programar y produce algunas ventajas que estudiaremos luego.

3- Definicin de variables
nombre tipoDato valor

nombre: nombre simblico dado a la variable. tipoDato: tamao de la variable DB byte DW word (1 byte). (2 bytes).

DD doble palabra (4 bytes). DF farword (6 bytes).

DQ quadword (8 bytes). ___________________________________________________________________________________________ Departamento de Sistemas Digitales

Mquinas Computadoras I DT 10 bytes. valor: puede ser una constante, una expresin que evala a una constante, o "?". ?: indica que el valor de la variable es indeterminado. Se pueden definir mltiples valores separados por comas o usando el operando DUP

EJEMPLOS dato db 20,21 dato1 dw '?' cantidad db 10 dup(?)

Definicin de constantes nombre equ valor Ejemplo: cantidad equ 5 Variables de cadena Se inicializan con DB, estn formadas por los cdigos ASCII de los caracteres.

Ejemplos version1 db 97,98,99; cdigos ASCII version2 db 'a','b','c' version3 db 'abc' Cdigos ASCII Dec Hex 32 48-57 65-90 97-122 10 20 30-39 41-5A 61-7A 0D

Caracter espacio 0-9 maysculas minsculas retorno

4- Utilizacin del repertorio de instrucciones.


Ejercicio #1 Dada una serie de declaraciones de variables en C++, escriba su correspondiente en ensamblador. Forma de declarar constantes: const int numero = 2; Forma de declarar datos inicializados: char cinco_ceros [5] = {0}; int meses =12;

numero equ 2

cinco_ceros db 5 Dup(0) meses dw 12

Forma de declarar datos no inicializados: char a[23]; a db 23 Dup(?) int buffer[64] ; buffer dw 64 Dup(?)

___________________________________________________________________________________________ Departamento de Sistemas Digitales

Mquinas Computadoras I Otras declaraciones: short int buffer = 120; string cadena = hola mundo; Ejercicio #2

buffer db 120 cadena db Hola mundo

Elabore un programa en ensamblador que sume dos nmeros que se encuentren en memoria. El resultado debe ser guardado en otra variable que se encuentra tambin en memoria Orientaciones: Primero debe tener dos variables que contengan los nmeros que deseamos sumar y una tercera para guardar el resultado, esta declaracin de las variables se hace en el espacio (. Data), luego en el (.Code) va el cuerpo del programa, ah primero se actualiza el segmento de datos y luego se implementa el programa como tal (realizar el procedimiento de sumar los nmeros y guardar el resultado en la variable resultado.)

.DOSSEG .MODEL SMALL .DATA


Numero1 Numero2 DB 50 DB 45 ; Primer nmero ; Segundo nmero ; Para el resultado

Resultado DB ?

.CODE main PROC


MOV AX, @DATA MOV DS, AX MOV AL, Numero1 ADD AL, Numero2 MOV Resultado, AL ; Cargar primer nmero ; Sumar segundo ; Guardar el resultado en memoria ; Actualizo el segmento de datos.

main ENDP END

Ejercicio # 3 Dada una lista de 5 nmeros ordenados del 1 al 5 en una direccin de memoria llamada LISTA1 almacnelos en otra direccin de memoria llamada LISTA2. En la solucin del ejercicio solo hay una instruccin (loop) que no se ha dado en clases, pero por su fcil uso se puede entender perfectamente (En la prxima clase se detallar su uso).

Para realizar este programa primero se debe de: Definir dos variables, una que tenga los 5 nmeros en la direccin lista1 y otra con la direccin lista2 para almacenar los nmeros. Actualizar el DS con el segmento donde estn las variables.

___________________________________________________________________________________________ Departamento de Sistemas Digitales

Mquinas Computadoras I

10

Poner a apuntar al registro BX a la direccin de la lista1, esta accin es realizada mediante la instruccin OFFSET, que permite cargar la direccin efectiva de la variable LISTA1 hacia el registro BX.

Inicializar el puntero SI con el valor 0. Pasarle al registro contador (CX) la cantidad de nmeros contenidos en la lista. Se efectan todas las iteraciones del ciclo y apoyndonos en los diferentes modos de direccionamientos vistos en la conferencia, realizamos una copia de LISTA1 a LISTA2. Por ltimo dar fin al procedimiento y fin al programa.

DOSSEG .MODEL SMALL .DATA LISTA1 DB 1,2,3,4,5 LISTA2 DB 5 DUP (?) .CODE NUMEROS PROC MOV AX,@DATA MOV DS,AX MOV BX,OFFSET LISTA1 MOV SI,0 MOV CX,5 ETIQ: MOV AL, [BX] ; BX apunta al primer elemento de LISTA1. ; SI va a hacer utilizado como ndice de arreglo. ; CX Contador, controla las iteraciones del ciclo. ; Etiqueta para el ciclo. ; Guarda en la parte baja del acumulador el contenido de la ; direccin a la que est apuntando el registro BX. INC BX MOV LISTA2[SI],AL INC SI ; Incrementa el registro puntero BX. ; Guarda en la direccin dada por LISTA2+SI el valor de AL ; Se Incrementa el ndice del arreglo para que se pueda acceder ; al siguiente elemento de la lista LOOP ETIQ ; Salta a ETIQ y automticamente decrementa a CX ; sale del lazo cuando el contador (CX) llega a 0 (Esta forma de ; implementar un ciclo es similar al for de C++) NUMEROS ENDP END ; Fin del procedimiento. ; Inicio del procedimiento principal ; Actualizacin del segmento de datos

; Fin del programa.

Estudio independiente.
1- Instrucciones de transferencias del control del programa 2- Dada una cadena de 20 caracteres almacenados a partir de la direccin CADENA, averiguar cuantas veces se repite el carcter que est almacenado en la variable CARACTER. El resultado se almacenar en la variable CANTIDAD.

___________________________________________________________________________________________ Departamento de Sistemas Digitales

Mquinas Computadoras I

11

Conclusiones
Con el desarrollo de esta clase hemos comenzado a dar nuestros primeros pasos en la programacin con el lenguaje ensamblador, vimos algunas de las principales instrucciones y realizamos algunos programas muy simples pero que irn ganando en complejidad a medida que avance el semestre.

Confeccionado por: Dpto. De Sistemas Digitales


Fecha de ltima modificacin: martes, 17 de octubre de 2006, 13:44:58

___________________________________________________________________________________________ Departamento de Sistemas Digitales