Presentacion2 Lenguaje Ensamblador

Embed Size (px)

Citation preview

Diapositiva 1

PROGRAMACION BSICA (UNIDAD No. 2)

Instituto Tecnolgico de VillahermosaACADEMIA DE SISTEMAS Y COMPUTACININGENIERA EN SISTEMAS COMPUTACIONALES

MGTI. FIDELIO CASTILLO ROMERO.Villahermosa, Tabasco, Mxico. Enero 2013.Competencia especfica a desarrollar

Conocer y utilizar las principales instrucciones del lenguaje ensamblador, para realizar determinadas aplicaciones de interfaz.1. TemarioUnidad No. 2. Elementos bsicos del lenguaje ensamblador

Constantes enteras y reales, expresiones enteras, palabras reservadas, identificadores, directivas e instruccionesDefinicin de datosConstantes simblicasTransferencias de datos: Operandos, instruccines MOV, MOVSX, MOVZX, LAHF, SAHF, XCHG, operandos de desplazamiento directo, Aritmtica (suma y resta): Instrucciones INC, DEC, SUB, NEGOperadores y directivas relacionadas con los datos: Operadores OFFSET, PTR, TYPE, LENGTHOF, SIZEOF, directivas LABEL, ALIGNInstrucciones JMP y LOOPDireccionamiento indirecto: operandos indirectos, arreglos, operandos indexados, apuntadores

Constantes enteras[{+|-}] dgitos [raz]

La raz puede ser una de las siguientes (en maysculas o minsculas):h Hexadecimalr Real codificadoq/o Octald Decimalb BinarioSi no se da una raz, se asume que la constante entera es decimal.

Ejemplos de constantes con distintas races: 26d11010101b42q42o2Ah0AhLas constantes hexadecimales que comiencen con una letra debe tener un cero a la izquierda para que no se interprete como identificador.Expresiones enterasLa expresin se debe evaluar como un entero que se puede almacenar en 32 bits (0 al FFFFFFFFh)Precedencia de operadores aritmticosOperadorNombreNivel de Precedencia( )Parntesis1+, -Unario positivo, unario negativo2*, /, MODProducto, divisin, Mdulo3+, -Suma, Resta4ExpresinValor25/38-(2+3)*(9-4)-2513 mod 21Ejemplos de expresiones vlidas: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 dgito y un punto decimal.Constantes tipo carcterEs un solo carcter encerrado entre comillas sencillas o dobles. MASM almacena el valor en memoria como el cdigo ASCII binario del carcter. Ejemplos: A o BConstantes tipo cadenaEs una secuencia de caracteres encerrados entre comillas sencillas o dobles. 123Rafael MrquezSe pueden agregar comillas a la cadena, siempre y cuando se utilicen de la siguiente manera:Hola equipo de lenguaje ensamblador, suertePalabras reservadasTienen un significado especial en MASM y slo pueden usarse dentro de su contexto correcto. Tipos de palabras reservadas:Nemnicos de instrucciones: MOV, CALL, ADD, SUBDirectivas que indican a MASM como ensamblar programasAtributos, que proporcionan informacin acerca del tamao y uso de las variables y operando: BYTE, DWORDOperadores, que se utilizan en expresiones constantes: MODSmbolos predefinidos como @code (El nombre del segmento de cdigo macro-) IdentificadoresUn identificador es un nombre elegido por el programador. Identifica a una variable, una constante, un procedimiento o una etiqueta de cdigo.Pueden contener entre 1 y 247 caracteresNo son sensibles a maysculas/minsculasEl primer carcter debe ser una letra (A..Z, a..z), guin bajo (_), @, ? o $. Los caracteres subsiguientes tambin pueden ser dgitosDirectivasUna directiva es un comando incrustado en el cdigo fuente, que el ensamblador reconoce y acta 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 maysculas/minsculas. MASM reconoce a .DATA, .Data, .data como equivalentes.

Cada ensamblador tiene un conjunto distinto de directivas. Por ejemplo, TASM y NASM comparten un subconjunto comn de directivas con MASM. El ensamblador GNU casi no tiene directivas en comn con MASM.InstruccionesUna instruccin es un enunciado que se vuelve ejecutable cuando se ensambla un programa. Contiene 4 partes bsicas: [etiqueta:] nemnico operando(s) [; comentario]

Etiqueta. Identificador que acta como marcador de posicin para las instrucciones y los datos. Una etiqueta que se coloca justo antes de una instruccin, representa la direccin de esa instruccin; una etiqueta que se coloca antes de una variable, representa la direccin de esa variable (cuenta DWORD 100)6InstruccionesEn el ejemplo siguiente, la etiqueta arreglo define la ubicacin del primer nmero (1024). Los dems nmeros que le siguen van en la memoria de forma consecutiva.Arreglo DWORD 1024, 2048DWORD 4096, 8192Una etiqueta en el rea de cdigo de un programa debe terminar con un carcter de dos puntos (:). En este contexto las etiquetas se utilizan como destinos de las instrucciones de saltos y de ciclos. Ejemplo:Destino:mov ax, bxjmp DestinoLos nombres para las etiquetas se crean utilizando las mismas reglas de los identificadores.En una instruccin con dos operandos, al primero se le llama destino y al segundo origen.

