26
COMPONENTES DEL LENGUAJE ENSAMBLADOR (UNIDAD No. 2) Instituto Tecnológico de Villahermosa ACADEMIA DE SISTEMAS Y COMPUTACIÓN INGENIERÍA EN SISTEMAS COMPUTACIONALES MGTI. FIDELIO CASTILLO ROMERO. Villahermosa, Tabasco, México. Septiembre 2011.

Presentación2 Lenguaje Ensamblador

Embed Size (px)

Citation preview

Page 1: Presentación2 Lenguaje Ensamblador

COMPONENTES DEL LENGUAJE

ENSAMBLADOR (UNIDAD No. 2)

Instituto Tecnológico de VillahermosaACADEMIA DE SISTEMAS Y COMPUTACIÓN

INGENIERÍA EN SISTEMAS COMPUTACIONALES

MGTI. FIDELIO CASTILLO ROMERO.

Villahermosa, Tabasco, México. Septiembre 2011.

Page 2: Presentación2 Lenguaje Ensamblador

1. TEMARIOUnidad No. 2. Elementos básicos del lenguaje ensamblador

Constantes enteras y reales, expresiones enteras, palabras reservadas, identificadores, directivas e instrucciones

Definición de datos Constantes simbólicas Transferencias de datos: Operandos, instrucciónes MOV, MOVSX, MOVZX,

LAHF, SAHF, XCHG, operandos de desplazamiento directo, Aritmética (suma y resta): Instrucciones INC, DEC, SUB, NEG Operadores y directivas relacionadas con los datos: Operadores OFFSET,

PTR, TYPE, LENGTHOF, SIZEOF, directivas LABEL, ALIGN Instrucciones JMP y LOOP Direccionamiento indirecto: operandos indirectos, arreglos, operandos

indexados, apuntadores

Page 3: Presentación2 Lenguaje Ensamblador

Constantes enteras[{+|-}] dígitos [raíz]

La raíz puede ser una de las siguientes (en mayúsculas o minúsculas):h Hexadecimal r Real codificado q/o Octald Decimal b Binario

Si no se da una raíz, se asume que la constante entera es decimal.

Ejemplos de constantes con distintas raíces:26 26d 11010101b 42q 42o 2Ah 0Ah

Las constantes hexadecimales que comiencen con una letra debe tener un cero a la izquierda para que no se interprete como identificador.

Expresiones enterasLa expresión se debe evaluar como un entero que se puede almacenar en 32 bits (0 al FFFFFFFFh)

Precedencia de operadores aritméticos

Operador Nombre Nivel de Precedencia

( ) Paréntesis 1

+, - Unario positivo, unario negativo

2

*, /, MOD Producto, división, Módulo 3

+, - Suma, Resta 4

Expresión Valor

25/3 8

-(2+3)*(9-4) -25

13 mod 2 1

Ejemplos de expresiones válidas:

Page 4: Presentación2 Lenguaje Ensamblador

Constantes reales[{+|-}] entero.[entero] [exponente]

Exponente E[{+,-}]enteroEjemplos de constantes reales: 5. +17.0 -30.5E+2En las constantes reales es necesario por lo menos, un dígito y un punto decimal.

Constantes tipo carácterEs un solo carácter encerrado entre comillas sencillas o dobles. MASM almacena el valor en memoria como el código ASCII binario del carácter. Ejemplos: ‘A’ o “B”

Constantes tipo cadenaEs una secuencia de caracteres encerrados entre comillas sencillas o dobles.

‘123’ “Rafael Márquez”Se pueden agregar comillas a la cadena, siempre y cuando se utilicen de la siguiente manera:‘Hola “equipo de lenguaje ensamblador”, suerte’

Palabras reservadasTienen un significado especial en MASM y sólo pueden usarse dentro de su contexto correcto. Tipos de palabras reservadas: Nemónicos de instrucciones: MOV, CALL, ADD, SUB Directivas que indican a MASM como ensamblar programas Atributos, que proporcionan información acerca del tamaño y

uso de las variables y operando: BYTE, DWORD Operadores, que se utilizan en expresiones constantes: MOD Símbolos predefinidos como @code (El nombre del segmento

de código –macro-)

