(3) Unidad 3. Interfaz del ensamblador con el lenguaje C SISTEMAS BASADOS EN MICROPROCESADORES. Grado en Ingeniería Informática EPS - UAM

Documentos relacionados
UNIVERSIDAD TECNOLÓGICA NACIONAL FACULTAD REGIONAL SAN NICOLÁS INGENIERIA EN ELECTRÓNICA

ENSAMBLADOR DE ARCHIVO TASM MASM NASM GAS. Características de un Ensamblador de Archivo

Tema 5: La pila, las macros y los procedimientos

Tema 1. Fundamentos del lenguaje ensamblador

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

SISTEMAS BASADOS EN MICROPROCESADORES

Estructura de Computadores: Tema 1. Introducción. Índice. Arquitectura del i8086

Tema 4. La pila, los procedimientos y las macros

LABORATORIO DE PROGRAMACIÓN EN LENGUAJE ENSAMBLADOR x86-16bits

Intel Departamento de Arquitectura 1. Facultad de Ingeniería Universidad de la República. Arquitectura de Computadoras, 2016

SISTEMAS BASADOS EN MICROPROCESADORES

ARQUITECTURA INTERNA DEL µp8086

Sobre cómo dividir un programa ensamblador x86 (modo Real) en módulos compilables por separado.

(2) Unidad 2. Modelo de Programación del 80x86 de Intel SISTEMAS BASADOS EN MICROPROCESADORES. Grado en Ingeniería Informática EPS - UAM

Conceptos de Arquitectura de Computadoras Curso 2015

P1.- Para facilitar la tarea, suponemos definido en el segmento de datos lo siguiente:

SISTEMAS BASADOS EN MICROPROCESADORES

Alternativas de programación

SISTEMAS BASADOS EN MICROPROCESADOR 2º Grado Ingeniería Informática (EPS UAM) EXAMEN FINAL EXTRAORDINARIO JULIO 2013 ENUNCIADO DEL PROBLEMA

Tema: Lenguaje ensamblador embebido

(4) Unidad 4. Recursos de Programación SISTEMAS BASADOS EN MICROPROCESADORES. Grado en Ingeniería Informática EPS - UAM

Objetivo. Introducción. Tema: GENERACION DE CODIGO. Compiladores, Guía 11 1

Examen de teoría (5 puntos)

DIRECTIVAS DEL ASM86

LABORATORIO DE PROGRAMACIÓN EN LENGUAJE ENSAMBLADOR x86-16bits

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

SISTEMAS BASADOS EN MICROPROCESADORES

Tema 6. Segmentación y modos de direccionamiento

Memoria Estática Punteros, Vectores y Matrices

Intel 8086 modelo básico (primera parte) Registros:

Memoria Estática Punteros, Vectores y Matrices

Tema 4. Lenguaje máquina y lenguaje ensamblador

La Pila en los Procesadores IA-32 e Intel c 64

Programación en lenguaje ensamblador. Instrucciones básicas. Formatos. Direccionamientos

Un. VIII. Generación de Código Objeto

Construyendo Programas más Complejos

Arquitectura de Computadores II 8086 Parte II

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

Examen de teoría (5 puntos)

Tema 5. Formato de instrucciones. Directivas, instrucciones de cadena y programas de varios módulos

Tema 6 Organización y gestión de la memoria

CON LOS VALORES ASCII

Práctica 3. Paso de parámetros entre subrutinas. 3. Consideraciones sobre el paso de parámetros

5 - Lenguaje Ensamblador

CAPÍTULO 3 PROGRAMACIÓN EN AMBIENTE DE PC

Área Académica: Sistemas Computacionales

MANEJO DEL MOUSE EN LENGUAJE C++

PROBLEMAS DE ESTRUCTURA DE LOS COMPUTADORES LENGUAJE MÁQUINA Y ENSAMBLADOR

SISTEMAS BASADOS EN MICROPROCESADORES (2º - GRADO ING. INFORMÁTICA) EJERCICIO CLASE

abril de 2017 Desarrollo de aplicaciones en Java Tipos de datos primitivos Tipos de datos Elementos de aplicaciones simples

Programas Residentes En Lenguaje Ensamblador

CONSTITUCIONES MISIONEROS CLARETIANOS

Arquitectura Interna del 8088

MÓDULO III PROGRAMACIÓN DEL MICROPROCESADOR