Nemnico de instruccinEs una palabra corta que identifica a una instruccin. movMueve (asigna) un valor a otroaddSuma dos valoressubResta un valor de otromulMultiplica dos valorescallLlama a un procedimientoInstruccionesOperandos 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 expresin constante. Ver tabla siguiente:

Comentarios: De una sola lnea (;) De un bloque, usar la directiva COMMENT y un smbolo (cualquier smbolo) especificado por el usuario. Ensamblador ignora todas las lneas subsiguientes de texto, hasta que aparezca el mismo smbolo especificado por el usuario.COMMENT !mov eax, miVar mov ebx, z mov ecx, cadena!Tipo de operandoEjemploConstante (valor inmediato)100Expresin constante3 + 8 RegistroeaxYMemoriaDefinicin de datosTipos de datos En MASM, la caracterstica esencial de cada tipo es su tamao en bits: 8, 16, 32, 48, 64 y 80 bits.

Instruccin de definicin 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 definicin 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 DATOSTIPOUSOBYTEEntero de 8 bits sin signoSBYTEEntero de 8 bits con signoWORDEntero de 16 bits sin signoSWORDEntero de 16 bits con signoDWORDEntero de 32 bits sin signoSDWORDEntero de 32 bits con signoFWORDEntero de 48 bits QWORDEntero de 64 bits TBYTEEntero de 80 bits REAL4Nmero real corto IEEE de 32 bits REAL8Nmero real largo IEEE de 64 bits REAL10Nmero real extendido IEEE de 80 bits Definicin de datosInicializador. Se requiere por lo menos un inicializador, aunque sea cero. Si se desea dejar la variable sin inicializar, se puede usar el smbolo ? Val1BYTEXVal2BYTE0Val3BYTE255Val4SBYTE+127Val5SBYTE-128Val6BYTE?

Mltiples inicializadoresCuando se usan varios inicializadores, su etiqueta slo 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,30DesplazamientoValor

No todas las definiciones de datos requieren etiquetas: Lista BYTE 10, 20,30BYTE 40, 50,60BYTE 70, 80, 900000:100001:200002:30Definicin de datosDefinicin de cadenasEl tipo ms comn de cadena termina con un byte nulo (que contiene 0). Las cadenas de este tipo se les llama cadenas de terminacin nula y se utilizan en la programacin en C, C++ y Java:Cadena1BYTE mucho frio,0Cadena2BYTE mucho calor,0Cada carcter utiliza un byte de almacenamientoTambin una cadena puede distribuirse en varias lneas:Cadena1BYTE Bienvenido al aprendizaje del lenguaje ensambladorBYTE al terminar este curso, te convertirs ,0dh,0ahBYTE en un programador de lenguaje ensamblador con nivel intermedio ,0dh,0ahBYTE FELICIDADES, 0dh,0ah,0Los cdigos 0dh y0ah corresponden al retorno de carro y avance de lnea (CR/LF)

El smbolo de continuacin de lnea (\) concatena dos lneas de cdigo fuente en una sola instruccin. Debe ser el ltimo carcter en la lnea. Las instrucciones siguientes son equivalentes:

Cadena1BYTE Bienvenido al aprendizaje del lenguaje ensamblador y Cadena1\BYTE Bienvenido al aprendizaje del lenguaje ensambladorConstantes simblicasUna constante simblica o definicin de smbolo se crea mediante la asociacin de un identificador (un smbolo) con una expresin entera, o con un texto. Los smbolos no reservan almacenamiento. Los utiliza el ensamblador al momento de explorar un programa, y no pueden cambiar en tiempo de ejecucin.Directiva de signo igual. Asocia el nombre de un smbolo con una expresin entera:nombre = expresinCuando se ensambla un programa, todas las coincidencias de nombre se sustituye por expresin. Por ejemplo, si el ensamblador lee las lneas:Contador = 100mov ax, Contador Genera y ensambla la instruccin: mov ax, 100 Directiva EQU. Asocia el nombre de un smbolo con una expresin entera o con un texto. Existen tres sintaxis:nombre EQU expresin expresin debe ser una expresin entera vlida nombre EQU smbolo smbolo es el nombre de un smbolo existente ya definido con = o EQUnombre EQU puede aparecer cualquier texto dentro delos signos < y >Ejemplo:Matriz EQU 2*3.dataM1 DWORD MatrizConstantes simblicasDirectiva TEXTEQU. Es similar a EQU y crea un macro de texto. Existen tres sintaxis:nombre TEXTEQU ;asigna texto nombre TEXTEQU macrotexto ;asigna el contenido de una macro existentenombre TEXTEQU ;asigna una expresin entera constante

Ejemplos: Oprimatecla TEXTEQU TFila = 5Cuenta TEXTEQU %(TFila*2)mover TEXTEQU establecerAL TEXTEQU

.dataIndicador BYTE Oprimatecla.codeestablecerAL

