Herramientas de usuario

Herramientas del sitio


highlevel:c:clinux

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
highlevel:c:clinux [2010/10/24 14:57]
alfred
highlevel:c:clinux [2020/05/09 09:25] (actual)
Línea 456: Línea 456:
  
 ===== Otros ===== ===== Otros =====
 +
 +
 +
 +
 +
 +
  
  
Línea 473: Línea 479:
 __asm__ ("movl %0, %%eax" : : "​g"​ (i)); __asm__ ("movl %0, %%eax" : : "​g"​ (i));
 </​code>​ </​code>​
-En este caso ''​%0''​ corresponde al valor de entrada ''​i'';​ el acceso al registro ''​eax''​ se hace mediante ''​%%''​ (esto se ha de hacer para cada registro); lo que el código hace es asignar el valor de ''​i''​ (100) a ''​eax''​. \\  +En este caso ''​%0''​ corresponde al valor de entrada ''​i'';​ el acceso al registro ''​eax''​ se hace mediante ''​<​nowiki>​%%</​nowiki>​''​ (esto se ha de hacer para cada registro); lo que el código hace es asignar el valor de ''​i''​ (100) a ''​eax''​. \\  
-La directiva ''"​g"​(i)''​ indica al compilador donde almacenar el parámetro. "​r"​ le permitiría guardar la variable en cualquier registro qeu no esté en uso. "​a"​ en ax\eax, "​b"​ en bx\ebx, "​c"​ en cx\ecx, "​d"​ en dx\edx, ​ "​D"​ en di\edi, "​S"​ en si/esi, etc. +La directiva ''"​g"​(i)''​ indica al compilador donde almacenar el parámetro. "​r"​ le permitiría guardar la variable en cualquier registro qeu no esté en uso. "​a"​ en ax\eax, "​b"​ en bx\ebx, "​c"​ en cx\ecx, "​d"​ en dx\edx, ​ "​D"​ en di\edi, "​S"​ en si/esi, etc.
 <code c> <code c>
 void *memcpy( void *dest, const void *src, unsigned int n) void *memcpy( void *dest, const void *src, unsigned int n)
Línea 481: Línea 487:
     return dest;     return dest;
 } }
 +</​code>​
 +También podemos utilizar la directiva ''​volatile''​ que optimiza el código. ​
 +<code c>
 +int i=0, j=1;
 +__asm__ __volatile__("​ \
 +      pushl %%eax \n \
 +      movl %0, %%eax \n \
 +      addl %1, %%eax \n \
 +      movl %%eax, %0 \n \
 +      popl %%eax "
 +      :
 +      : "​g"​ (i), "​g"​ (j)
 +);
 +</​code>​
 +Para indicar valores constantes utilizaremos ''​$''​ delante del valor. \\ 
 +Las variables de salida han de ser precedidas por ''​=''​.
 +<code c>
 +int i=0, j=1, k=0;
 +__asm__ __volatile__("​ \
 +      pushl %%eax \n \
 +      movl %1, %%eax \n \
 +      addl %2, %%eax \n \
 +      movl %%eax, %0 \n \
 +      popl %%eax"
 +      : "​=g"​ (k)
 +      : "​g"​ (i), "​g"​ (j)
 +);
 +/* k = i + j; */
 +</​code>​
 +Si quisieramos decir que después de la llamada al código ensamblador no se toque el ''​ecx''​ haríamos:
 +<code c>
 +__asm__ __volatile__ ("​..."​ : : : "​ecx"​);​
 +</​code>​
 +Podemos insertar etiquetas locales dentro del ensamblador en línea, la llamada a estas debe terminar por una b o una f según si dicha etiqueta esta después o antes de la instrucción de salto:
 +<code c>
 +__asm__ __volatile__("​
 +      0: \n \
 +      ...
 +      jmp 0b \n \
 +      ...
 +      jmp 1f \n \
 +      ...
 +      1:\n \
 +      ..."
 +);
 </​code>​ </​code>​
  
 ===== Herramientas ===== ===== Herramientas =====
 +
 +
  
  
Línea 492: Línea 545:
   * El parámetro ''​-c''​ hace que no salga un ejecutable sino uno con código objeto.   * El parámetro ''​-c''​ hace que no salga un ejecutable sino uno con código objeto.
   * Para realizar el linkage de librerías estáticas (ficheros .lib) en tu proyecto tendrás que utilizar el parámetro ''​-l''​ seguido del nombre de la librería, pero seguido sin espacios; por ejemplo, tenemos la librería ''​ddraw.lib''​ o ''​gdi32.lib''​ haremos ''​-lddraw''​ o ''​-lgdi32''​.   * Para realizar el linkage de librerías estáticas (ficheros .lib) en tu proyecto tendrás que utilizar el parámetro ''​-l''​ seguido del nombre de la librería, pero seguido sin espacios; por ejemplo, tenemos la librería ''​ddraw.lib''​ o ''​gdi32.lib''​ haremos ''​-lddraw''​ o ''​-lgdi32''​.
 +  * El parámetro ''​-I''​ agrega un directorio de cabeceras (archivos .h): ''​-I/​usr/​X11R6/​include/''​
 +  * El parámetro ''​-s''​ saca el archivo en ensamblador del compilado.
   * http://​iie.fing.edu.uy/​~vagonbar/​gcc-make/​gcc.htm   * http://​iie.fing.edu.uy/​~vagonbar/​gcc-make/​gcc.htm
-  * el parámetro ''​-s''​ saca el archivo en ensamblador del compilado. 
  
 ==== Debug ==== ==== Debug ====
highlevel/c/clinux.1287932227.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)