ESTRUCTURA Y ORGANIZACIÓN DE COMPUTADORES

Examen de Arquitectura de Computadores 2 22 de febrero del 2011

Programación I Teoría II.

2º CURSO INGENIERÍA TÉCNICA EN INFORMÁTICA DE GESTIÓN TEMA 1 - INTRODUCCIÓN JOSÉ GARCÍA RODRÍGUEZ JOSÉ ANTONIO SERRA PÉREZ

Intel Arquitectura. Programación en Ensamblador Ing. Marcelo Tosini

Introducción a Java. Introducción a Java. Programación I

adreça lògicacontingut (en hexadecimal) dels 8 bytes a partir de l adreça lògica

Apellidos Nombre DNI

EJEMPLOS EJERCICIOS RESUELTOS MOV CX,320*200 ; ESTA OPERACIÓN LA REALIZA EL ENSAMBLADOR XOR DI,DI CLD REP STOSB

Tema 4: Lenguaje máquina - Lenguaje ensamblador

INT 21H Función 02H Salida de Carácter LLAMADA: AH = 02H DL = Código ASCII a enviar al dispositivo de salida. DEVUELVE: NADA.

Tema 4. Lenguaje máquina y lenguaje ensamblador

Arquitectura (Procesador familia 80 x 86 )

05 Funciones en lenguaje C. Diego Andrés Alvarez Marín Profesor Asociado Universidad Nacional de Colombia Sede Manizales

Curso de Java Introducción a la Programación II

Examen de teoría (4 puntos)

Instrucciones de Control de Flujo y Usos de la Pila

Universidad Nacional de Ingeniería Arquitectura de Maquinas I. Unidad I: Arquitectura y Programación de un Microprocesador (8086)

Gestión de la memoria en tiempo de ejecución

ESTRUCTURA DE COMPUTADORES I (Capítulo 14: DIRECTIVAS) 1/32 14-DIRECTIVAS

El programa ALFA que se utilizará en el ejemplo se muestra en la figura. // Incrementa en 1 el // dato de entrada

Lenguajes de Programación I

Informática Ingeniería en Electrónica y Automática Industrial

Paso de parámetros y gestión del marco de pila

Tema 5.1: Presentación de datos en pantalla

LENGUAJE ENSAMBLADOR PRÁCTICA 11 PRÁCTICA 11 CUATRO OPERACIONES FUNDAMENTALES EN NÚMEROS DE 8 BYTES

Examen de teoría (5 puntos)

8.4. El software en los μprocesadores

Tema 6. Gestión dinámica de memoria

Pregunta correcta= 0,3 Pregunta no contestada= 0 Pregunta incorrecta (tipo test)= -0,15

Curso de Programación en C. Licenciatura, FCQeI. APUNTADORES.

Iniciación del mouse El servicio utilizado es el 00, este servicio inicializa el controlador del mouse como sigue:

USO DE MEMORIA Y PERIFÉRICOS CON EMU8086. Kervin Sánchez Herrera.

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

UNIDAD 3 Modularidad

Paso de parámetros. Universidad Europea de Madrid. Todos los derechos reservados.

A. La estructura del código fuente será la siguiente: copie y pegue la información mediante la computadora

APUNTES DE LENGUAJE ENSAMBLADOR. Lenguaje ensamblador

Tema 5. Presentación de datos por pantalla

Tema 1. Programación modular. Programación Avanzada Ingeniería Técnica en Informática de Gestión Jorge Badenas

RELACIÓN DE PROBLEMAS DE LÓGICA PROGRAMADA (TEMA 4)

1.1 Tipos de Datos Primitivos. 1.2 Tipos de datos estructurados. 1.3 Definición de estructura de datos

Arquitectura de Computadoras

Diferentes Perspectivas de un Ordenador

Pila / Convención C / Interacción C-ASM. Ejercicios. Pila. Organización del Computador II. 21 de marzo de 2017

Transcripción:

Unidad 3 Interfaz del ensamblador con el lenguaje C SISTEMAS BASADOS EN MICROPROCESADORES Grado en Ingeniería Informática EPS - UAM

Índice 3. Interfaz del ensamblador con el lenguaje C. 3.1. Características generales. 3.2. El ejemplo del lenguaje C. 3.3. Los distintos modelos del lenguaje C. parámetros, devolución de resultados.