IdentificadoresUn identificador es un nombre elegido por el programador. Identifica a una variable, una constante, un procedimiento o una etiqueta de código. Pueden contener entre 1 y 247 caracteres No son sensibles a mayúsculas/minúsculas El primer carácter debe ser una letra (A..Z, a..z), guión bajo

(_), @, ? o $. Los caracteres subsiguientes también pueden ser dígitos

Page 5: Presentación2 Lenguaje Ensamblador

DirectivasUna directiva es un comando incrustado en el código fuente, que el ensamblador

reconoce y actúa en base a ésta. Pueden definir variables, macros y procedimientos, asignar nombres a los segmentos de memoria y realizar muchas otras tareas relacionadas con el ensamblador.

No son sensibles a mayúsculas/minúsculas. MASM reconoce a .DATA, .Data, .data como equivalentes.

Cada ensamblador tiene un conjunto distinto de directivas. Por ejemplo, TASM y NASM comparten un subconjunto común de directivas con MASM. El ensamblador GNU casi no tiene directivas en común con MASM.

InstruccionesUna instrucción es un enunciado que se vuelve ejecutable cuando se ensambla un programa. Contiene 4 partes básicas:

[etiqueta:] nemónico operando(s) [; comentario]

Etiqueta. Identificador que actúa como marcador de posición para las instrucciones y los datos. Una etiqueta que se coloca justo antes de una instrucción, representa la dirección de esa instrucción; una etiqueta que se coloca antes de una variable, representa la dirección de esa variable (cuenta DWORD 100)

Page 6: Presentación2 Lenguaje Ensamblador

InstruccionesEn el ejemplo siguiente, la etiqueta arreglo define la ubicación del primer número (1024). Los demás números que le siguen van en la memoria de forma consecutiva.

Arreglo DWORD 1024, 2048DWORD 4096, 8192

Una etiqueta en el área de código de un programa debe terminar con un carácter de dos puntos (:). En este contexto las etiquetas se utilizan como destinos de las instrucciones de saltos y de ciclos. Ejemplo:Destino:

mov ax, bx…jmp Destino

Los nombres para las etiquetas se crean utilizando las mismas reglas de los identificadores. En una instrucción con dos operandos, al primero se le llama destino y al segundo origen.

Nemónico de instrucciónEs una palabra corta que identifica a una instrucción.

mov Mueve (asigna) un valor a otroadd Suma dos valoressub Resta un valor de otromul Multiplica dos valorescall Llama a un procedimiento

Page 7: Presentación2 Lenguaje Ensamblador

InstruccionesOperandos

Las instrucciones en lenguaje ensamblador pueden tener de cero a tres operandos, cada uno de los cuales puede ser un registro, un operando de memoria o una expresión constante. Ver tabla siguiente:

Comentarios: De una sola línea (;) De un bloque, usar la directiva COMMENT y un símbolo (cualquier símbolo)

especificado por el usuario. Ensamblador ignora todas las líneas subsiguientes de texto, hasta que aparezca el mismo símbolo especificado por el usuario.

COMMENT !mov eax, miVar

mov ebx, z mov ecx, cadena

!

Tipo de operando Ejemplo

Constante (valor inmediato) 100

Expresión constante 3 + 8

Registro eax

Y Memoria

Page 8: Presentación2 Lenguaje Ensamblador

ACTIVIDAD No. 1INSTRUCCIONES. DE FORMA INDIVIDUAL, DAR RESPUESTA A LAS SIGUIENTES PREGUNTAS

• Identifique las características de sufijo válidos que se utilizan en constantes enteras• ¿F3h es una constante hexadecimal válida?, explique• ¿El signo de multiplicación (*) tiene mayor precedencia que el signo de división (/) en las

expresiones enteras?• Escriba una expresión constante que divida 10 entre 3 y devuelva el residuo entero?• De un ejemplo de constante numérica real válida con un exponente• Las palabras reservadas pueden ser:________________________• ¿Cuál es la longitud máxima de un identificador?• Un identificador puede comenzar con número?• Los identificadores son de manera predeterminada insensibles al uso de

mayúsculas/minúsculas?• Las directivas de ensamblador pueden escribirse en cualquier combinación de letras

