Software">
Nothing Special   »   [go: up one dir, main page]

Práctica 4. - EC - ExtensionesMultimedia - II

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 8

ESTRUCTURA DE

COMPUTADORES

PRÁCTICA 4:

“Extensiones Multimedia”

Estructura de Computadores – Práctica 4. Extensiones multimedia 1


 ASPECTOS TRATADOS: Extensiones Multimedia: MMX.

 MATERIAL NECESARIO: Ordenador con acceso a Internet.

 CONCEPTOS NECESARIOS: Instrucciones en ensamblador MMX.

 DURACIÓN ESTIMADA: 60’

 DESCRIPCIÓN: En esta práctica se aprenderá a ejecutar programas


MMX dentro de un programa en C, interactuando con variables de este
lenguaje, para mejorar la comprensión y utilización de las instrucciones
MMX, así como para conocer las particularidades de un entorno de trabajo
y los cambios a realizar sobre los programas vistos en teoría. Se puede
usar lo aprendido en esta práctica para solucionar los problemas de
instrucciones MMX propuestos en la asignatura.

Estructura de Computadores – Práctica 4. Extensiones multimedia 2


 DESCRIPCIÓN:

La forma de programar en ensamblador dentro de un programa en C es muy simple, se tiene que


usar la sentencia:

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

• Orden de los operandos Destino/Fuente. En el formato AT&T el fuente está a la izquierda,


y el destino a la derecha, mientras que en Intel, es al revés. Por ejemplo, la instrucción
movq mm0, mm1, se escribiría:

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

• Acceso a los datos referenciados por un puntero:

AT&T Intel
(%eax) [eax]

Estructura de Computadores – Práctica 4. Extensiones multimedia 3


 Por ejemplo, el siguiente fragmento de código MMX:

pandn mm0, mm0


movq mm1, mm0
movq _Resultado, mm1

donde Resultado es una variable declarada en C, se escribiría en un entorno de


programación que use gcc (incluyendo sentencias para visualizar los resultados adecuadamente):

#include <stdio.h>
#include <stdint.h>

__int64 Resultado;

int main(int argc, char *argv[])


{
asm("pandn %mm0, %mm0");
asm("movq %mm0, %mm1");
asm("movq %mm1, _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>

__int64 Dato = 0x0010203040506070LL, Resultado;

int main(int argc, char *argv[])


{
asm("movq _Dato, %mm1");
asm("movq %mm1, _Resultado");
printf("Resultado=%016llx", Resultado);

return 0;
}

Estructura de Computadores – Práctica 4. Extensiones multimedia 4


Y la introducción de datos desde un vector se puede realizar tal como se ilustra a continuación
(notad que los datos se almacenan en orden opuesto al de escritura en el caso de un vector):

#include <stdio.h>
#include <stdint.h>

__int64 Resultado;

unsigned char Vector[8]={0x00, 0x10, 0x20, 0x30, 0x40,


0x50, 0x60, 0x70};

int main(int argc, char *argv[])


{
asm("movq _Vector, %mm1");
asm("movq %mm1, _Resultado");

printf("Resultado=%016llx", Resultado);

return 0;
}

Estructura de Computadores – Práctica 4. Extensiones multimedia 5


 PASOS:

1) Utilice el entorno de trabajo CodeLite usado en la práctica anterior. En


caso de no encontrarse disponible, repita los pasos de instalación allí
descritos.
2) Cree un nuevo Workspace en C++, llamado Practica (No usar acentos
en los nombres o el programa no funcionará). Añada un nuevo proyecto a
este Workspace del tipo Console, Simple executable (g++) llamado MMX1.
Compruebe que se genera el fichero main.cpp, y que compila y ejecuta
correctamente. En caso contrario, repita los pasos anteriores.
3) Copie el código de los tres ejemplos anteriores en la ventana del editor y
ejecútelo para comprobar su funcionamiento. Para ello vaya a la opción
Build y seleccione Build and Run Project Ctrl-F9, o directamente pulse
Ctrl-F9.

Una vez esté claro el funcionamiento del entorno con las instrucciones
MMX, pase al siguiente apartado.

4) En este caso se desea probar el funcionamiento del código incluído a


continuación (donde “...” indica que falta completar):

movq mm1, ...


movq mm2, ...
pxor mm5, mm5
punpcklbw mm1, mm5
punpcklbw mm2, mm5

movq mm3, ...


punpcklbw mm3, mm5
movq mm6, mm3
psrlw mm6, 7
paddw mm3, mm6
pcmpeqw mm4, mm4
psrlw mm4, 15
psllw mm4, 8
psubw mm4, mm3
pmullw mm1, mm3
pmullw mm2, mm4
paddw mm1, mm2
psrlw mm1, 8
packuswb mm1, mm1
movq ..., mm1
emms

5) Introduzca el anterior listado en el entorno de programación en C.

Estructura de Computadores – Práctica 4. Extensiones multimedia 6


6) Se desea que los valores iniciales sean mm1=0x0A1025FF34C297BB, y
mm2=0x000000007F7F7F7F. Realice los cambios necesarios en el
programa en C que contiene el código en ensamblador para que así sea
(Fíjese en los ejemplos mostrados al principio de la práctica).
7) Se desea que el valor inicial del registro mm3 sea
m3=0xFFFFFFFF00000000. Realice los cambios necesarios en el
programa en C que contiene el código en ensamblador para que así sea
(Fíjese en los ejemplos mostrados al principio de la práctica).
8) El resultado del procesamiento MMX debe almacenarse en una variable
de C denominada Pixel. Realice los cambios necesarios en el programa
en C que contiene el código en ensamblador para que así sea (Fíjese en
los ejemplos mostrados al principio de la práctica).
9) Compruebe que una vez completado el programa es posible compilarlo y
ejecutarlo sin errores. De no ser así revise los pasos anteriores para
realizar las oportunas correcciones hasta que el código pueda ser
ejecutado sin problemas.
10) Introduzca las sentencias necesarias en C para mostrar el resultado
del procesamiento MMX en hexadecimal, distinguiendo claramente los
valores que lo componen (Fíjese en los ejemplos mostrados al principio de
la práctica). Anote el resultado a continuación:

11) Introduzca las sentencias necesarias en C para mostrar el resultado


parcial en cada instrucción MMX, en concreto, el valor que queda en el
registro destino después de ejecutarla.
12) Ejecute el programa final y anote todos los resultados parciales
obtenidos:

movq mm1, ...


movq mm2, ...
pxor mm5, mm5
punpcklbw mm1, mm5
punpcklbw mm2, mm5
movq mm3, ...
punpcklbw mm3, mm5
movq mm6, mm3
psrlw mm6, 7

Estructura de Computadores – Práctica 4. Extensiones multimedia 7


paddw mm3, mm6
pcmpeqw mm4, mm4
psrlw mm4, 15
psllw mm4, 8
psubw mm4, mm3
pmullw mm1, mm3
pmullw mm2, mm4
paddw mm1, mm2
psrlw mm1, 8
packuswb mm1, mm1

Estructura de Computadores – Práctica 4. Extensiones multimedia 8

También podría gustarte