Instrucciones de transferencia de datosTipos de operandos de instrucciones: inmediatos, de registro y de memoriaOperandos directos de memoria. La siguiente declaracin indica que se ha asignado al segmento de datos un byte que contiene el nmero 10h:.dataVar1 BYTE 10h.codemov al, var1 Instruccin mov. Copia datos de un operando de origen a un operando de destino. mov destino, origenReglas:Ambos operandos deben ser del mismo tamaoAmbos operandos no pueden ser operandos de memoriaCS, EIP e IP no pueden ser operandos destinosUn valor inmediato no puede moverse a un registro de segmentoVariantes para usar movmov reg, reg mov mem, reg mov reg, memmov reg, inmmov mem, inm Instrucciones de transferencia de datosMemoria a Memoria. Una sola instruccin mov no puede usarse para mover datos directamente de una ubicacin 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 nmero mnimo de bytes requeridos para una constante entera, al copiarla a una variable o registro. Instruccin MOVZX (mover con extensin 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:movzxr32, r/m8 movzxr32, r/m16 movzxr16, r/m8

Ejemplo No. 1:Ejemplo No. 2movzxax, 0001111bmov bx, 0A23Dhmovzx eax, bxmovzx edx, blmovzx cx, bl17Instrucciones de transferencia de datosInstruccin 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 instruccin se puede guardar una copia de las banderas en una variable por seguridad:.dataGuardarBanderas BYTE ?.code lahfmov GuardarBanderas, ahSAHF 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, GuardarBanderasSAHFLa instruccin XCHG intercambia el contenido entre dos operandos en base a las variantes siguientes: XCHGregistro, registroXCHGregistro, memoriaXCHGmemoria, registroActividad No. 3: Hacer un programa en LE por cada una de las instrucciones que se listan a continuacin: Esta actividad tiene la finalidad de comprender su utilidad.Instruccin MOVSX, LAHF, SAHF, XCHGSuma 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 NEGOperadores y directivas relacionadas con los datos MASM cuenta con directivas que permiten obtener informacin acerca de las direcciones y caractersticas de tamao 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 devolvera los siguientes valores:mov esi, OFFSET Valor1 ;ESI = 00202000mov esi, OFFSET Valor2;ESI = 00202001mov esi, OFFSET Valor3;ESI = 00202003mov esi, OFFSET Valor4;ESI = 00202007

Operadores y directivas relacionadas con los datosDirectiva ALIGN. Esta directiva alinea una variable en un lmite definido por byte, palabra, doble palabra y prrafo. Su formato es:ALIGN lmiteDonde lmite puede ser 1, 2, 4, o 16. Un valor de 1 alinea a la siguiente variable en un lmite de 1 byte (el valor predeterminado). Si el lmite es de 2, la siguiente variable se alinea en una direccin con numeracin par. Si el lmite es 4, la siguiente direccin es mltiplo de 4, y as sucesivamente.El CPU procesa ms rpido 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 numeracin par: .data ALIGN 2 ArregloDWORD 10, 1,2,3,1 .code mov eax, OFFSET Arreglo; 004050B0 mov eax, OFFSET [Arreglo+4]; 004050B4 mov eax, OFFSET [Arreglo+8]; 004050B8

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

Esto slo es necesario cuando se trata de acceder a la variable mediante un atributo de tamao distinto al que utilizamos para declarar la variable.

En el ejemplo siguiente se muestra un error al tratar de mover datos entre operandos de tamaos 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.codemov al, BYTE PTR Cantidad1 mov al, BYTE PTR Cantidad1+1 mov al, BYTE PTR Cantidad1+2Operadores y directivas relacionadas con los datosOperador TYPE. Devuelve el tamao 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 nmero de elementos en un arreglo, definido por los valores que aparecen en la misma lnea 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 ?

ExpresinValorTYPE Valor1TYPE Valor2TYPE Valor3TYPE Valor41248ExpresinValorLENGTOF Byte1LENGTOF Arreglo145ACTIVIDAD 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 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 bifurcacin (salto) hacia una direccin de memoria distinta. Hay dos tipos de transferencia:

Instruccin JMP. Esta instruccin es una transferencia incondicional hacia un destino que se identifica mediante una etiqueta de cdigo que el ensamblador traduce en un desplazamiento. La sintaxis es JMP destinoBajo condiciones normales, slo se puede saltar a una etiqueta dentro del procedimiento actual.La instruccin 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 infinitoInstrucciones JMP y LOOPLa instruccin LOOP repite un bloque de instrucciones, un nmero especfico de veces. ECX se utiliza de manera automtica como contador, y se decrementa cada vez que se repite el ciclo. Su sintaxis es:LOOP destino

Para la ejecucin de esta instruccin se requieren dos pasos:

Se resta 1 a ECX

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 ningn salto y el control pasa a la instruccin que sigue despus del ciclo.

En el modo de direccionamiento real, CX es el contador de ciclo predeterminado para la instruccin 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, 5L1:inc axloop L1

Instrucciones JMP y LOOPCiclos anidados. Al crear un ciclo dentro de otro, hay que tener cierta consideracin 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