mayúsculas y minúsculas.• De un ejemplo de comentario de bloque• Elabore un programa para evaluar la expresión y= 2 * 5 + 7 y quede el resultado en memoria

Page 9: Presentación2 Lenguaje Ensamblador

Definición de datosTipos de datos

En MASM, la característica esencial de cada tipo es su tamaño en bits: 8, 16, 32, 48, 64 y 80 bits.

Instrucción de definición de datosSepara espacio de almacenamiento para una variable, con un nombre opcional. Estas instrucciones crean variables con base en los tipos de datos mostrados en la tabla anterior.La sintaxis de una definición de datos está dada por:

[nombre] Directiva Inicializador [Inicializador,]…El nombre se escribe en base a las reglas para identificadores y la Directiva puede ser BYTE, DWORD, etc.

TIPOS DE DATOSTIPO USO

BYTE Entero de 8 bits sin signoSBYTE Entero de 8 bits con signoWORD Entero de 16 bits sin signoSWORD Entero de 16 bits con signoDWORD Entero de 32 bits sin signoSDWORD Entero de 32 bits con signoFWORD Entero de 48 bits QWORD Entero de 64 bits TBYTE Entero de 80 bits REAL4 Número real corto IEEE de 32 bits REAL8 Número real largo IEEE de 64 bits REAL10 Número real extendido IEEE de 80 bits

Page 10: Presentación2 Lenguaje Ensamblador

Definición de datosInicializador. Se requiere por lo menos un inicializador, aunque sea cero. Si se desea dejar la variable sin inicializar, se puede usar el símbolo ?

Val1 BYTE ‘X’Val2 BYTE 0Val3 BYTE 255Val4 SBYTE +127Val5 SBYTE -128Val6 BYTE ?

Múltiples inicializadoresCuando se usan varios inicializadores, su etiqueta sólo hace referencia al

desplazamiento del primer inicializador. En el ejemplo siguiente, el valor 10 se encuentra en el desplazamiento 0000, el 20 en el desplazamiento 0001 y así sucesivamente.

Lista BYTE 10, 20,30Desplazamiento Valor

No todas las definiciones de datos requieren etiquetas: Lista BYTE 10, 20,30

BYTE 40, 50,60BYTE 70, 80, 90

0000: 100001: 200002: 30

Page 11: Presentación2 Lenguaje Ensamblador

Definición de datosDefinición de cadenasEl tipo más común de cadena termina con un byte nulo (que contiene 0). Las cadenas de este tipo se

les llama cadenas de terminación nula y se utilizan en la programación en C, C++ y Java:Cadena1 BYTE “mucho frio”,0Cadena2 BYTE “mucho calor”,0Cada carácter utiliza un byte de almacenamiento

También una cadena puede distribuirse en varias líneas:Cadena1 BYTE “Bienvenido al aprendizaje del lenguaje ensamblador”

BYTE “al terminar este curso, te convertirás ”,0dh,0ahBYTE “en un programador de lenguaje ensamblador con nivel intermedio

“,0dh,0ahBYTE “FELICIDADES”, 0dh,0ah,0

Los códigos 0dh y0ah corresponden al retorno de carro y avance de línea (CR/LF)

El símbolo de continuación de línea (\) concatena dos líneas de código fuente en una sola instrucción. Debe ser el último carácter en la línea. Las instrucciones siguientes son equivalentes:

Cadena1 BYTE “Bienvenido al aprendizaje del lenguaje ensamblador” y Cadena1 \BYTE “Bienvenido al aprendizaje del lenguaje ensamblador”

Page 12: Presentación2 Lenguaje Ensamblador

Constantes simbólicasUna constante simbólica o definición de símbolo se crea mediante la asociación de un identificador

(un símbolo) con una expresión entera, o con un texto. Los símbolos no reservan almacenamiento. Los utiliza el ensamblador al momento de explorar un

programa, y no pueden cambiar en tiempo de ejecución.Directiva de signo igual. Asocia el nombre de un símbolo con una expresión entera:

nombre = expresiónCuando se ensambla un programa, todas las coincidencias de nombre se sustituye por expresión. Por ejemplo, si el ensamblador lee las líneas:

Contador = 100mov ax, Contador

Genera y ensambla la instrucción: mov ax, 100 Directiva EQU. Asocia el nombre de un símbolo con una expresión entera o con un texto. Existen

