ESTRUCTURA DE MICROPROCESADORES Programación Básica con ensamblador Profesor Ing. Johan Carvajal Godínez JCG-2009 Agenda de la Clase 1. 2. 3. 4. 5. 6. 7. 8. 9. Introducción Elementos básicos de lenguaje ASM Instrucciones básica en Ensamblador Ejemplo: Suma y restas de enteros Proceso de ensamblado, enlazado y ejecución de un programa en ASM Protocolo de definición de datos Definición de constantes Programación en modo real Estructuras básicas de programación 2 JCG-2009 Que es ensamblador? ensamblador? • El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas en una computadora, y constituye la representación más directa del código máquina específico para cada arquitectura. JCG-2009 Como funcionan los ensambladores? • Un ensamblador crea código objeto traduciendo instrucciones mnemónicas a códigos operativos e interpretando los nombres simbólicos para direcciones de memoria y otras entidades. • El uso de referencias simbólicas es una característica básica de los ensambladores, evitando tediosos cálculos y direccionamiento manual después de cada modificación del programa. • La mayoría de los ensambladores incluyen facilidades para crear macros, a fin de generar series de instrucciones cortas que se ejecutan en tiempo real, en lugar de utilizar subrutinas JCG-2009 Que es código objeto? • Se llama código objeto en programación al código resultante de la compilación del código fuente. • Consiste en lenguaje máquina o bytecode y se distribuye en varios archivos que corresponden a cada código fuente compilado. • Para obtener un programa ejecutable se han de enlazar todos los archivos de código fuente con un programa llamado enlazador (linker). JCG-2009 Que es un programa ejecutable • Un programa ejecutable es un archivo binario cuyo contenido se interpreta por el ordenador como un programa. • Dependiendo del tipo de que se traten las instrucciones, hablaremos de ejecutables portables (se pueden ejecutar en varias plataformas) y no portables (destinado a una plataforma concreta). Por ejemplo, un ejecutable Java es portable ya que utiliza un bytecode no asociado a un procesador en concreto. • Existen otro tipo de programas llamados scripts. No contienen código máquina sino el código fuente, que se interpreta a la vez que se ejecuta. JCG-2009 Fases en generación de un ejecutable TASM TLINK JCG-2009 Como se programa en ensamblador? • Se analiza el problema • Se identifican los subproblemas • Se crean bloques de solución al sub-problema • Se enlazan los bloques en un bloque principal • Se llama el bloque principal JCG-2009 Estructura de un programa en ASSY X86 • Un programa debe contener la definición de 4 bloques básicos – Modelo • Modelo de administración de la memoria – Datos • Variables • Constantes – Pila • Tamaño de la pila – Código • Código fuente JCG-2009 Modelo de programación • Define la extensión que va a tener el programa y la forma en que se va a disponer del código • • Se indica por directriz .model Los tipos de modelo a indicar son – Tiny: solo un segmento para todos los datos y código, puede ser un .COM – Small: código y datos pueden compartir segmento físico. Todos los procedimientos y variables se direccionan como “NEAR” con solo apuntar al desplazamiento. – Compact: por defecto todos los elementos de código se ubican en un segmento físico pero los datos pueden tener su propio segmento. – Medium: Es el opuesto a compact – Large: El código esta separado físicamente de los datos – Flat: se usa en aplicaciones con memoria paginada. Win32 JCG-2009 Segmentos • Pila – Se declara el tamaño por medio de la directriz .stack + tamaño en bytes • Datos – Se declara por medio de la directriz .data – El formato para declarar una variable es • Nombre-longitud-valor predeterminado • FileName DB "C:\new.txt" • Constantes – Se declara en cualquier parte del programa – Se hace por medio del nombre EQU valor LShfBit equ 2 JCG-2009 Niveles de programación en ensamblador La programación en ASM se puede orientar en tres niveles de acuerdo a las capacidades y requerimientos del problema a resolver ASM Program JCG-2009 OS Function Level 2 BIOS Function Level 1 Hardware Level 0 Elementos Básicos del lenguaje ASM • Manejo de enteros – Constantes – Expresiones • • • • • • Manejo de caracteres y cadenas “String” Palabras Reservadas e identificadores Directrices e instrucciones Etiquetas Mnemónicos y operandos Comentarios 13 JCG-2009 Constantes Enteras • Pueden estar antecedidas por +/• Se pueden definir números en binario, decimal, hexadecimal u octal • Caracteres de distinción de código: – h – hexadecimal – d – decimal – b – binario – r – Real codificado Ejemplos: 30d, 6Ah, 42, 1101b Usualmente en Hex se comienza: 0A5h 14 JCG-2009 Operaciones con enteros • Nivel de precedencia en operaciones con enteros: • Ejemplos: 15 JCG-2009 Manejo de caracteres y cadenas • Los caracteres se pueden manejar con comillas simples o dobles – 'A', "x" – Tamaño de ASCII = 1 byte • Las cadenas se pueden manejar con comillas simples o dobles – "ABC" – 'xyz' – Cada carácter ocupa un byte 16 JCG-2009 Palabras reservadas e identificadores • Las palabras reservadas no pueden ser utilizadas como identificadores – Mnemónicos, Operadores, Tipos de datos, etc • Identificadores – Caracteres incluyendo números – No son sensibles a la mayúsculas – La primera letra debe ser: _, @, ?, ó $ 17 JCG-2009 Directrices • Son comandos que son reconocidos por el compilador pero que no son parte del set de instrucciones – Ejemplo: • Aquellos usados para declarar segmentos, modelos de memoria y algunas otras funciones • Diferentes compiladores tienen diferentes directrices – TASM son diferentes a MASM 18 JCG-2009 Instrucciones • Se crea una secuencia de código maquina por parte del ensamblador • Es lo que utiliza el CPU durante el tiempo de ejecución del programa • Se usa el ISA de IA32 • Una instrucción se conforma por: – – – – Etiquetas Mnemónico Operando Comentario (opcional) (requerido) (según el mnemónico requerido) (opcional) Etiqueta: Mnemónico Operando Comentario 19 JCG-2009 Las etiquetas • Funcionan como marcadores dentro del CS como del DS • Se debe definir una serie de reglas para su definición • Etiquetas de datos – Deben ser únicas • Etiquetas de código – Se utilizan usualmente para marcar direcciones de salto • Ejemplo: ciclo1: 20 JCG-2009 Mnemónicos y Operandos • Mnemónicos de instrucciones – Describen la función de la instrucción – ejemplos: MOV, ADD, SUB, MUL, INC, DEC • Operandos – Constantes – Expresiones con constantes – Registros – Direcciones de memoria Algunos programadores tratan las constantes como valores inmediatos 21 JCG-2009 Los comentarios • Un programa bien comentado es un programa! – – – – – Explicar el propósito del código Cuando y quien escribió el programa Historial de revisión Explicar algún truco utilizado Comentarios específicos a la aplicación • Comentarios de una línea – Comienzan con punto y coma (;) • Un bloque de comentarios – Inicio: Se escribe la directriz COMMENT y un caracter elegido por el programador – Termina: El caracter elegido por el programador 22 JCG-2009 Algunos formatos de instrucción • Sin operandos – stc ; Pone en uno la bandera de carry • Con un operando – inc eax – inc myByte ; Incrementa EAX ; Incrementa valor • Con dos operandos – add ebx,ecx – sub myByte,25 – add eax,36 * 25 ; Registro, Registro ; Memoria, Constante ; Registro, expresión 23 JCG-2009 Ejemplo: Suma y restas de enteros TITLE Suma y resta (AddSub.asm) ; Este programa suma y resta números de 32 bits .MODEL small .DATA .STACK .CODE main PROC mov eax,10000h ; EAX = 10000h add eax,40000h ; EAX = 50000h sub eax,20000h ; EAX = 30000h call DumpRegs ; Despliega los registros exit main ENDP END main 24 JCG-2009 Consejos para codificación (1 de 2) • Consejos sobre uso de mayúsculas – Todo en mayúsculas – Nada en mayúsculas – Mayúsculas solo para instrucciones, operandos, directrices – Solo directrices y operandos • Otras sugerencias – Usar identificadores descriptivos – Una línea de separación entre procedimientos 25 JCG-2009 Consejos para codificación (1 de 2) • Identación y espaciamiento – Las etiquetas de datos y códigos sin identación – Las instrucciones se identan con un ¨TAB¨ ¨ – Los comentarios se comienzan a partir de las columna 40 – Se dan 1 a 3 espacios entre mnemónico y operando • ejemplo: mov ax,bx – Se dejan una o dos líneas entre procedimientos o macros 26 JCG-2009 Machote de programa TITLE ; ; ; ; ; NombrePrograma (Template.asm) Descripción del Programa: Autor: Fecha de creación: Revisión: Fecha: Modificado por: .model small .data ; (Declare las variables aquí) .code main PROC ; (Código del procedimiento) exit main ENDP ; (Procedimientos adicionales) END main 27 JCG-2009 Ensamblado, enlace y ejecución ejecuci n de ASM • • • • Ciclo de ensamblado, enlace y ejecución make32.bat Archivo de listado Archivos de mapa de memoria 28 JCG-2009 Ciclo de ensamblado, enlace y ejecución ejecuci n El diagrama describe la secuencia de pasos requeridos para crear un programa en ASM Link Library Source File Step 1: text editor Step 2: assembler Object File Step 3: linker Listing File Executable File Step 4: OS loader Output Map File 29 JCG-2009 Definición de datos en lenguaje ASM • • • • • • • • • • Tipos de datos intrínsicos directrices de definición de datos Definición de datos tipo BYTES y SBYTES Definición datos tipo de WORDS y SWORDS Definición de datos tipo DWORD y SDWORD Definición de datos tipo QWORD Definición de datos tipo TBYTE Definición de datos con números reales Little Endian Order Declaración de datos sin inicializar 30 JCG-2009 Tipos de datos intrínsicos (1 / 2) • BYTE, SBYTE – Entero de 8 bits sin signo; Entero de 8 bits con signo • WORD, SWORD – Entero de 16 bits sin signo; Entero de 16 bits con signo • DWORD, SDWORD – Entero de 32 bits sin signo; Entero de 32 bits con signo • QWORD – Entero de 64 bits • TBYTE – Entero de 80 bits 31 JCG-2009 Tipos de datos intrínsicos (2 / 2) • REAL4 – IEEE: Real corto de 4 bytes • REAL8 – IEEE: Real largo de 8 bytes • REAL10 – IEEE: Real extendido de 10 bytes 32 JCG-2009 Procedimiento de definición de datos • Se hace dentro del segmento de datos y permite declarar las variables a utilizar • Se puede asignar nombre a las variables • Sintaxis: [nombre] directiva de inicialización [,inicializador] . . . Ejemplo: prueba BYTE 10 • El valor del inicializador se carga en la memoria 33 JCG-2009 Definiendo Bytes Cada una de estas definiciones trabaja sobre bytes: PRUEBA1 BYTE 'A' ; caracter inicializado PRUEBA2 BYTE 0 ; Byte sin signo más bajo PRUEBA3 BYTE 255 ; Byte sin signo más alto PRUEBA4 SBYTE -128 ; Byte con signo más bajo PRUEBA5 SBYTE +127 ; Byte con signo más alto PRUEBA6 BYTE ? ; Byte sin inicializar • Algunos debugers muestran los valores con formato de signos y valor • Ejemplo: -2 34 JCG-2009 Arreglos de bytes Diferentes formas de declarar arreglos de bytes: LISTA1 BYTE 10,20,30,40 MATRIZ1 BYTE 10,20,30,40 BYTE 50,60,70,80 BYTE 81,82,83,84 LISTA2 BYTE ?,32,41h,00100010b LISTA3 BYTE 0Ah,20h,‘A’,22h 35 JCG-2009 Definiendo cadenas (1/3) • Una cadena ¨String¨ ¨ se implementa como un arreglo de caracteres: – Se inicializa con una cadena encerrada por dobles comillas – Se debe terminar con un caracter nulo o ¨0¨ ¨ • Ejemplos: str1 BYTE “Escriba una oración:",0 str2 BYTE 'Error: Programa terminado!!!',0 str3 BYTE 'A','E','I','O','U' saludo BYTE “Bienvenido a PATIX" BYTE “Version II",0 36 JCG-2009 Definiendo cadenas (2/3) • Para definir una cadena con múltiples líneas, cada línea se termina con una coma menu BYTE “Menu Principal",0dh,0ah,0dh,0ah, "1. Crear una nueva cuenta",0dh,0ah, "2. Iniciar un nuevo usuario",0dh,0ah, "3. Abrir perfil",0dh,0ah, "4. Editar Perfil ",0dh,0ah, "5. Salir",0ah,0ah, “Escoje una opción:> ",0 Irvine, Kip R. Assembly Language for Intel-Based Computers, 2007. 37 JCG-2009 Definiendo cadenas (3/3) • Caracteres para terminación de cadena: – 0Dh = Retorno de carro – 0Ah = Nueva Línea str1 BYTE “Escriba su Nombre: ",0Dh,0Ah, BYTE “Escriba su direccion: ",0 NuevaLinea BYTE 0Dh,0Ah,0 Consejo: Defina todas las cadenas que requiera usar en el misma área del segmento de datos 38 JCG-2009 Uso del operador DUP • Se utiliza el operador DUP para reservar espacio en la memoria para una cadena – Formato: • Variable tipo contador DUP (inicialización) – contador e inicialización deben se constantes o expresiones con constantes var1 BYTE 20 DUP(0) ; 20 bytes, todos en cero var2 BYTE 20 DUP(?) ; 20 bytes, sin inicializar var3 BYTE 4 DUP("STACK") ; 20 bytes: "STACKSTACKSTACKSTACK" var4 BYTE 10,3 DUP(0),20 ; 5 bytes 39 JCG-2009 Definición de datos tipo WORD y SWORD Reserva espacio en el segmento de datos para enteros de 16 bits con y sin signo word1 word2 word3 word4 myList array WORD SWORD WORD WORD WORD WORD 65535 –32768 ? "AB" 1,2,3,4,5 5 DUP(?) ; ; ; ; ; ; Máximo valor sin signo Mínimo valor con signo variables sin inicializar Variable inicializada Arreglo de palabras Arreglo sin inicializar 40 JCG-2009 Definición de datos tipo DWORD y SDWORD Reserva espacio en el segmento de datos para enteros de 32 bits con y sin signo val1 val2 val3 val4 DWORD SDWORD DWORD SDWORD 12345678h –2147483648 20 DUP(?) –3,–2,–1,0,1 ; ; ; ; Doble palabra sin signo Doble palabra con signo arreglo sin signo Arreglo con signo 41 JCG-2009 Definición de QWORD, TBYTE y REALES Reserva espacio en el segmento de datos para enteros de 64 bits, enteros de 80 bits y valores reales quad1 QWORD 1234567812345678h val1 TBYTE 1000000000123456789Ah rVal1 REAL4 -2.1 rVal2 REAL8 3.2E-260 rVal3 REAL10 4.6E+4096 ShortArray REAL4 20 DUP(0.0) 42 JCG-2009 Little Endian Order • Todos los datos con longitudes mayores a un byte se guardan en orden inverso en el segmento de datos • Ejemplo: valor1 DWORD 12345678h 43 JCG-2009 Declaración de datos sin inicializar • Se puede declarar un segmento de datos sin inicializar por medio de la directriz .DATA? • Dentro de un segmento de datos se puede declarar variable sin un valor predefinido por medio del inicializador ¨?¨ ?¨ Arreglo DWORD 10 DUP(?) Ventaja: Reduce el tamaño del programa .exe generado 44 JCG-2009 Constantes simbólicas • Directriz de igual • Cálculo del tamaño de arreglos y cadenas • La directriz EQU • La directriz TEXTEQU 45 JCG-2009 La directriz de igual • Nombre = Expresión – Expresión es un entero de 32 bits que puede formarse con una expresión o una constante – Puede ser redefinido – Nombre es llamado una constante simbólica • Buen método para administrar parámetros COUNT = 500 . . mov al,COUNT 46 JCG-2009 Cálculo del tamaño de un arreglo de bytes • Contador de posición actual: $ – Se resta el inicio de lista – La diferencia es el tamaño del arreglo list BYTE 10,20,30,40 ListSize = ($ - list) 47 JCG-2009 Cálculo del tamaño de un arreglo de WORDS Como cada palabra toma dos bytes se divide el número de bytes por dos list WORD 1000h,2000h,3000h,4000h ListSize = ($ - list) / 2 48 JCG-2009 La directriz EQU • Puede definir constantes simbólicas como numéricas • No puede ser redefinidas en tiempo de ejecución • Se utilizan símbolos <> para definir su argumento PI EQU <3.1416> pressKey EQU <"Press any key to continue...",0> .data prompt BYTE pressKey 49 JCG-2009 La directriz TEXTEQU • Se utiliza para definir un símbolo como una constante ya sea numérica o línea de texto • Son llamadas macros de texto • Pueden ser redefinida durante tiempo de ejecución continueMsg TEXTEQU <"Do you wish to continue (Y/N)?"> rowSize = 5 .data prompt1 BYTE continueMsg count TEXTEQU %(rowSize * 2) ; evaluates the expression setupAL TEXTEQU <mov al,count> .code setupAL ; se sustituye por "mov al,10" 50 JCG-2009 Programación en modo real (1/2) • Se trabaja en ambiente MS-DOS (16 bits) • Ventajas – Habilita el uso de llamadas DOS y BIOS – No hay restricción de acceso a memoria • Desventajas – Se debe administrar tanto segmentos como desplazamientos – No existen llamadas a sistema: SYSCALLS – Está limitado a 640K de memoria de programa 51 JCG-2009 Programación en modo real (1/2) • Requirements – Titulo del programa y definición del modelo de administración de la memoria • .TITLE • .MODEL – Definición de los segmentos • Pila • Datos • código – Inicialización del segmento de datos: mov ax,@data mov ds,ax 52 JCG-2009 Implementación de estructuras típicas JCG-2009 Implementación de estructuras típicas JCG-2009 Implementación de estructuras típicas JCG-2009 Implementación de estructuras típicas JCG-2009 Implementación de estructuras típicas JCG-2009 Tarea • Instalar el Turbo Assembler 5.0 • Encontrar el problema al programa que el profesor plantea en el TEC virtual, arreglarlo y documentarlo JCG-2009 Bibliografía • Irvine, Kip; Assembly Language for IntelBased Computers. 5th Edition. Pearson Education. 2007 JCG-2009