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:51]
alfred
highlevel:c:clinux [2020/05/09 09:25] (actual)
Línea 456: Línea 456:
  
 ===== Otros ===== ===== Otros =====
 +
 +
 +
 +
 +
 +
 +
 +
  
  
Línea 471: 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. 
 +<code c> 
 +void *memcpy( void *dest, const void *src, unsigned int n) 
 +
 +    __asm__("​cld ; rep ; movsb":​ : "​c"​ ((unsigned int) n), "​S"​ (src), "​D"​ (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>​
  
 ===== Herramientas ===== ===== Herramientas =====
 +
 +
  
  
Línea 482: 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.1287931905.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)