tres sintaxis:nombre EQU expresión expresión debe ser una expresión entera válida nombre EQU símbolo símbolo es el nombre de un símbolo existente ya definido con = o EQUnombre EQU <texto> puede aparecer cualquier texto dentro delos signos < y >Ejemplo:

Matriz EQU 2*3.dataM1 DWORD Matriz

Page 13: Presentación2 Lenguaje Ensamblador

Constantes simbólicasDirectiva TEXTEQU. Es similar a EQU y crea un macro de texto. Existen tres sintaxis:nombre TEXTEQU <texto> ;asigna texto nombre TEXTEQU macrotexto ;asigna el contenido de una macro existentenombre TEXTEQU <texto> ;asigna una expresión entera constante

Ejemplos: Oprimatecla TEXTEQU <"Oprima cualquier tecla...",0>

TFila = 5Cuenta TEXTEQU %(TFila*2)mover TEXTEQU <mov>establecerAL TEXTEQU <mover al,Cuenta>

.dataIndicador BYTE Oprimatecla.codeestablecerAL

Page 14: Presentación2 Lenguaje Ensamblador

ACTIVIDAD No. 2INSTRUCCIONES. DE FORMA INDIVIDUAL, DAR RESPUESTA A LAS SIGUIENTES PREGUNTAS

• Declare una constante simbólica, utilizando la directiva de signo igual que contenga el código ASCII (08h)

• Declare una constante simbólica llamada SegundosEnDia, usando la directiva de signo igual, y asígnele

una expresión aritmética que calcule el número de segundos en un periodo de 24 horas

• Utilice una expresión TEXTEQU para redefinir a “PROC” como “PROCEDIMIENTO”

• Utilice TEXTEQU para crear un símbolo llamado Ejemplo para una constante de cadena, y después utilice

el símbolo para definir a una variable de cadena llamada MiCadena.

Page 15: Presentación2 Lenguaje Ensamblador

Instrucciones de transferencia de datosTipos de operandos de instrucciones: inmediatos, de registro y de memoriaOperandos directos de memoria. La siguiente declaración indica que se ha asignado al segmento de

datos un byte que contiene el número 10h:.dataVar1 BYTE 10h.codemov al, var1

Instrucción mov. Copia datos de un operando de origen a un operando de destino. mov destino, origen

Reglas:Ambos operandos deben ser del mismo tamañoAmbos operandos no pueden ser operandos de memoriaCS, EIP e IP no pueden ser operandos destinosUn valor inmediato no puede moverse a un registro de segmento

Variantes para usar movmov reg, reg mov mem, reg mov reg, memmov reg, inmmov mem, inm

Page 16: Presentación2 Lenguaje Ensamblador

Instrucciones de transferencia de datos Memoria a Memoria. Una sola instrucción mov no puede usarse para mover datos directamente de una ubicación

de memoria a otra. En vez de ello, puede mover el valor del operando de origen a un registro, antes de mover su valor a un operando de memoria.

.dataVar1 WORD 100Var2 WORD ?.codemov ax, var1mov var2, ax Es necesario considerar el número mínimo de bytes requeridos para una constante entera, al copiarla a una variable

o registro. Instrucción MOVZX (mover con extensión de ceros) copia el contenido de un operando de origen a

un operando de destino, y extiende con ceros el valor hasta 16 o 32 bits. Se utiliza con enteros sin signo. Variantes:

movzx r32, r/m8 movzx r32, r/m16 movzx r16, r/m8

Ejemplo No. 1: Ejemplo No. 2

movzx ax, 0001111b mov bx, 0A23Dhmovzx eax, bxmovzx edx, blmovzx cx, bl

Page 17: Presentación2 Lenguaje Ensamblador

Instrucciones de transferencia de datosInstrucción MOVSX

Las instrucciones LAHF y SAHF . LAHF tienen como objetivo cargar las banderas de estado en AH. Copia el byte inferior del registro EFLAGS a AH.

Mediante esta instrucción se puede guardar una copia de las banderas en una variable por seguridad:.dataGuardarBanderas BYTE ?.code lahfmov GuardarBanderas, ah

