Módulo 08 Lenguaje Ensamblador

Documentos relacionados
Módulo 09 Lenguaje Ensamblador

LEER Y ESCRIBIR ARCHIVOS O FICHEROS EN C. FOPEN, FCLOSE, MODOS DE ACCESO READ, WRITE Y APPEND (CU00536F)

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Entorno de Ejecución del Procesador Intel Pentium

6-REGISTROS DEL 8086 Y DEL 80286

PRACTICA #1. Aprender a programar una interrupción software empleando C y/o Ensamblador.

Para crear formularios se utiliza la barra de herramientas Formulario, que se activa a través del comando Ver barra de herramientas.

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

Tema 2. Diseño del repertorio de instrucciones

Centro de Capacitación en Informática

LABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL

APUNTES DE WINDOWS. Windows y sus Elementos INSTITUTO DE CAPACITACIÓN PROFESIONAL. Elementos de Windows

La ventana de Microsoft Excel

Para ingresar a la aplicación Microsoft PowerPoint 97, los pasos que se deben seguir pueden ser los siguientes:

Arquitectura de Computadores

INSTRUCTIVO DEL COMANDO MAKE

Generación de código para funciones. Generación de código para funciones. Generación de código para funciones. Generación de código para funciones

Capitulo V Administración de memoria

Capítulo 4 Procesos con estructuras de repetición

Modulo 1 El lenguaje Java

"Programación en Ensamblador del microprocesador Pentium (I)"

Servicio de estadísticas de Alojamiento Fecha de revisión: 19/09/2005

Este programa mueve cada motor de forma independiente, y cuando termina una línea pasa a la siguiente.

Introducción al NASM. Convenciones de colores

Manual Impress Impress Impress Impress Impress Draw Impress Impress

Qué es una máquina virtual?

62/8&,21(6$/(;$0(1'( /$%25$725,2'((6758&785$6'(/26&20387$'25(6 &8562)(%5(52

COMO HACER UN CUMENTO DE WORD PARA TRABAJOS LARES

Instructivo de Microsoft Excel 2003

Un kilobyte (KB) son 1024 bytes, un Megabyte (MB) son 1024 KB, un Gigabyte son 1024 Mb

Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía.

Tema 2: Arquitectura del repertorio de instrucciones. Visión del computador que tiene el programador en bajo nivel.

En cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.

EDICIÓN Y FORMATO (II)

I NTRODUCCIÓN 1. ORDENADOR E INFORMÁTICA

Sistemas Operativos. Curso 2016 Procesos

MATERIAL 2 EXCEL 2007

En esta unidad añadiremos información sobre EXT3 y trabajaremos con aspectos visibles que nos proporcionan estos sistemas de archivos.

INSTALACIÓN DE ORACLE 8i (8.1.7) SOBRE NT

Arquitectura intel Preámbulo de OSO para alumnos formados en el procesador MIPS. Asignatura Sistemas Operativos Murcia abril de 2005

Para obtener una cuenta de padre

Ingeniería de Software I

MANUAL TÉCNICO DE IMPLEMENTACIÓN PROYECTO SOCIAL COMPUESCUELA. Elaborado por: Julián A. Hernández M.

Tutorial de Introducción a la Informática Tema 0 Windows. Windows. 1. Objetivos

Manual de OpenOffice Impress

Administración avanzada de paquetes. apt-proxy.

Para ingresar a la aplicación Microsoft Word 97, los pasos que se deben seguir pueden ser los siguientes:

Curso Internet Básico - Aularagon

HERRAMIENTAS DE ACCESS ACCESS Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Programa Presupuestos de Sevillana de Informática.

Estimado usuario. Tabla de Contenidos

1 La Resolución de Problemas utilizando la Computadora

Operación de Microsoft Word

HP Backup and Recovery Manager

Instalación del programa PSPP y obtención de una distribución de frecuencias.

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Certificados para la exportación de dispositivos médicos por David Racine

FORMACIÓN DE EQUIPOS DE E-LEARNING 2.0 MÓDULO DE DISEÑO Y PRODUCCIÓN DE MATERIALES UNIDAD 6 B

Ensamblador. Interrupciones. Dentro de una computadora existen dos clases de interrupciones:

PRÁCTICAS DE GESTIÓN GANADERA:

Instructivo Asesoría Básica Comunidad Virtual SharePoint 2010

Práctica 2: Sector de arranque

Otros Lenguajes de Programación

La memoria principal. Los subsistemas de E/S. Los buses del sistema

Práctica 0. Emulador XENON de la computadora CESIUS

Servicio de Informática Vicerrectorado de Tecnologías de la Información y la Comunicación

CENTRO DE APOYO TECNOLÓGICO A EMPRENDEDORES, BILIB RECETA TECNOLÓGICA REALIZACIÓN DE COPIAS DE SEGURIDAD CON GSYNC

El conjunto de conocimientos científicos y técnicos que hacen posible la resolución de forma automática de problemas por medio de las computadoras.

1. Solicitando una cuenta de correo a nuestro proveedor de Internet. 2. Adquiriendo una cuenta de correo a través de la web (webmail).

Organización Básica de un Computador y Lenguaje de Máquina

Configuración de DNS seguros

SISTEMA ETAP en línea Estándares Tecnológicos para la Administración Pública

"Binary Diffing" visual en Linux con Radare2 "UNA IMAGEN DICEN MÁS QUE MIL PALABRAS"

INVENTARIO INTRODUCCIÓN RESUMEN DE PASOS

Manual de ayuda para la utilización del Correo Interno en el Campus Virtual

Proyectos de Innovación Docente

Pipelining o Segmentación de Instrucciones

OPERADORES LÓGICOS Y DE COMPARACIÓN EN PHP. PRIORIDADES. EJEMPLOS. EJERCICIOS RESUELTOS. (CU00818B)

CÓMO CREAR NUESTRO CATÁLOGO

Organización del Computador I 1er. Parcial 17-Mayo Turno:

Ejercicio Artículo 4.5. Bancos de imágenes y sonido en la Web

5.2.1 La Página Principal

Base de datos en la Enseñanza. Open Office

Tema 1 Introducción. Arquitectura básica y Sistemas Operativos. Fundamentos de Informática

Tema: INSTALACIÓN Y PARTICIONAMIENTO DE DISCOS DUROS.

CONCEPTOS BASICOS. Febrero 2003 Página - 1/10

Vamos a ver las dos formas básicas de arrancar PowerPoint.

Instrucción IrA (GoTo). Saltos no naturales en el flujo normal de un programa. Pseudocódigo y diagramas de flujo. (CU00182A)

Informática I Notas del curso

PREGUNTAS FRECUENTES SOBRE LOWESLINK DE LOWE S MÉXICO

PROGRAMACIÓN ORIENTADA A OBJETOS

Xerox 700 Digital Color Press con Integrated Fiery Color Server. Impresión de datos variables

WinHIPE: edición, compilación y ejecución de programas; y generación de animaciones web. Manual de usuario.

Instrucciones del microprocesador

PRÁCTICA N 2 SISTEMAS DE NUMERACIÓN

BANCOS. Manejo de Bancos. Como crear una ficha de Banco? Como modificar los datos de una ficha de Banco? Como borrar una ficha de Banco?

1. La nueva interfaz del programa

ESCUELA DE ADMINISTRACIÓN

Combinar comentarios y cambios de varios documentos en un documento

ADMINISTRACIÓN DE BASES DE DATOS DISTRIBUIDAS

Transcripción:

Módulo 08 Lenguaje Ensamblador Organización de Computadoras Depto. Cs. e Ing. de la Comp. Universidad Nacional del Sur

Copyright Copyright 2011-2015 A. G. Stankevicius Se asegura la libertad para copiar, distribuir y modificar este documento de acuerdo a los términos de la GNU Free Documentation License, Versión 1.2 o cualquiera posterior publicada por la Free Software Foundation, sin secciones invariantes ni textos de cubierta delantera o trasera. Una copia de esta licencia está siempre disponible en la página http://www.gnu.org/copyleft/fdl.html. La versión transparente de este documento puede ser obtenida de la siguiente dirección: http://cs.uns.edu.ar/~ags/teaching Organización de Computadoras - Mg. A. G. Stankevicius 2

Contenidos Entorno de programación. Partes de un programa. Directivas al compilador. Arquitectura i386. Estructuras de control. Principales llamadas al sistema. Pasaje de parámetros. Proceso de ensamblado, vinculación y carga. Organización de Computadoras - Mg. A. G. Stankevicius 3

Entorno de programación En lo que resta de la materia, usaremos al sistema operativo GNU/Linux como entorno de programación en lenguaje ensamblador. Qué es un sistema operativo? Un sistema operativo es el encargado de gestionar la interacción entre el usuario y la computadora y de administrar sus recursos de manera eficiente. Qué es GNU/Linux? Es un SO libre: estamos autorizado para usarlo, copiarlo, estudiar su código fuente, etc. Organización de Computadoras - Mg. A. G. Stankevicius 4

Entorno de programación El entorno para programar en lenguaje ensamblador es en esencia un LiveDVD. Un LiveDVD es un DVD booteable que contiene al SO y a las restantes aplicaciones que necesitamos para programar. Para poder usarlo, hay que poner el DVD en la lectora antes de que cargue el SO del disco rígido. Es posible que haya que configurar el BIOS para que bootee del DVD en primer lugar. Organización de Computadoras - Mg. A. G. Stankevicius 5

Entorno de programación Otra alternativa es correr el entorno de programación dentro de una máquina virtual. La idea es incorporar la imagen del LiveDVD como la unidad de DVD una computadora virtual creada dentro de cualquiera de los soluciones de virtualización disponibles en el mercado (VMWare, VirtualBox, VirtualPC, etc.). Esta máquina virtual debe contar con una cantidad razonable de RAM (por caso, 1 GB), si bien en contraste puede carecer de disco rígido. Organización de Computadoras - Mg. A. G. Stankevicius 6

Inicio de la sesión El LiveDVD cuenta con dos usuarios previamente creados: El administrador del sistema (root). Un usuario convencional (orguns). La contraseña para el usuario convencional es el nombre de usuario (esto es, orguns). Para acceder a las tareas de administración del sistema también se usa la contraseña del usuario convencional (al estilo Ubuntu). Organización de Computadoras - Mg. A. G. Stankevicius 7

Persistencia de los cambios El LiveDVD corre íntegramente en memoria, sin afectar el contenido del disco rígido. Esto es una ventaja, ya que la ejecución incorrecta de nuestros programas no podrá dañar al sistema. También es una desventaja, ya que los fuentes y ejecutables creados se pierden al apagar la máquina. Para compensar esta falta de persistencia, el LiveDVD incluye una aplicación que simplifica la creación y restauración de copias de respaldo llamada Déjà-Dup. Organización de Computadoras - Mg. A. G. Stankevicius 8

Arquitecturas de 32 bits Escribir el código fuente: $ nano prueba.asm Compilar el código fuente: $ yasm -f elf prueba.asm Enlazar (vincular) el código objeto: $ ld -o prueba prueba.o Ejecutar el programa resultante: $./prueba Organización de Computadoras - Mg. A. G. Stankevicius 9

Arquitecturas de 64 bits El lenguaje ensamblador que veremos se trata del de la arquitectura i386, de 32 bits. Por esta razón, el LiveDVD se trata de un sistema operativo de 32 bits. Quien cuente con una arquitectura de 64 bits también puede usar el LiveDVD, ya que el hardware cuenta con la posibilidad de emular esa arquitectura. Por otra parte, quien tenga hardware de 64 bits y a su vez tenga GNU/Linux de 64 bits también puede cross-compilar código de 32 bits. Organización de Computadoras - Mg. A. G. Stankevicius 10

Arquitecturas de 64 bits Escribir el código fuente: $ nano prueba.asm Compilar el código fuente: $ yasm -f elf -m x86 prueba.asm Enlazar (vincular) el código objeto: $ ld -o prueba -m elf_i386 prueba.o Ejecutar el programa resultante: $./prueba Organización de Computadoras - Mg. A. G. Stankevicius 11

Depuración de un ejecutable Compilar el código fuente: $ yasm -f elf -g dwarf2 prueba.asm Enlazar (vincular) el código objeto: $ ld -o prueba prueba.o Depurar el programa resultante: $ ddd prueba Organización de Computadoras - Mg. A. G. Stankevicius 12

Estructura de un fuente El código fuente, como suele ser el caso en los lenguajes de programación, son en esencia archivos de texto. Deben contener las siguientes secciones:.data: conteniendo datos inicializados..bss: conteniendo datos no inicializados..text: conteniendo el programa propiamente dicho..stack: conteniendo información acerca de la configuración inicial de la pila del programa. Organización de Computadoras - Mg. A. G. Stankevicius 13

Directivas al compilador Las directivas instruyen al compilador, sin generar código máquina. Las directivas %define e %include funcionan de manera análoga a C: %include mylib.inc %define tope 100 La directiva EQU asocia el resultado de una expresión a una etiqueta: LF EQU 10 Organización de Computadoras - Mg. A. G. Stankevicius 14

Directivas al compilador Existen dos clases de directivas para reservar locaciones de memoria: Las que reservan memoria sin inicializar. Las que reservan memoria con un determinado valor inicial. Estas directivas sólo pueden aparecer en las secciones.bss o.data, respectivamente. Cada locación de memoria puede o no tener una etiqueta asociada. Organización de Computadoras - Mg. A. G. Stankevicius 15

Locaciones sin inicializar Las siguientes directivas reservan locaciones de memoria sin inicializar: resb para reservar bytes (8 bits) resw para reservar words (16 bits) resd para reservar doubles (32 bits) resq para reservar quads (64 bits) Ejemplo: section.bss buffer resb 256 ; reserva 256 bytes Organización de Computadoras - Mg. A. G. Stankevicius 16

Locaciones inicializadas Las siguientes directivas reservan locaciones de memoria inicializadas: db para reservar bytes (8 bits) dw para reservar words (16 bits) dd para reservar doubles (32 bits) dq para reservar quads (64 bits) Ejemplo: section.data contador dd 0 ; reserva espacio para ; una variable de 32 bits Organización de Computadoras - Mg. A. G. Stankevicius 17

Etiquetas Las etiquetas son básicamente direcciones de memoria. Pueden apuntar a una locación que contiene datos o bien que contiene código. En caso de comenzar con un punto, se consideran locales (esto es, pueden repetirse varias veces en el mismo archivo):.loop... jnz loop ; salta a la etiqueta ;.loop más cercana. Organización de Computadoras - Mg. A. G. Stankevicius 18

Registros del procesador La arquitectura i386 tiene 8 registros: ESP y EBP: suelen tener un rol específico. EAX, EBX, ECX, EDX, ESI, EDI: registros de propósito general. La memoria funciona como un gran arreglo. Se direcciona al byte. El procesador está en modo protegido. La ejecución de un programa no puede afectar a los restantes programas en ejecución. Organización de Computadoras - Mg. A. G. Stankevicius 19

Registros del procesador La versión de 16 bits de los registros (esto es, sus 16 bits menos significativos) también pueden ser accedidos: Por caso: AX, BX, SI, SP, etc. Algunos de estos registros permiten a su vez acceder a los dos campos de 8 bits que lo componen. Por caso: AX se compone de AH y AL. En contraste, los 16 bits más significativos no son referenciables de manera directa. Organización de Computadoras - Mg. A. G. Stankevicius 20

Instrucción MOV Sintaxis: mov dest, origen mov ebx, 3 ; guarda un 3 en EBX mov eax, ebx ; copia EBX en EAX mov eax, CONT ; guarda CONT en EAX Restricciones: El destino no puede ser una constante. Se puede hacer referencia de a lo sumo una dirección de memoria. Origen y destino tienen que ser compatibles. Organización de Computadoras - Mg. A. G. Stankevicius 21

Accediendo a memoria Los corchetes denotan al modo de direccionamiento indirecto: mov eax, CONT ; guarda CONT en EAX mov ecx, [eax] ; guarda el contenido ; de CONT en ECX mov ecx, [CONT] ; inst. equivalente La arquitectura i386 permite acceder a memoria mediante el siguiente modo: [ base + escala índice + offset ] Organización de Computadoras - Mg. A. G. Stankevicius 22

Accediendo a memoria El requisito de compatibilidad de los operandos implica que a veces tengamos que explicitar el tamaño de los mismos: mov dword [CONT], 1 mov eax, CONT mov ebx, [CONT] mov [eax], byte 1 Los modificadores posibles son byte, word y dword. Organización de Computadoras - Mg. A. G. Stankevicius 23

Instrucciones aritméticas Operaciones aritméticas disponibles: add destino, operando sub destino, operando inc destino dec destino not destino neg destino mul operando / imul operando div divisor / idiv divisor Organización de Computadoras - Mg. A. G. Stankevicius 24

Estructuras de control Los lenguajes de alto nivel cuentan con diversas estructuras de control. El lenguaje ensamblador es más elemental, sólo cuenta con las siguientes facilidades: La instrucción cmp para comparar valores entre sí. Los flags del procesador para recordar el resultado de la última comparación u otras operaciones. Los saltos para alterar el flujo de ejecución de forma condicionada o no. Organización de Computadoras - Mg. A. G. Stankevicius 25

Principales flags La arquitectura i386 cuenta con diversos flags del procesador, los cuales reflejan el resultado de la última comparación. Para los enteros no signados se usan los flags zero (ZF) y carry (CF). Para los enteros signados se usan los flags overflow (OF) y sign (SF). El resultado de la mayoría de las operaciones aritméticas también afectan los flags. Organización de Computadoras - Mg. A. G. Stankevicius 26

Instrucción CMP Sintáxis: cmp primero, segundo Esta instrucción computa primero segundo, modificando los flags de manera acorde. Si resultado = 0 (primero == segundo): ZF = 1; CF = 0; Si resultado > 0 (primero > segundo): ZF = 0; CF = 0; SF = OF; Si resultado < 0 (primero < segundo): ZF = 0; CF = 1; SF!= OF; Organización de Computadoras - Mg. A. G. Stankevicius 27

Instrucción JMP Sintaxis: jmp dest / jmp short dest jmp infinite-loop jmp short label-cercano Los saltos incondicionales siempre transfieren el control a una cierta dirección de memoria sin tener en cuenta el estado de los flags. La instrucción a continuación de un jmp jamás será ejecutada...salvo que sea el destino casualmente de un salto! Organización de Computadoras - Mg. A. G. Stankevicius 28

Saltos condicionales En los saltos condicionales no siempre se produce la transferencia de control, habida cuenta que el salto se realiza o no dependiendo del estado de uno o más flags. Los saltos más sencillos dependen del estado de sólo un flag (no son tan frecuentes). Los saltos más complejos dependen del estado de múltiples flags a la vez (son más frecuentes). Organización de Computadoras - Mg. A. G. Stankevicius 29

Saltos condicionales Saltos simples: jz dest / jnz dest: depende de ZF. jo dest / jno dest: depende de OF. js dest / jns dest: depende de SF. jc dest / jnc dest: depende de CF. jp dest / jnp dest: depende de PF. Si el flag está activo se produce el salto. Si el flag no está activo, la ejecución continúa en la instrucción siguiente al salto condicional. Organización de Computadoras - Mg. A. G. Stankevicius 30

Saltos condicionales Saltos condicionales para valores signados (se asume que se acaba de ejecutar la instrucción cmp eax, ebx): je dest: salta si eax = ebx. jne dest: salta si eax ebx. jl dest / jnge dest: salta si eax < ebx. jle dest / jng dest: salta si eax ebx. jg dest / jnle dest: salta si eax > ebx. jge dest / jnl dest: salta si eax ebx. Organización de Computadoras - Mg. A. G. Stankevicius 31

Saltos condicionales Saltos condicionales para valores no signados (se asume que se acaba de ejecutar la instrucción cmp eax, ebx): je dest: salta si eax = ebx. jne dest: salta si eax ebx. jb dest / jnae dest: salta si eax < ebx. jbe dest / jna dest: salta si eax ebx. ja dest / jnbe dest: salta si eax > ebx. jae dest / jnb dest: salta si eax ebx. Organización de Computadoras - Mg. A. G. Stankevicius 32

Estructuras de control La estructura de control condicional se puede codificar con facilidad en ensamblador: ; if (a > 15) { b = 32; } else { a = a + 1; } mov eax, [a] cmp eax, 15 ; comparo a con 15 jng else ; ir a else si 15 mov [b], word 32 ; brazo then jmp seguir ; else: inc eax seguir:... ; brazo else ; resto del programa Organización de Computadoras - Mg. A. G. Stankevicius 33

Estructuras de control Las restantes estructuras de control también se pueden codificar de una manera similar. Otra posibilidad es inspeccionar el código ensamblador generado por un compilador de lenguaje C ante las distintas estructuras de control: $ gcc -S prueba.c $ cat prueba.s... Organización de Computadoras - Mg. A. G. Stankevicius 34

Llamadas al sistema El sistema operativo brinda sus servicios a los distintos programas bajo la forma de llamadas al sistema. La mayor parte de las llamadas al sistema involucra conceptos que serán abordados recién en otras asignaturas. En esta materia haremos uso principalmente de las llamadas al sistema que permiten manipular archivos. Organización de Computadoras - Mg. A. G. Stankevicius 35

Llamadas al sistema La invocación de llamadas al sistema bajo el SO GNU/Linux es similar a la invocación de un procedimiento en C. La interrupción 80h es el portal de acceso a todos los servicios de este SO. El servicio solicitado se indica en el registro EAX y sus parámetros usualmente en los restantes registros del procesador. Si el servicio retorna algún valor, lo hará también haciendo uso del registro EAX. Organización de Computadoras - Mg. A. G. Stankevicius 36

Llamadas al sistema Principales llamadas al sistemas provistas por GNU/Linux: sys_exit: Para finalizar de un proceso. sys_open: Para abrir un archivo. sys_close: Para cerrar un archivo. sys_read: Para leer un archivo preexistente. sys_write: Para escribir un archivo preexistente. sys_creat: Para crear un nuevo archivo. Organización de Computadoras - Mg. A. G. Stankevicius 37

Fuentes de información La sección 2 de la documentación que acompaña al SO GNU/Linux contiene una detallada descripción de la forma de invocación a los distintos servicios. $ man 2 write La documentación está pensada para invocar la llamada al sistema desde el lenguaje C, pero la adaptación para el caso de estar invocándola desde lenguaje ensamblador es relativamente directa. Organización de Computadoras - Mg. A. G. Stankevicius 38

Convenciones Por ejemplo, para invocar a la llamada al sistema sys_write, se requiere: Cargar el número de servicio solicitado (sys_write es el 4) en el registro EAX. Cargar el descriptor del archivo que queremos escribir en el registro EBX. Cargar el puntero al buffer conteniendo lo que queremos escribir en el registro ECX. Cargar la cantidad de bytes que queremos escribir en el registro EDX. Organización de Computadoras - Mg. A. G. Stankevicius 39

Convenciones En general, el pasaje de parámetros en las llamadas al sistema adopta dos variantes en función de la cantidad de argumentos: Para pasar de cero a seis argumentos se usa pasaje de parámetros en registros, usando los registros EBX, ECX, EDX, ESI, EDI y EBP, en ese orden. Para pasar más de seis argumentos se usa pasaje de parámetros en memoria, usando el registro EBX para indicar la dirección de comienzo de la lista de parámetros. Organización de Computadoras - Mg. A. G. Stankevicius 40

Nuestro primer programa section.data texto db 'Hola mundo!',10 largo equ $ - texto ; $ denota el offset ; actual section.text global _start ; etiqueta global que ; marca el comienzo ; del programa Organización de Computadoras - Mg. A. G. Stankevicius 41

Nuestro primer programa _start: mov eax, 4 mov ebx, 1 ; servicio sys_write ; standard output mov ecx, texto ; offset de mensaje mov edx, largo ; largo del mensaje int 80h mov eax, 1 mov ebx, 0 int 80h ; invocación al servicio ; servicio sys_exit ; terminación sin errores ; invocación al servicio Organización de Computadoras - Mg. A. G. Stankevicius 42

Invocación a procedimientos La invocación a un procedimiento no difiere en gran medida de los saltos convencionales. Se adopta la convención de dejar en el tope la pila del programa la dirección a la que se debe retornar una vez finalizada la ejecución del procedimiento. Las instrucciones call y ret simplifican la invocación a procedimientos y el posterior retorno una vez finalizados. Organización de Computadoras - Mg. A. G. Stankevicius 43

Ejemplo start_: mov eax, [UNVALOR] call triplicar ; procedimiento para triplicar... ; el valor almacenado en EAX triplicar: push ecx push edx ; preservo ECX en la pila ; preservo EDX en la pila mov ecx, 3 mul ecx ; multiplico por 3 pop edx pop ecx ret ; recupero EDX de la pila ; recupero ECX de la pila ; retorno Organización de Computadoras - Mg. A. G. Stankevicius 44

Pila del programa La pila del programa (stack) es una de las regiones que forma parte de los programas en ejecución. Su tamaño es dinámico, crece o disminuye según se requiera. Crece hacia abajo desde la dirección más alta. Es utilizada para almacenar datos temporalmente, tales como la dirección de retorno al invocar a un procedimiento o el valor actual de un registro el cual será alterado, por caso, durante la invocación a un servicio del sistema operativo. Organización de Computadoras - Mg. A. G. Stankevicius 45

Pila del programa Operaciones sobre la pila del programa: Instrucción push: resta el tamaño en bytes del objeto apilado al valor actual del registro ESP (stack pointer) y lo almacena en el lugar ahora apuntado por ESP. Instrucción pop: recupera el objeto a ser desapilado de la locación apuntada por el registro ESP y lo actualiza sumándole el tamaño en bytes de ese objeto. Nótese que el objeto sigue en memoria, pero será sobrescrito cuando el tamaño de la pila vuelva a crecer. Organización de Computadoras - Mg. A. G. Stankevicius 46

Caller save vs. callee save Para preservar el contenido de los registros que serán alterados durante la ejecución de un procedimiento surgen dos alternativas: Una posibilidad (denominada caller save ) es que quien llama al procedimiento se encargue de salvar en la pila del programa aquellos registros que se necesiten preservar. Otra posibilidad (denominada callee save ) es que el procedimiento que es llamado se encargue de preservar en la pila del programa sólo aquellos registros que serán modificados. Organización de Computadoras - Mg. A. G. Stankevicius 47

Caller save vs. callee save Cada alternativa tiene ventajas y desventajas: Caller save permite optimizar múltiples llamados a un procedimiento, evitando que cada una de las invocaciones preserve y recupere de la pila múltiples registros. Callee save, por otra parte, posibilita que el procedimiento sólo preserve los registros que serán afectados (el llamador usualmente no tiene acceso a esta información). La idea es adoptar sólo uno de estos esquemas a lo largo de un mismo programa. Organización de Computadoras - Mg. A. G. Stankevicius 48

Pasaje de parámetros Los procedimiento en ocasiones requieren recibir información adicional al ser invocados, esto es, requieren un conjunto de parámetros. El pasaje de estos parámetros se puede resolver de diversas formas: Usando los registros del procesador. Usando una región de la memoria. Usando la pila del programa. Organización de Computadoras - Mg. A. G. Stankevicius 49

Pasaje de parámetros Usando registros: Este es por lejos el mecanismo más eficiente (pues no implica accesos adicionales a memoria). La cantidad de parámetros está limitada a la cantidad de registros disponibles. Usando la memoria: Este mecanismo es más flexible que el anterior, pues permite una cantidad mucho mayor de parámetros. Naturalmente, tiene como desventaja que implica accesos adicionales a memoria. Organización de Computadoras - Mg. A. G. Stankevicius 50

Pasaje de parámetros Usando la pila del programa: El pasaje de parámetros usando registros o usando la memoria no resulta del todo apropiado a la hora de implementar procedimientos recursivos. En contraste, el pasaje de parámetros usando la pila del programa permite la implementación de procedimientos recursivos con relativa simpleza. Nótese que la dirección de retorno seguirá ocupando el tope de la pila, es decir, los parámetros serán apilados por debajo (lo que implica que la pila no será accedida como una pila). Organización de Computadoras - Mg. A. G. Stankevicius 51

Reentrancia Por qué resulta más conveniente usar la pila, que está memoria, que directamente un región de la memoria? En otras palabras, por qué en un caso podemos implementar soluciones recursivas y en el otro no? La diferencia entre las dos alternativas radica en que usando la pila obtenemos lo que se denomina un procedimiento reentrante o puro. Organización de Computadoras - Mg. A. G. Stankevicius 52

Reentrancia Para alcanzar la reentrancia hace falta que el código no sea automodificable y que sólo se opere sobre los registros o la pila del programa. Para apreciar las ventajas de este tipo de código hay que recordar que los sistemas en la actualidad son multiprogramados, es decir, existe más de un programa en ejecución a la vez. Bajo esta definición, la recursión consiste meramente en sacar provecho de la reentrancia en una determinada rutina. Organización de Computadoras - Mg. A. G. Stankevicius 53

Comandos de la consola La consola que brinda GNU/Linux nos da acceso a diversos comandos: ls ruta: lista el contenido de un directorio. ls -l ruta: lista el contenido de un directorio mostrando más detalles. cd directorio: cambia el directorio actual rm archivo: borra un archivo. cp origen destino: copia un archivo. mv origen destino: mueve un archivo. Organización de Computadoras - Mg. A. G. Stankevicius 54

Comandos de la consola Continúa: mkdir directorio: crea un directorio. rmdir directorio: borra un directorio. cat archivo: lista el contenido de un archivo sin paginar. man tópico: muestra la ayuda (si es que existe) acerca del tópico indicado. echo cadena: muestra la cadena de caracteres por pantalla. Organización de Computadoras - Mg. A. G. Stankevicius 55

Comandos útiles El comando alias permite crear sinónimos de los comando usados frecuentemente: $ alias n=nano $ n prueba.asm $ alias asm= yasm -f elf $ asm prueba.asm La invocación al comando alias sin argumentos lista por pantalla el conjunto de los sinónimos activos. Organización de Computadoras - Mg. A. G. Stankevicius 56

Consejo práctico El intérprete de comandos del SO GNU/Linux es muy poderoso. Presionando la tecla TAB, estamos solicitando al intérprete que intente autocompletar lo que estamos escribiendo. Si nos acostumbramos a usarlo, es posible alcanzar una velocidad de escritura mediante el teclado antológica. Organización de Computadoras - Mg. A. G. Stankevicius 57

Parámetros en la línea de comandos El SO GNU/Linux simplifica el acceso desde el lenguaje ensamblador a los parámetros pasados en la línea de comandos. Se adopta una convención similar a la empleada bajo el lenguaje C. El cargador se encarga que al comenzar la ejecución el tope de la pila del sistema esté ocupado por las conocidas estructuras de datos ARGC y ARGV. Organización de Computadoras - Mg. A. G. Stankevicius 58

Parámetros en la línea de comandos La instrucción pop permiten acceder a los parámetros en la línea de comandos recibidos: _start: pop eax ; EAX contiene a ARGC pop ebx ; EBX almacena un puntero a ARGV[0], ; el nombre del programa actual pop ecx ; ECX almacena un puntero a ARGV[1],... ; el primer argumento recibido Organización de Computadoras - Mg. A. G. Stankevicius 59

Ejemplo section.text global _start _start: pop eax ; EAX contiene a ARGC cmp eax, 2 ; nos pasaron exactamente un argumento? je seguir ; de ser así, seguir; ; caso contrario, indicar el error. mov eax, 1 ; sys_exit mov ebx, 1 ; terminación con error int 80h ; invocación del servicio del SO Organización de Computadoras - Mg. A. G. Stankevicius 60

Ejemplo seguir: mov eax, 4 mov ebx, 1 pop ecx pop ecx mov edx, 1 int 80h ; sys_write ; stdout ; descartamos ARGV[0] ; conservamos ARGV[1] ; imprimir sólo un carácter ; invocación del servicio del SO mov eax, 1 ; sys_exit xor ebx, ebx ; terminación normal int 80h ; invococión del servicio del SO Organización de Computadoras - Mg. A. G. Stankevicius 61

Resultado de la ejecución La variable $? contiene el resultado de la ejecución del último programa: $ yasm -f elf pasaje.asm && ld -o pasaje pasaje.o $./pasaje $ echo $? 1 $./pasaje abc a $ echo $? 0 Organización de Computadoras - Mg. A. G. Stankevicius 62

Ejecución de un programa Como hemos visto, un programa atraviesa distintas etapas desde su concepción hasta llegar a estar corriendo en una arquitectura: En primer lugar hay que escribir el código fuente. Más tarde hay que convertir ese código fuente en código objeto. Luego, se debe convertir el código objeto (de uno o más archivos fuente) en el código ejecutable. Finalmente, se debe cargar en memoria el código ejecutable y comenzar su ejecución. Organización de Computadoras - Mg. A. G. Stankevicius 63

Etapa de compilación Características: Durante esta etapa el código fuente es convertido en código objeto instrucción por instrucción. Se resuelven la totalidad de las referencias locales. Se identifican y dejan pendientes de resolver a la totalidad de las referencias externas. El código objeto es prácticamente ejecutable, sólo resta incorporar el código objeto asociado a otros módulos o bien a las funciones de librería que se hayan utilizado. Organización de Computadoras - Mg. A. G. Stankevicius 64

1-pasada vs. 2-pasadas En relación a la resolución de las referencias locales, es interesante tener en cuenta cómo se lleva adelante esa resolución. Es decir, al encontrar una referencia local, es decir, una etiqueta, cómo se puede saber a qué locación de memoria se está referenciando? El compilador cuenta con una estructura de datos interna denominada tabla de símbolos, donde anota la dirección que asocia a las distintas declaraciones de etiquetas que va encontrando durante el ensamblado. Organización de Computadoras - Mg. A. G. Stankevicius 65

1-pasada vs. 2-pasadas Naturalmente, la tabla de símbolos sólo contiene la dirección de las etiquetas cuyas declaraciones ya visitó. Es decir, en principio no es posible resolver las referencias a etiquetas aún no declaradas (por caso, saltos hacia adelante). Esto implica que el ensamblador deba realizar dos pasadas sobre el código fuente. Ahora bien, será factible resolver las referencias en sólo una pasada? Organización de Computadoras - Mg. A. G. Stankevicius 66

1-pasada vs. 2-pasadas La respuesta es que sí, veamos cómo: La clave radica en tener presente que tanto programa fuente como tabla de símbolos coexisten en el mismo espacio de direccionamiento (la memoria principal). Al encontrar una referencia a una etiqueta aún no declarada, se coloca en la tabla de símbolos una referencia a esa locación (en la cual posteriormente se deberá actualizar la dirección de la etiqueta). De aparecer otras referencias a esa misma etiqueta, se van enlazando las locaciones en donde eventualmente se deberá poner la dirección correcta. Organización de Computadoras - Mg. A. G. Stankevicius 67

1-pasada vs. 2-pasadas Continúa: Cuando eventualmente se alcance la declaración de esa etiqueta, se recorre la lista enlazada arrancando en la dirección almacenada en la tabla de símbolos reemplazando las referencias con la dirección recién descubierta. Caso contrario, de alcanzar el fin del archivo fuente simplemente se señala el error de compilación. Cabe acotar que esta idea sólo es aplicable si en el espacio asignado a la etiqueta dentro de la instrucción cabe una dirección completa. Organización de Computadoras - Mg. A. G. Stankevicius 68

Etapa de vinculación Características: Durante esta etapa el código objeto de uno o más archivos fuentes es convertido en código ejecutable. La principal tarea del vinculador es resolver la totalidad de las referencias externas. Las referencias a otros módulos se resuelven a partir de código objeto de ese módulo (el cual debe suministrarse en ese momento). Las referencias a librerías se resuelven usando el código objeto de la librería, el cual estará disponible en alguna ubicación conocida de antemano. Organización de Computadoras - Mg. A. G. Stankevicius 69

Características: Etapa de carga El cargador, un componente del sistema operativo, es el encargado de cargar a memoria el código ejecutable de un cierto programa. A esta altura todas las referencias externas están resueltas, sólo resta conocer la dirección inicial a partir de la cual será cargado el código ejecutable. Los modelos más avanzados de manejo de memoria han simplificado notablemente esta tarea (por caso, al contar con un espacio de direccionamiento de uso exclusivo para cada proceso). Organización de Computadoras - Mg. A. G. Stankevicius 70

Vinculación dinámica Como es frecuente que múltiples programas compartan la misma librería (por caso, stdio), en la actualidad es posible vincular múltiples programas a una misma instancia en memoria de la librería. Desde ya, esta librería debe estar compuesta exclusivamente de procedimientos reentrantes. Nótese que esas referencias externas no podrán ser resueltas en tiempo de vinculación, razón por la cual es este tipo de librería se las denomina de vinculación dinámica (por caso, las librerías.dll). Organización de Computadoras - Mg. A. G. Stankevicius 71

Preguntas? Organización de Computadoras - Mg. A. G. Stankevicius 72