3.1. Características generales Muchas aplicaciones escritas en lenguajes de alto nivel requieren partes críticas escritas en ensamblador (ejecución en tiempo real, uso de instrucciones multimedia tipo MMX, etc.) Implica poder llamar desde programas escritos en lenguajes de alto nivel compilables a rutinas escritas en ensamblador. También es posible llamar desde programas escritos en ensamblador a rutinas escritas en lenguajes de alto nivel compilables. Factible si programas de ensamblador siguen las convenciones (nomenclatura, paso de parámetros y resultados, ) de los lenguajes de alto nivel.

3.2. El ejemplo del lenguaje C (I) La mayoría de aplicaciones que requieren interactuar con ensamblador escritas en lenguaje C (y C++). El lenguaje C tiene construcciones típicas de alto nivel (bucles, tipos estructurados, recursividad, ), pero también permite un control a muy bajo nivel (acceso a puertos de E/S, manipulación de bits, ). Los compiladores de C permiten el enlace con programas escritos en ensamblador sólo si siguen las mismas convenciones aplicadas por el compilador. Programa en C se compila a código objeto, programa en ensamblador se ensambla a código objeto y montador (linker) del compilador de C genera el ejecutable enlazando esos ficheros objeto.

3.2. El ejemplo del lenguaje C (II) Convenciones del lenguaje C relacionadas con: Uso de direcciones cortas (near) o largas (far) para acceder a datos (variables) y/o procedimentos: modelo de memoria. Nomenclatura de segmentos, variables y procedimientos. Paso de parámetros a procedimientos y devolución de resultados.

3.3. Los distintos modelos del lenguaje C (I) Cuando se compila un programa en C se debe escoger un modelo de memoria. Cada modelo determina la ubicación en memoria de los segmentos lógicos (código, datos y pila) y si se usan direcciones cortas o largas para acceder a ellos. Seis modelos de memoria en Turbo C: TINY SMALL MEDIUM COMPACT LARGE HUGE

3.3. Los distintos modelos del lenguaje C (II) TINY Mínima ocupación de memoria. Los cuatro registros de segmento (CS, SS, DS y ES) son idénticos. El programa ocupa hasta 64 KB. Código, datos y pila en el mismo segmento físico. Programas compilados en este modelo pueden convertirse a.com (drivers) mediante la utilidad EXE2BIN de DOS o usando la opción /t del montador. Punteros cortos (near) para código y datos. SMALL Programas pequeños en los que no es necesario mínima ocupación de memoria. Un segmento físico para código (hasta 64 KB) y otro para datos y pila (hasta 64 KB). Punteros cortos (near) para código y datos.

3.3. Los distintos modelos del lenguaje C (III) MEDIUM Programas grandes que usan pocos datos. Varios segmentos físicos para código (hasta 1 MB) y uno para datos y pila (hasta 64 KB). Punteros largos (far) para código y cortos (near) para datos. COMPACT Programas pequeños que usan muchos datos. Un segmento físico para código (hasta 64 KB) y varios para datos y pila (hasta 1 MB). Punteros cortos (near) para código y largos (far) para datos. LARGE Programas grandes que usan muchos datos. Varios segmentos físicos para código (hasta 1 MB) y para datos y pila (hasta 1 MB). En total no puede superarse 1MB. Punteros largos (far) para código y datos.

3.3. Los distintos modelos del lenguaje C (IV) HUGE Similar al LARGE con algunas ventajas y desventajas. Punteros normalizados (offset < 16). Variables globales estáticas pueden superar 64 KB (posible manipular bloques de datos de más de 64 KB). Compilador inserta código que actualiza automáticamente registros de segmento de datos (punteros a datos siempre normalizados). Modelo más costoso en tiempo de ejecución.

3.3. Los distintos modelos del lenguaje C (V) Modelo Segmentos Punteros Código Datos Pila Código Datos Tiny 64 KB NEAR NEAR Small 64 KB 64 KB NEAR NEAR Medium 1 MB 64 KB FAR NEAR Compact 64 KB 1 MB NEAR FAR Large 1 MB 1 MB FAR FAR Huge 1 MB 1 MB (bloques de más de 64 KB) FAR FAR

