fork download
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char **argv)
  4. {
  5. // Criando variáveis para interagir com assembly:
  6. int foo, bar, var;
  7.  
  8. // O código abaixo mudará o valor de foo usando assembly.
  9. // NOTA: A sintaxe assembly depende do compilador.
  10. // No caso do GCC, usa-se o estilo AT&T por padrão,
  11. // mas é possível usar o estilo Intel também.
  12.  
  13. // Exemplo 1:
  14. // Em C, seria:
  15. // foo = 1;
  16. // bar = 2;
  17. // var = 3;
  18. asm volatile ("movl $1, %0;" // código assembly
  19. "movl $2, %1;"
  20. "movl $3, %2;"
  21. : "=g" (foo), "=g" (bar), "=g" (var) // variáveis de saída
  22. );
  23.  
  24. printf("EXEMPLO 1:\nfoo = %d\nbar = %d\nvar = %d\n\n", foo, bar, var);
  25.  
  26. // Exemplo 2:
  27. // Em C, seria:
  28. // bar = foo * 2;
  29. asm volatile ("movl $2, %%eax;" // eax = 2
  30. "imul %%ebx, %%eax;" // eax * ebx
  31. "movl %%eax, %0;" // faz bar igual ao resultado.
  32. : "=r" (bar) // variáveis de saída
  33. : "b" (foo) // variáveis de entrada (ebx = foo)
  34. );
  35.  
  36. printf("EXEMPLO 2:\nbar = %d \n\n", bar);
  37.  
  38. // Exemplo 3:
  39. // Em C, seria:
  40. // var = bar;
  41. asm volatile ("movl %0, %%eax;"
  42. "movl %%eax, %1;"
  43. : "=r" (var)
  44. : "b" (bar)
  45. : "%eax"
  46. );
  47.  
  48. printf("EXEMPLO 3:\nvar = %d \n\n", var);
  49.  
  50. return 0;
  51. }
  52.  
Success #stdin #stdout 0s 2008KB
stdin
Standard input is empty
stdout
EXEMPLO 1:
foo = 1
bar = 2
var = 3

EXEMPLO 2:
bar = 2 

EXEMPLO 3:
var = 2