SAHF almacena AH en las banderas de estado. Copia el contenido de AH en la parte inferior del registro EFLAGS.

Puede obtener los valores que se hayan guardado en una variable :mov ah, GuardarBanderasSAHF

La instrucción XCHG intercambia el contenido entre dos operandos en base a las variantes siguientes: XCHG registro, registro

XCHG registro, memoriaXCHG memoria, registro

Actividad No. 3: Hacer un programa en LE por cada una de las instrucciones que se listan a continuación: Esta actividad tiene la finalidad de comprender su utilidad.

Instrucción MOVSX, LAHF, SAHF, XCHG

Page 18: Presentación2 Lenguaje Ensamblador

Suma y Resta de enterosInstrucciones: INC, DEC, ADD, SUB y NEG

ACTIVIDAD: No. 4Hacer un programa en LE que contenga las instrucciones INC, DEC, ADD, SUB y NEG

Page 19: Presentación2 Lenguaje Ensamblador

Operadores y directivas relacionadas con los datos MASM cuenta con directivas que permiten obtener información acerca de las direcciones y

características de tamaño de datos:Operador OFFSET. Devuelve el desplazamiento de una etiqueta de datos. El desplazamiento

representa la distancia en bytes de la etiqueta, a partir del inicio del segmento de datos. La siguiente figura muestra una variable llamada valor1 dentro del segmento de datos.

Ejemplo con tres tipos distintos de variables:.dataValor1 BYTE ?Valor2 WORD ?Valor3 DWORD ?Valor4 DWORD ?Arreglo DWORD 5, 7, 9, 10

Si Valor1 se encuentra en el desplazamiento 00202000 (hexadecimal), el operador OFFSET devolvería los siguientes valores:

mov esi, OFFSET Valor1 ;ESI = 00202000mov esi, OFFSET Valor2 ;ESI = 00202001mov esi, OFFSET Valor3 ;ESI = 00202003mov esi, OFFSET Valor4 ;ESI = 00202007

Page 20: Presentación2 Lenguaje Ensamblador

Operadores y directivas relacionadas con los datosDirectiva ALIGN. Esta directiva alinea una variable en un límite definido por byte, palabra, doble

palabra y párrafo. Su formato es:ALIGN límiteDonde límite puede ser 1, 2, 4, o 16. Un valor de 1 alinea a la siguiente variable en un límite de 1 byte

(el valor predeterminado). Si el límite es de 2, la siguiente variable se alinea en una dirección con numeración par. Si el límite es 4, la siguiente dirección es múltiplo de 4, y así sucesivamente.

El CPU procesa más rápido datos almacenados en direcciones pares. Por ejemplo, si la variable arreglo se encuentra en el desplazamiento 004050AF, al insertarse la

directiva ALIGN 2 antes de Arreglo, se asigna un desplazamiento con numeración par: .data ALIGN 2 Arreglo DWORD 10, 1,2,3,1 .code mov eax, OFFSET Arreglo ; 004050B0 mov eax, OFFSET [Arreglo+4] ; 004050B4 mov eax, OFFSET [Arreglo+8] ; 004050B8

Page 21: Presentación2 Lenguaje Ensamblador

Operadores y directivas relacionadas con los datosOperador PTR. Se puede utilizar este operador para redefinir el tamaño declarado de un operando.

Esto sólo es necesario cuando se trata de acceder a la variable mediante un atributo de tamaño distinto al que utilizamos para declarar la variable.

En el ejemplo siguiente se muestra un error al tratar de mover datos entre operandos de tamaños distintos:

.dataCantidad1 DWORD 20114321h.codemov ax, Cantidad1 ; error

El operando WORD PTR permite realizar el movimiento de la palabra de menor orden (4321h) a AX.mov al, WORD PTR Cantidad1

