Software">
Práctica 4. - EC - ExtensionesMultimedia - II
Práctica 4. - EC - ExtensionesMultimedia - II
Práctica 4. - EC - ExtensionesMultimedia - II
COMPUTADORES
PRÁCTICA 4:
“Extensiones Multimedia”
asm(“Instrucción ensamblador”);
Lo que haya dentro de la llamada a asm será colocado tal cual en la salida de ensamblador que
genera el compilador de C. Esta salida será enviada al ensamblador.
Esta forma de programar es útil para realizar operaciones que no se puede en C o cuyo
rendimiento se quiere mejorar, pero hay que tener cuidado en no modificar registros de la CPU
que está utilizando C porque puede provocarse que el programa deje de funcionar
adecuadamente. Todo aquello que se modifique o use en ensamblador debe dejarse tal como
estaba antes de volver a C.
Se va a utilizar el compilador de C gcc/g++, el cual es gratuito, muy utilizado, y fácil de instalar.
Este compilador permite la inclusión de sentencias asm y también de instrucciones MMX, pero en
lugar de utilizar la sintaxis Intel (la vista en teoría), utiliza la AT&T (UNIX), con lo cual se han de
tener en cuenta una serie de cambios:
• Nombre de los registros: el nombre de los registros vendrá precedido por el carácter '%'.
Por ejemplo, para referenciar el registro mm0 se haría:
AT&T Intel
%mm0 mm0
AT&T Intel
movq %mm1,%mm0 movq mm0, mm1
• Los valores constantes o inmediatos deber ser precedidos por el carácter '$'.
• Las variables de C embebidas en una instrucción en ensamblador, deben ir precedidas por
guión bajo '_' si el compilador es de 32 bits (no aplicable a 64 bits). Utilización de una
variable de C desde ensamblador (deben utilizarse variables globales o estáticas):
AT&T Intel
64 bits movq %mm0, Resultado movq [Resultado], mm0
32 bits movq %mm0, _Resultado movq [_Resultado], mm0
AT&T Intel
(%eax) [eax]
#include <stdio.h>
#include <stdint.h>
__int64 Resultado;
printf("Resultado=%016llx", Resultado);
return 0;
}
Otro ejemplo para la introducción de datos en un registro MMX directamente a través de una
variable inicializada de C (preste atención a los tipos de datos y a los sufijos “LL” y “ll”):
#include <stdio.h>
#include <stdint.h>
return 0;
}
#include <stdio.h>
#include <stdint.h>
__int64 Resultado;
printf("Resultado=%016llx", Resultado);
return 0;
}
Una vez esté claro el funcionamiento del entorno con las instrucciones
MMX, pase al siguiente apartado.