ctp1(repertorio instrucciones).pdf

11
Universidad de las Ciencias Informáticas Maquinas Computadoras I Curso 2006/2007 Manual del profesor ___________________________________________________________________________________________ Departamento de Sistemas Digitales 1 TEMA II. Microprocesadores. ACTIVIDAD #12. Clase Teórico Práctica 1. Repertorio de Instrucciones y Estructura de un programa. Sumario: 1. Repertorio de instrucciones. 2. Estructura de un programa. 3. Definición de variables. 4. Utilización del repertorio de instrucciones. Bibliografía: 1. Los microprocesadores Intel. Arquitectura, programación 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. Introducción 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 programación, además vimos aspectos muy importantes en la estructura interna de las microcomputadoras. En la CTP de hoy comenzaremos a dar los primeros pasos en la programación 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.

Upload: yenisley-padron-gonzalez

Post on 03-Jan-2016

14 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: CTP1(Repertorio Instrucciones).pdf

Universidad de las Ciencias Informáticas Maquinas Computadoras I Curso 2006/2007 Manual del profesor

___________________________________________________________________________________________ Departamento de Sistemas Digitales

1

TEMA II. Microprocesadores. ACTIVIDAD #12. Clase Teórico Práctica 1. Repertorio de Instrucciones y Estructura de un programa.

Sumario:

1. Repertorio de instrucciones.

2. Estructura de un programa.

3. Definición de variables.

4. Utilización del repertorio de instrucciones.

Bibliografía:

1. Los microprocesadores Intel. Arquitectura, programación 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. Introducción 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 programación, además vimos aspectos muy importantes en la estructura interna de

las microcomputadoras. En la CTP de hoy comenzaremos a dar los primeros pasos en la programación 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.

Page 2: CTP1(Repertorio Instrucciones).pdf

Máquinas Computadoras I

___________________________________________________________________________________________ Departamento de Sistemas Digitales

2

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 tamaño, 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';código ASCII de JR

MOV ECX,75371234H

MOV AL, VALOR

MOVZX, transfiere y extiende el cero. Se usa para convertir números de 8 ó 16 bits, en números 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 propósito 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.

Page 3: CTP1(Repertorio Instrucciones).pdf

Máquinas Computadoras I

___________________________________________________________________________________________ Departamento de Sistemas Digitales

3

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 propósito 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 operación PUSHA.

POPAD saca el doble de datos, y coloca los resultado en EDI, ESI, EBP, ESP, EBX, EDX, ECX y EAX.

Invierte la operación de PUSHAD.

POPF: Saca el registro de flags.

XCHG, intercambia el contenido de un registro con el contenido de otro registro o una localización 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 ; SUMA ES UNA VARIABLE

XCHG SUMA,AL ; SUMA ES UNA VARIABLE

IN: Entrada de datos desde un puerto de E/S // Se estudiarán después

OUT: Salida de datos hacia un puerto de E/S 1.2- Instrucciones Aritméticas 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 operación: en particular, se

afecta al flag de acarreo y puede usarse en subsiguientes instrucciones ADC (suma con acarreo que

veremos a continuación)

Page 4: CTP1(Repertorio Instrucciones).pdf

Máquinas Computadoras I

___________________________________________________________________________________________ Departamento de Sistemas Digitales

4

ADC oper1, oper2 ; realiza la suma entera: suma los dos operandos, más 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

operación: en particular, se afecta al flag de acarreo y una instrucción ADC subsiguiente puede hacer uso

de él.

INC oper ; incrementa en uno el único operando que utiliza

DECoper ; resta uno al operando.

Ejemplo:

INC AL

DEC BX

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 operación: 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, más 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 operación: 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 comparación se efectúa restando el primero menos el segundo, no se alteran

los operandos, sólo las banderas.

Si la ZF=1, el resultado fue 0 y los dos números son iguales

Si ZF=0, el resultado es distinto de 0 y los números son desiguales

Si CF=0, no hubo préstamo en la resta por lo que el primer número es mayor que el segundo

Si CF=1, hubo préstamo en la resta por lo que el primero es menor que el segundo

MUL oper