parámetros, devolución de resultados (I) Nomenclatura El compilador de C siempre nombra de igual forma los segmentos lógicos que utiliza: El segmento de código se llama _TEXT. El segmento _DATA contiene las variables globales inicializadas. El segmento _BSS contiene las variables globales NO inicializadas. El segmento de pila lo define e inicializa el compilador de C en la función main. En los modelos pequeños de datos (tiny, small y medium), todos los segmentos de datos están agrupados con el nombre DGROUP: DGROUP GROUP _DATA, _BSS

parámetros, devolución de resultados (II) Nomenclatura El compilador de C añade un _ delante de todos los nombres de variables y procedimientos: Ejemplo: int a = 12345; char b = A ; char c[] = ''Hola mundo''; int d = 12; Se compila como: _DATA SEGMENT WORD PUBLIC DATA PUBLIC _a, _b, _c, _d _a DW 12345 _b DB A _c DB ''Hola mundo'', 0 _d DW 12 _DATA ENDS

parámetros, devolución de resultados (III) Nomenclatura El compilador de C añade un _ delante de todos los nombres de variables y procedimientos: Ejemplo: main() { } funcion(); Se compila como: _TEXT SEGMENT BYTE PUBLIC CODE _main PROC FAR CALL _funcion RET _main ENDP _TEXT ENDS

parámetros, devolución de resultados (IV) Nomenclatura Las variables y procedimientos de ensamblador que sean accedidos desde programas en C deben llevar un _ por delante que no aparece en C. El lenguaje C distingue entre mayúsculas y minúsculas: funcion() y FUNCION() son procedimientos distintos. Es necesario que el ensamblador también distinga entre mayúsculas y minúsculas. En TASM se consigue ensamblando con las opciones /mx (fuerza distinción para símbolos públicos) o /ml (fuerza distinción para todos los símbolos).

parámetros, devolución de resultados (V) Paso de parámetros En lenguaje C, un procedimiento que llama a otro apila sus parámetros antes de ejecutar el CALL. Los procedimientos de ensamblador que llamen a funciones de C también han de apilar sus parámetros. Los parámetros se apilan en orden inverso a como aparecen en la llamada de C: empezando por el último y acabando por el primero. Tras retornar de la subrutina, se extraen de la pila los parámetros sumando al registro SP el tamaño en bytes de los parámetros. Los parámetros de un byte (char) se apilan con dos bytes (el más significativo vale 0).

parámetros, devolución de resultados (VI) Paso de parámetros Los parámetros se apilan en formato little endian: palabra menos significativa en dirección menor y byte menos significativo en dirección menor. Para pasar por parámetro punteros a funciones o a datos, es necesario saber en qué modelo de memoria se está compilando el programa en C, para apilar el registro de segmento (modelo largo) o no apilarlo (modelo corto).

parámetros, devolución de resultados (VII) Paso de parámetros (ejemplo) Prototipo de la función: void funcion ( char, long int, void * ); Llamada en modelo largo (punteros FAR para datos y código) funcion ( P, 0x23, &v ); 50 48 46 44 42 40 38 SEG v OFFSET v

parámetros, devolución de resultados (VIII) Paso de parámetros (ejemplo) Prototipo de la función: void funcion ( char, long int, void * ); Llamada en modelo largo (punteros FAR para datos y código) funcion ( P, 0x23, &v ); 50 48 46 44 42 40 38 SEG v OFFSET v 23h

parámetros, devolución de resultados (IX) Paso de parámetros (ejemplo) Prototipo de la función: void funcion ( char, long int, void * ); Llamada en modelo largo (punteros FAR para datos y código) funcion ( P, 0x23, &v ); 50 48 46 44 42 40 38 SEG v OFFSET v 23h 50h

parámetros, devolución de resultados (X) Paso de parámetros (ejemplo) Prototipo de la función: void funcion ( char, long int, void * ); Llamada en modelo largo (punteros FAR para datos y código) funcion ( P, 0x23, &v ); call _funcion 50 48 46 44 42 40 38 SEG v OFFSET v 23h 50h SEG @retorno OFFSET @retorno

parámetros, devolución de resultados (XI) Paso de parámetros (ejemplo) void funcion ( char, long int, void * ); funcion ( P, 0x23, &v ); mov ax, SEG _v push ax mov ax, OFFSET _v push ax mov ax, 00 push ax mov ax, 0023h push ax mov ax, 0050h push ax call _funcion add sp, 10 SP = 52 SP = 48 SP = 44 SP = 42 SP = 42 SP = 52 50 48 46 44 42 40 38 SEG v OFFSET v 23h 50h SEG @retorno OFFSET @retorno

