ESTRUCTURA DE MICROPROCESADORES Programación Básica con ensamblador Profesor Ing. Johan Carvajal Godínez
Agenda de la Clase 1. Introducción 2. Elementos básicos de lenguaje ASM 3. Instrucciones básica en Ensamblador 4. Ejemplo: Suma y restas de enteros 5. Proceso de ensamblado, enlazado y ejecución de un programa en ASM 6. Protocolo de definición de datos 7. Definición de constantes 8. Programación en modo real 9. Estructuras básicas de programación 2
Que es 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.
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
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).
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.
Fases en generación de un ejecutable TASM TLINK
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
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
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
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
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 OS Function Level 2 ASM Program 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
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
Operaciones con enteros Nivel de precedencia en operaciones con enteros: Ejemplos: 15
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
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
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
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 (opcional) Mnemónico (requerido) Operando (según el mnemónico requerido) Comentario (opcional) Etiqueta: Mnemónico Operando Comentario 19
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
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
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
Algunos formatos de instrucción Sin operandos stc ; Pone en uno la bandera de carry Con un operando inc eax ; Incrementa EAX inc mybyte ; Incrementa valor Con dos operandos add ebx,ecx ; Registro, Registro sub mybyte,25 ; Memoria, Constante add eax,36 * 25 ; Registro, expresión 23
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
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
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
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
Ensamblado, enlace y ejecución de ASM Ciclo de ensamblado, enlace y ejecución make32.bat Archivo de listado Archivos de mapa de memoria 28
Ciclo de ensamblado, enlace y ejecución El diagrama describe la secuencia de pasos requeridos para crear un programa en ASM Link Library Source File Step 2: assembler Object File Step 3: linker Executable File Step 4: OS loader Output Step 1: text editor Listing File Map File 29
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
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
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
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
Definiendo Bytes Cada una de estas definiciones trabaja sobre bytes: PRUEBA1 BYTE 'A' PRUEBA2 BYTE 0 PRUEBA3 BYTE 255 PRUEBA4 SBYTE -128 PRUEBA5 SBYTE +127 PRUEBA6 BYTE? ; caracter inicializado ; Byte sin signo más bajo ; Byte sin signo más alto ; Byte con signo más bajo ; Byte con signo más alto ; Byte sin inicializar Algunos debugers muestran los valores con formato de signos y valor Ejemplo: -2 34
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
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
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
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
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
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 WORD 65535 word2 SWORD 32768 word3 WORD? word4 WORD "AB" mylist WORD 1,2,3,4,5 array WORD 5 DUP(?) ; Máximo valor sin signo ; Mínimo valor con signo ; variables sin inicializar ; Variable inicializada ; Arreglo de palabras ; Arreglo sin inicializar 40
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 DWORD 12345678h val2 SDWORD 2147483648 val3 DWORD 20 DUP(?) val4 SDWORD 3, 2, 1,0,1 ; Doble palabra sin signo ; Doble palabra con signo ; arreglo sin signo ; Arreglo con signo 41
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
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
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
Constantes simbólicas Directriz de igual Cálculo del tamaño de arreglos y cadenas La directriz EQU La directriz TEXTEQU 45
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
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
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
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
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
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
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
Implementación de estructuras típicas
Implementación de estructuras típicas
Implementación de estructuras típicas
Implementación de estructuras típicas
Implementación de estructuras típicas
Tarea Instalar el Turbo Assembler 5.0 Encontrar el problema al programa que el profesor plantea en el TEC virtual, arreglarlo y documentarlo
Bibliografía Irvine, Kip; Assembly Language for Intel- Based Computers. 5th Edition. Pearson Education. 2007