Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión

 
Búsqueda Avanzada

15.707 Mensajes en 3.130 Temas- por 371 Usuarios - Último usuario: lasfirrot
Mayo 22, 2012, 07:51:19
Foro de Hispabyte.netProgramaciónLenguajes y Programación (Moderadores: D4MR0D, Snaft_J1)Tema: Ensamblador inline con MMX
Páginas: [1]   Ir Abajo
Imprimir
Autor Tema: Ensamblador inline con MMX  (Leído 920 veces)
0 Usuarios y 1 Visitante están viendo este tema.
svoboda
Global Moderator
Experto
*****
Mensajes: 440



Ver Perfil
« : Enero 15, 2009, 05:50:24 »


Hola a todos. Estoy intentando optimizar un programa en C utilizando código de ensamblador y trabajando con MMX de forma inline. El problema que tengo es que tras escribir el código y compilar tengo varios errores de compilación que no esperaba y no se como solucionar.

A continuación os podré un fragmento de código y los errores. Aparecen varios errores, pero si uno se fija un poco, son casi todos debidos a la misma razón, al mover algo de los registros del tipo "eax", "ebx", "edi", "esi", ... a registros del tipo mmx.

En principio, empleo para ello la instrucción "movl" pero no compila con ella. También he probado "movq" y "movd" con idéntico resultado. A ver si alguien me puede iluminar un poco.

Fragmento de código:

Código:
237       __asm__ ("movl %%ebx, %mm2"); // Movemos la letra a mm2
238       __asm__ ("psrlw %mm2, 1"); // Desplazamos para coger el primer bit
239       __asm__ ("movq %mm2, %mm0");
240       __asm__ ("movl %%esi, %mm1");
241       __asm__ ("pand %mm1, %mm0");
242       __asm__ ("movl %0, %%ecx": : "g" (img.imagen[cont]));
243       __asm__ ("movl %%ecx, %mm1");
244       __asm__ ("movl %%edi, %mm2");
245       __asm__ ("pand %mm2, %mm1");
246       __asm__ ("por %mm1, %mm0");
247       __asm__ ("movl %mm0, %%eax");
248       __asm__ ("movl %%eax, %0": "=g" (img.imagen[cont]));

Errores al compilar: gcc -g -Wall -o a a.c

Código:
a.c: Assembler messages:
a.c:237: Error: bad register name `%%ebx'
a.c:238: Error: suffix or operands invalid for `psrlw'
a.c:240: Error: bad register name `%%esi'
a.c:242: Error: suffix or operands invalid for `mov'
a.c:243: Error: bad register name `%%ecx'
a.c:244: Error: bad register name `%%edi'
a.c:247: Error: bad register name `%%eax'
make: *** [compm] Error 1

Gracias por vuestra ayuda.
En línea
mrcomputer
Asiduo
***
Mensajes: 137


Ver Perfil WWW
« Respuesta #1 : Enero 15, 2009, 07:26:23 »

Hola

Lo que parece es que es un error de compilacion. Lo registros ebx, eax, etc.. son registros de 32 bits(que aunque el procesador no tenga MMX existen ya que se introdujeron con el 386) y el compilador puede que (aunque lo dudo) este configurado solo para registros de 16 bits (ax, bx, cx, dx, etc)

Yo programacion en C con ensamblador lo he hecho alguna vez pero solo con registros de 16 bits, los de 32 bits solo los he usado en ensamblador puro(que compilaban perfectamente con nasm) y es posible que C utilice otra notación para esos registros o necesite gcc algun parametro especial.

Saludos
En línea

Visita mi blog: http://mrcomputer.es
Páginas: [1]   Ir Arriba
Imprimir
Foro de Hispabyte.netProgramaciónLenguajes y Programación (Moderadores: D4MR0D, Snaft_J1)Tema: Ensamblador inline con MMX
Ir a:  


Tema diseñado por RJ-45 para Hispabyte.net basado en el
theme famouspadexx v.09 designed by Formado Comprido
Downloable here. My present to padexx.de