Multiplicación sin signo, se efectúa la multiplicación de dos números sin signo

En la multiplicación de 2 bytes, uno de ellos debe estar en el registro AL, el otro puede ser cualquier otro

registro de 8 bits o una dirección de memoria, el producto se coloca en AX.

Nota: r (registro)

m (memoria)

- Un número después de r o de m indica el tamaño en bits del dato.

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

Page 5: CTP1(Repertorio Instrucciones).pdf

Máquinas Computadoras I

___________________________________________________________________________________________ Departamento de Sistemas Digitales

5

r/m8 es un registro o el contenido una dirección 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 dirección 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 dirección de memoria de 32 bits

IMUL Multiplicación con signo (Estudio independiente)

DIV realiza la división entera sin signo.

DIV r/m8

DIV r/m16

DIV r/m32

r/m registro o memoria

El operando explícito proporcionado es el divisor; los operandos dividendo y destino están implícitos, 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 Lógicas

AND oper1, oper2

AND realiza la operación 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 operación 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

operación hubiese tenido lugar, pero no almacena en ningún lugar el resultado de la operación.

Page 6: CTP1(Repertorio Instrucciones).pdf

Máquinas Computadoras I

___________________________________________________________________________________________ Departamento de Sistemas Digitales

6

NOT oper

Inversión lógica o complemento a uno, invierte todos los bits del operando.

NEG oper

NEG sustituye el contenido de su operando por la negación 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 después hacen la operación descrita

anteriormente en la descripción

1.4- Instrucciones de desplazamiento y rotaciones.

SHL destino, fuente

Esta instrucción 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 instrucción 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 línea de código <Etiqueta> : inst <op destino>,<op fuente>; comentario

Page 7: CTP1(Repertorio Instrucciones).pdf

Máquinas Computadoras I

___________________________________________________________________________________________ Departamento de Sistemas Digitales

7

Etiqueta: son caracteres alfanuméricos que comienzan por una letra.

Inst: identificación de la instrucción

op destino, op origen: los operandos de la instrucción. Hay instrucciones que son de simple operandos,

otras que tienen 2 y otras que no se especifican en la instrucción pero que por diseño tienen los operando

definidos

2- Estructura de un programa .DOSSEG .MODEL SMALL .STACK .DATA ; Definición 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 específico (el segmento de código 1ro y el STACK al último).

Directiva .MODEL SMALL: Se considera un programa como SMALL cuando contiene hasta 64K de código

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 códigos que es donde se guarda el código escrito.

Directiva END: Fin del programa.

Como se puede observar después del .CODE vienen la instrucciones como tal, pero esas instrucciones

están dentro de un procedimiento (se estudiarán después) que es el procedimiento principal del programa,

esto aunque no es obligatorio para que nuestro programa funcione es una buena técnica a la hora de

programar y produce algunas ventajas que estudiaremos luego.

3- Definición de variables nombre tipoDato valor

nombre: nombre simbólico dado a la variable.

tipoDato: tamaño de la variable

DB byte (1 byte).

DW word (2 bytes).

DD doble palabra (4 bytes).

DF farword (6 bytes).

DQ quadword (8 bytes).

Page 8: CTP1(Repertorio Instrucciones).pdf

Máquinas Computadoras I

___________________________________________________________________________________________ Departamento de Sistemas Digitales

8

DT 10 bytes.

valor: puede ser una constante, una expresión que evalúa a una constante, o "?".

?: indica que el valor de la variable es indeterminado.

Se pueden definir múltiples valores separados por comas o usando el operando DUP

EJEMPLOS

dato db 20,21

dato1 dw '?'

cantidad db 10 dup(?)

Definición de constantes nombre equ valor

Ejemplo: cantidad equ 5

Variables de cadena Se inicializan con DB, están formadas por los códigos ASCII de los caracteres.

Ejemplos

version1 db 97,98,99; códigos ASCII

version2 db 'a','b','c'

version3 db 'abc' Códigos ASCII

Dec Hex Caracter 32 20 espacio

48-57 30-39 0-9

65-90 41-5A mayúsculas

97-122 61-7A minúsculas

10 0D retorno

4- Utilización 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; numero equ 2 Forma de declarar datos inicializados: char cinco_ceros [5] = {0}; cinco_ceros db 5 Dup(0) int meses =12; meses dw 12 Forma de declarar datos no inicializados: char a[23]; a db 23 Dup(?) int buffer[64] ; buffer dw 64 Dup(?)

Page 9: CTP1(Repertorio Instrucciones).pdf

Máquinas Computadoras I

___________________________________________________________________________________________ Departamento de Sistemas Digitales

9

Otras declaraciones: short int buffer = 120; buffer db 120 string cadena = “hola mundo”; cadena db “Hola mundo” Ejercicio #2

Elabore un programa en ensamblador que sume dos números que se encuentren en memoria. El resultado

debe ser guardado en otra variable que se encuentra también en memoria

Orientaciones: Primero debe tener dos variables que contengan los números que deseamos sumar y una tercera para

guardar el resultado, esta declaración 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 números y guardar el resultado en la variable resultado.)

.DOSSEG

.MODEL SMALL

.DATA Numero1 DB 50 ; Primer número

Numero2 DB 45 ; Segundo número

Resultado DB ? ; Para el resultado

.CODE

main PROC MOV AX, @DATA ; Actualizo el segmento de datos.

MOV DS, AX MOV AL, Numero1 ; Cargar primer número

ADD AL, Numero2 ; Sumar segundo

MOV Resultado, AL ; Guardar el resultado en memoria

main ENDP

END

Ejercicio # 3 Dada una lista de 5 números ordenados del 1 al 5 en una dirección de memoria llamada LISTA1

almacénelos en otra dirección de memoria llamada LISTA2.

En la solución del ejercicio solo hay una instrucción (loop) que no se ha dado en clases, pero por su fácil

uso se puede entender perfectamente (En la próxima clase se detallará su uso).

Para realizar este programa primero se debe de:

• Definir dos variables, una que tenga los 5 números en la dirección lista1 y otra con la dirección

lista2 para almacenar los números.

• Actualizar el DS con el segmento donde están las variables.

Page 10: CTP1(Repertorio Instrucciones).pdf

Máquinas Computadoras I

___________________________________________________________________________________________ Departamento de Sistemas Digitales

10

• Poner a apuntar al registro BX a la dirección de la lista1, esta acción es realizada mediante la

instrucción OFFSET, que permite cargar la dirección 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 números contenidos en la lista.

• Se efectúan todas las iteraciones del ciclo y apoyándonos 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 ; Inicio del procedimiento principal

MOV AX,@DATA ; Actualización del segmento de datos

MOV DS,AX MOV BX,OFFSET LISTA1 ; BX apunta al primer elemento de LISTA1.

MOV SI,0 ; SI va a hacer utilizado como índice de arreglo.

MOV CX,5 ; CX Contador, controla las iteraciones del ciclo.

ETIQ: ; Etiqueta para el ciclo.

MOV AL, [BX] ; Guarda en la parte baja del acumulador el contenido de la

; dirección a la que está apuntando el registro BX.

INC BX ; Incrementa el registro puntero BX.

MOV LISTA2[SI],AL ; Guarda en la dirección dada por LISTA2+SI el valor de AL

INC SI ; Se Incrementa el índice del arreglo para que se pueda acceder

; al siguiente elemento de la lista

LOOP ETIQ ; Salta a ETIQ y automáticamente 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 ; Fin del procedimiento.

END ; 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 dirección CADENA, averiguar cuantas

veces se repite el carácter que está almacenado en la variable CARACTER. El resultado se almacenará en

la variable CANTIDAD.

Page 11: CTP1(Repertorio Instrucciones).pdf

Máquinas Computadoras I

___________________________________________________________________________________________ Departamento de Sistemas Digitales

11

Conclusiones Con el desarrollo de esta clase hemos comenzado a dar nuestros primeros pasos en la programación con el

lenguaje ensamblador, vimos algunas de las principales instrucciones y realizamos algunos programas muy

simples pero que irán ganando en complejidad a medida que avance el semestre.

Confeccionado por:

Dpto. De Sistemas Digitales Fecha de última modificación: martes, 17 de octubre de 2006, 13:44:58