Intel utiliza el formato de almacenamiento little endian (el byte de menor orden se almacena en el byte inicial de la variable:

La CPU puede acceder a la memoria en cualquiera de las tres formas: BYTE, WORD, DWORD.dataCantidad1 DWORD 20114321h.code

mov al, BYTE PTR Cantidad1 mov al, BYTE PTR Cantidad1+1 mov al, BYTE PTR Cantidad1+2

Page 22: Presentación2 Lenguaje Ensamblador

Operadores y directivas relacionadas con los datosOperador TYPE. Devuelve el tamaño en bytes de un solo elemento de una variable. Por ejemplo, el

tipo (TYPE) de un byte es 1, el tipo de una palabra es de 2.

Operador LENGTHOF. Cuenta el número de elementos en un arreglo, definido por los valores que aparecen en la misma línea que su etiqueta.

.dataByte1 BYTE 5, 10, 15, 20Arreglo1 WORD 2, 3, 7, 9, 10

Operador SIZEOF. Devuelve un valor que equivale a multiplicar LENTGOF por TYPE. Por ejemplo, si Arreglo1 tiene los valores TYPE=2 y LENGTHOF=32, entonces SIZEOF Arreglo1 es igual a 64:

.dataArreglo1 WORD 32 DUP(0).codemov eax, SIZEOF Arreglo1 ; EAX = 64

.dataValor1 BYTE ?Valor2 WORD ?Valor3 DWORD ?Valor4 QWORD ?

Expresión Valor

TYPE Valor1TYPE Valor2TYPE Valor3TYPE Valor4

1248

Expresión Valor

LENGTOF Byte1LENGTOF Arreglo1

45

Page 23: Presentación2 Lenguaje Ensamblador

ACTIVIDAD No. 5:Hacer un programa en LE que muestre el uso de los operadores: OFFSET, PTR, TYPE, LENGTHOF, SIZEOF, así como de la directiva ALIGN

Page 24: Presentación2 Lenguaje Ensamblador

Instrucciones JMP y LOOPLos programas en lenguaje ensamblador utilizan utilizan instrucciones condicionales para implementar instrucciones de alto nivel como IF y ciclos. Cada una de las instrucciones condicionales implica una posible transferencia de control o bifurcación (salto) hacia una dirección de memoria distinta. Hay dos tipos de transferencia:

Instrucción JMP. Esta instrucción es una transferencia incondicional hacia un destino que se identifica mediante una etiqueta de código que el ensamblador traduce en un desplazamiento. La sintaxis es JMP destino

Bajo condiciones normales, sólo se puede saltar a una etiqueta dentro del procedimiento actual.La instrucción JMP proporciona una forma sencilla de crear un ciclo, saltando a una etiqueta en la parte superior del ciclo:

Superior:..jmp Superior ; repite el ciclo infinito

• En todos los casos el programa bifurca hacia una nueva ubicación; se carga una nueva dirección de memoria en el EIP

• La instrucción JMP es un ejemploTransferencia incondicional

• El programa se bifurca si se cumple cierta condición.• La CPU interpreta las condiciones de verdadero/falso de acuerdo con el

contenido de los registros ECX y Flags.• La instrucción LOOP es un ejemplo

Transferencia condicional

Page 25: Presentación2 Lenguaje Ensamblador

Instrucciones JMP y LOOP

La instrucción LOOP repite un bloque de instrucciones, un número específico de veces. ECX se utiliza de manera automática como contador, y se decrementa cada vez que se repite el ciclo. Su sintaxis es:

LOOP destino

Para la ejecución de esta instrucción se requieren dos pasos:

1. Se resta 1 a ECX

2. ECX se compara con cero. Si no es igual a cero, se realiza un salto hacia la etiqueta identificada por destino. En caso contrario, si ECX es igual a cero, no se realiza ningún salto y el control pasa a la instrucción que sigue después del ciclo.

En el modo de direccionamiento real, CX es el contador de ciclo predeterminado para la instrucción LOOP.

El siguiente ejemplo, suma 1 a AX cada vez que se repite el ciclo. Cuando termina el ciclo, AX=5 y ECX=0:

mov ax, 0mov ecx, 5

L1:inc axloop L1

Page 26: Presentación2 Lenguaje Ensamblador

Instrucciones JMP y LOOPCiclos anidados. Al crear un ciclo dentro de otro, hay que tener cierta consideración especial con el contenido del ciclo exterior en ECX. Se puede guardar en una variable:

.dataCuenta DWORD ?.codeMov ecx, 100L1:mov Cuenta, ecxmov ecx, 20L2:..loop L2mov ecx, CuentaLoop L1

Actividad No. 6:Construya un programa que determine la suma de un arreglo de enteros