PDF de programación - Gcc Inline Assembly - How to

Imágen de pdf Gcc Inline Assembly - How to

Gcc Inline Assembly - How tográfica de visualizaciones

Actualizado el 28 de Julio del 2017 (Publicado el 14 de Enero del 2017)
1.777 visualizaciones desde el 14 de Enero del 2017
125,2 KB
10 paginas
Creado hace 20a (20/10/2003)
Gcc Inline Assembly - How to

Martin Candurra (astor) disponible en hackemate.com.ar
[email protected]
Lunes, 20 de Octubre de 2003, a las 14:46:00 ART

Con este humilde artículo espero facilitar la comprensión del Inline Assembly en Gcc. Si bien existen varios
documentos escritos sobre el tema (incluido el manual oficial de Gcc) espero lograr un enfoque diferente con
este texto. Mi parte está cumplida si alguien, leyendo este artículo, logra mezclar lenguaje C y ensamblador con
facilidad.

Contents

1 Introducción

1.1 Que es y para que sirve el inline assembly ? . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.2 Por qué otro texto de Inline Assembly ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.3 Requisitos básicos

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.4 Aclaración

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1.5 Copyright y reproducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 Inline Assembly

2.1 Ejemplo muy simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.2 Otro ejemplo sencillo

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3 Ejemplos más útiles

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3 Extended Inline Assembly

3.1

Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.2 Ejemplo 1

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.3 Ejemplo 2

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.4 Modificadores

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.5 Ejemplo 3

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.6 Ejemplo 4

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.7 Modificador ”r”

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.8 Clobber List

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4 Varios

4.1 Modificadores ’\n’ y ’\t’
4.2 Que es volatile ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5 Comentario final

2

2

2

2

2

3

3

3

4

4

5

5

5

6

6

6

7

7

8

9

9

9

10

1.

Introducción

6 Contacto

1 Introducción

2

10

1.1 Que es y para que sirve el inline assembly ?

Existen muchos casos donde debemos utilizar en nuestro código (en lenguaje C) un poco de assembly debido a
que queremos optimizar algunas lineas un poco más ”a mano”, o sencillamente necesitamos usar instrucciones
las cuales no poseen ningún tipo de función o macro asociada en C(por ejemplo LGDT, LTR, IRET, etc).Es
en estos casos en los cuales es necesario recurrir al inline assembly (o ensamblado en linea). Esta herramienta
que nos brinda el Gcc no sólo es muy útil, si no que después de acostumbrarse a su utilización termina siendo
realmente cómoda

1.2 Por qué otro texto de Inline Assembly ?

Por la simple razón que cuando necesite aprender inline assembly considero me costo más de lo que hubiera
querido. No encontre la cantidad de ejemplos que me hubiera gustado, y sentí que esos textos estaban a otro
nivel.

Desde ya que con este humilde texto no pretendo brindar más inforción de la queda el manual de Gcc, si
no que intentaré ser lo mas claro posible, utilizando ejemplos sencillos, que cualquier novato entendería. Al
igual que a varios conocidos que tengo, me costo bastante entender ese típico ejemplo de la multiplicación
de números via Inline Assembly que aprovecha la arquitectura super-escalar del microprocesador Pentium.
Imaginense, mientras buscaba la palabra clobber en el diccionario, intentaba interpretar porque ese ”leal”
con todos sus agregados tomaba solo 1 ciclo de máquina. (Para los que no sepan de que estoy hablando, no
tienen más que ir a otro how to de inline assembly para entenderme :-). Tengan en cuenta que la información
que aqui se brinda es básica es decir, en caso de necesitar algo mas avanzado, deberán recurrir al manual de
Stallman.

1.3 Requisitos básicos

Para que este documento puede serle útil usted necesitará

• Contar con el Gnu Compiler Collection (gcc)
• Experiencia programando en Lenguaje C y Assembly
• Conocimientos básicos de sintaxis AT& T

1.4 Aclaración

Tanto en el manual de GCC como en otros documentos van a encontrar una diferenciación entre el Inline
Assembly y lo denominado ”Extended” Inline Assembly. El primero es utilizado para insertar código assembly
sin que este utilice variables o macros del código escrito en C. En cambio, el ”extended” nos brinda la
posibilidad de poner en registros, o utilizar en instrucciones del microprocesador valores que se encuentran
en variables, o viceversa. Este texto se concentra en el ”extended inline assembly” ya que es donde la mayoría
de nosotros nos chocamos un poco al comenzar. Vale también aclarar que todos los ejemplos aquí mostrados
son aptos sólo para la arquitectura IA32 (386 o superior).

2.

Inline Assembly

3

1.5 Copyright y reproducción

Este documento pertenece a Martin Candurra (astor) . Puede ser copiado o reproducido en forma total o
parcial, lo único que pido es que se mantenga el copyright del autor, y que se me informe de la utilización,
con el fin de que pueda ver el contexto en el que es usado y la utilidad que le encontraron. (A fin de motivar
mi Ego y la escritura de otro How to).