parámetros, devolución de resultados (XII) Acceso a parámetros (ejemplo) void funcion ( char, long int, void * ); _funcion PROC FAR push bp mov bp, sp bx := OFFSET v es := SEG v 50 48 SEG v OFFSET v les bx, [ bp + 12 ] mov dx, [ bp + 10 ] mov ax, [ bp + 8 ] mov cx, [ bp + 6 ] ret _funcion ENDP 46 44 42 40 23h 50h SEG @retorno 38 OFFSET @retorno SP = BP 36 BP inicial

parámetros, devolución de resultados (XIII) Devolución de resultados Las variables de retorno de una función con una longitud de 16 bits se devuelven al procedimiento llamante en AX y las de 32 bits en DX:AX.

parámetros, devolución de resultados (XIV) Ejemplo 1 /* Variable visible (externa) desde la rutina de ensamblador */ int variable_c; /* Variable definida como pública en ensamblador */ extern int dato_as; /* Declaración de la función de ensamblador (podría estar en un include) */ int funcion ( int a, char far *p, char b ) ; main() { int a = 123; /* Declaración de variables locales de C */ char b = 'F'; char far *p; /* Llama a la función y guarda en variable_c el valor devuelto en AX */ variable_c = funcion ( a, p, b ); }

parámetros, devolución de resultados (XV) DGROUP GROUP _DATA, _BSS ; Se agrupan segmentos de datos en uno _DATA SEGMENT WORD PUBLIC DATA ; Segmento de datos público PUBLIC _dato_as ; Declaración de _dato_as como público _dato_as DW 0 ; Reserva de _dato_as e inicialización _DATA ENDS _BSS SEGMENT WORD PUBLIC BSS EXTRN _variable_c : WORD ; Segmento de datos público ; Declaración de _variable_c como externa y de ; tipo WORD (definida en el módulo C) _sin_as DW? ; Variable no accesible por el módulo C _BSS ENDS _TEXT SEGMENT BYTE PUBLIC CODE ; Definición del segmento de código ASSUME CS:_TEXT, DS:DGROUP, SS:DGROUP PUBLIC _funcion ; Hace accesible a funcion desde C _funcion PROC NEAR ; En C es funcion () PUSH BP ; Para poder utilizar BP para direccionar la pila MOV BP, SP ; se carga con puntero a cima de pila MOV BX, [ BP+4 ] ; Guarda a en BX, BX=123 LDS SI, [ BP+6 ] ; Guarda p en DS:SI MOV CX, [ BP+10 ] ; Guarda b en CX, CL='F', CH =0... MOV AX, CX ; Como función es int el valor se devuelve en AX POP BP ; Restaura BP RET ; Retorna a procedimiento llamante _funcion ENDP _TEXT ENDS END

parámetros, devolución de resultados (XVI) Ejemplo 2 char * strchr (char *string, int caracter); datos SEGMENT micadena DB ''Esto es una cadena ASCIIZ'', 0 datos ENDS codigo SEGMENT mov ax,'a' /* Se apila carácter buscado */ push ax mov ax, SEG micadena /* Se apila cadena de caracteres */ push ax mov ax, OFFSET micadena push ax call FAR _strchr /* Llamada al procedimiento */ add sp, 6 /* Equilibrado de la pila */ mov ds, dx /* Puntero retornado en DX:AX */ mov si, ax codigo ENDS

parámetros, devolución de resultados (XVII) Definición de variables locales Las rutinas de C definen las variables locales que necesitan en la pila, por encima de BP. Se introducen en mismo orden en que están declaradas. Se acceden mediante [BP-2], [BP-4],. BP [BP-2] [BP-4] 46 44 42 40 38 36 34 32 Parámetros SEG @retorno OFFSET @retorno BP inicial Variables locales

parámetros, devolución de resultados (XVIII) La instrucción asm permite insertar ensamblador en el programa en C (ensamblador inline). main { mult: final: int d1 = 5, d2 = 4, resultado; asm { push cx push ax mov ax, 0 mov cx, d2 cmp cx, 0 jz final } asm { add ax, d1 dec cx jnz mult mov resultado, ax pop ax pop cx } printf ( resultado %d\n'', resultado); } No se debe usar BP, ya que lo utiliza el compilador para acceder a las variables locales.