2 Inline Assembly

2.1 Ejemplo muy simple

Como coloco una instrucción de ”no operation” dentro de mi código ?

int main (void)
{

__asm__ ("nop");

}

Procedemos a compilar utilizando el modificador -S, el cual le dice a gcc que compile pero no linkee, dejan-
donos como resultado un fuente en assembly (sintaxis AT& T). Es decir, ejecutamos gcc -S ejemplo1.c
con lo que obtendríamos un ejemplo1.s conteniendo algo similar a esto:

.file
.section .text

"ejemplo1.c"

.globl _main
_main:

%ebp
%esp, %ebp
$8, %esp
$-16, %esp
$0, %eax
%eax, %esp

pushl
movl
subl
andl
movl
subl

nop

/APP

/NO_APP

leave
ret
.ident "GCC: (GNU) 3.2.3"

De donde salio todo ese código si lo único que escribí fue un ”nop” ? Es aquí donde eran necesarios los
conocimientos de assembly :-) . Por el momento basta con que sepas que las funciones en C reciben sus
argumentos a través del stack, y es en ese mismo lugar donde ”viven” las variables locales. Si bien nuestro
”main” no recibe argumentos ni define variables locales, el Gcc arma la estructura como si las usara. Es
entre las lineas /APP y /NO APP que aparece nuestro código.

NOTA: Estas líneas fueron compiladas utilizando el DIGPP El código de salida puede variar ligeramente
dependiendo del compilador.

2.

Inline Assembly

4

2.2 Otro ejemplo sencillo

Veamos otro ejemplo simple para los que aún se sientan confundidos:

int main(void)
{

__asm__ ("movl $0xdead, %eax");

}

Luego de ejecutar gcc -S ejemplo2.c obtenemos:

.file
.section .text

"ejemplo2.c"

.globl _main
_main:

pushl
movl
subl
andl
movl
subl

%ebp
%esp, %ebp
$8, %esp
$-16, %esp
$0, %eax
%eax, %esp

movl $0xdead, %eax

/APP

/NO_APP

leave
ret
.ident "GCC: (GNU) 3.2.3"

NOTA: es necesario colocar antes de los datos inmediatos el operando ”$” para que el gcc lo intérprete
correctamente, mientras que a los registros debe anteponerse un ”%”. Como verán el inline assembly básico
no representa gran utilidad, excepto en algunos casos como los que se describen a continuación.

2.3 Ejemplos más útiles

Ahora

__asm__ ("sti");

El cual habilita las interrupciones enmascarables del microprocesador. Es bastante comun encontrarse con
alguna de las siguientes definiciones:

#define enable()

__asm__ __volatile__ ("sti")

o

#define sti()

__asm__ __volatile__ ("sti")

las cuales son visualmente mas agradables que su contraparte utilizando inline assembly.

Veamos algún otro ejemplo útil del inline assembly común:

3. Extended Inline Assembly

5

__asm__ __volatile__ ("pushf ; cli");

.
.

código crítico

.
.

__asm__ __volatile__ ("popf");

En este caso no hacemos mas que bloquear las interrupciones para un fragmento de código crítico, el cuál
no puede ser interrumpido. El uso del PUSHF y POPF en lugar de un simple CLI y STI me aseguran que
las interrupciones al finalizar mi código quedarán en el estado que estaban antes de que yo las deshabilite.

3 Extended Inline Assembly

3.1 Introducción

Con lo que vimos anteriormente no logramos ningún tipo de interacción con los operadores definidos por
el resto del código. Es esta versión ”extendida” la que nos permitirá pasar valores inmediatos a registros,
cargar registros con el contenido de variables, cargar variables con el contenido de registros, etc.

La sintaxis genérica es:

__asm__ ( "instrucciones" : lista_salida : lista_entrada : lista_destruida);

Donde:

lista salida(o output list): contiene los registros, variables donde se guardara un dato.

lista entrada (o input list): contiene los registros, variables o datos inmediatos que se utilizaran como entradas
en una instrucción.

lista destruida (o clobber list): contiene los registros que se ven modificados por las ”instrucciones”. Esta
lista es necesaria para que el gcc sepa que registros debe utilizar, cuales debera resguardar, etc.

Si bien esto puede parecer un poco confuso, espero ir evacuando las dudas a través de ejemplos.

3.2 Ejemplo 1

int main(void)
{

int i=100;
__asm__ ("movl %0, %%eax" : : "g" (i));

}

En ese fragmento lo que hacemos no es más que cargar el valor de i en el registro eax. Nótese que al utilizarse
la versión ”extendida” es necesario agregar otro operador ”%” a los registros (
  • Links de descarga
http://lwp-l.com/pdf1340

Comentarios de: Gcc Inline Assembly - How to (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad