Question

Est-il possible d'accéder à des registres 32 bits en C? Le cas échéant, comment? Et sinon, est-il possible d'inclure du code C dans l'Assemblée? I`m en utilisant le compilateur MinGW, par la manière. Merci à l'avance!

Était-ce utile?

La solution

Si vous voulez lire que le registre, vous pouvez simplement:

register int ecx asm("ecx");

De toute évidence, il est lié à l'instanciation.

Une autre possibilité est d'utiliser l'assembleur en ligne. Par exemple:

asm("movl %%ecx, %0;" : "=r" (value) : );

stocke la valeur de ecx dans la value variable. Je l'ai déjà posté une réponse similaire ici .

Autres conseils

Quels registres voulez-vous accès?

registres à usage général ne peut normalement pas être accessible à partir C. Vous pouvez déclarer enregistrer les variables dans une fonction, mais ne précise pas quels registres spécifiques sont utilisés. En outre, la plupart des compilateurs ignorent le mot-clé de registre et d'optimiser automatiquement l'utilisation du registre.

Dans les systèmes embarqués, il est souvent nécessaire d'accéder registres périphérique (comme des minuteries, des contrôleurs DMA, des broches I / O). Ces registres sont généralement mémoire mappée, de sorte qu'ils sont accessibles à partir de C ...

en définissant un pointeur:

volatile unsigned int *control_register_ptr = (unsigned int*) 0x00000178;

ou en utilisant pré-processeur:

#define control_register (*(unsigned int*) 0x00000178)

Ou, vous pouvez utiliser la routine de l'Assemblée.

Pour utiliser Assembleur , il y a (au moins) trois possibilités:

  1. Un fichier séparé source .asm qui est lié au programme. Les routines d'assemblage sont appelés à partir de C comme des fonctions normales. Ceci est probablement la méthode la plus commune et il a l'avantage que les fonctions dépendant de hw sont séparés du code d'application.
  2. Dans l'ensemble en ligne
  3. Fonctions qui Intrinsic exécuter des instructions en langage assembleur individuel. Ceci a l'avantage que l'instruction en langage assembleur peut accéder directement à toutes les variables C.

Vous pouvez intégrer dans l'ensemble C

http://en.wikipedia.org/wiki/Inline_assembler

exemple de wikipedia

extern int errno;

int funcname(int arg1, int *arg2, int arg3)
{
  int res;
  __asm__ volatile(
    "int $0x80"        /* make the request to the OS */
    : "=a" (res)       /* return result in eax ("a") */
      "+b" (arg1),     /* pass arg1 in ebx ("b") */
      "+c" (arg2),     /* pass arg2 in ecx ("c") */
      "+d" (arg3)      /* pass arg3 in edx ("d") */
    : "a"  (128)       /* pass system call number in eax ("a") */
    : "memory", "cc"); /* announce to the compiler that the memory and condition codes have been modified */

  /* The operating system will return a negative value on error;
   * wrappers return -1 on error and set the errno global variable */
  if (-125 <= res && res < 0) {
    errno = -res;
    res   = -1;
  }  
  return res;
}

Je ne pense pas que vous pouvez les faire directement. Vous peut faire l'assembleur en ligne avec le code suivant:

asm (
    "movl $0, %%ebx;"
    "movl $1, %%eax;"
); 

Si vous êtes sur un processeur 32 bits et en utilisant un compilateur adéquat, alors oui. Les moyens exacts dépendent du système particulier et le compilateur vous programmez pour, et bien sûr cela va rendre votre code à peu près aussi que peut être non portable.

Dans votre cas, en utilisant MinGW, vous devriez regarder GCC inline syntaxe ensemble .

Vous pouvez bien sûr. « MinGW » (gcc) permet (comme d'autres compilateurs) l'assembleur en ligne, comme les autres réponses montrent déjà. Cet assemblage, cela dépend de la cpu de votre système (prob. 99,99% qu'il est x86). Cela rend cependant votre programme ne portable sur d'autres processeurs (pas si mal si vous savez ce que vous faites et pourquoi).

La page correspondant à parler de l'assemblage pour gcc est ici , et si vous voulez, aussi ici . Ne pas oublier que ce ne peut pas être spécifique puisqu'il est dépendant de l'architecture (gcc peut compiler pour plusieurs CPUs)

il n'y a généralement pas besoin d'accéder aux registres CPU d'un programme écrit dans un langage de haut niveau: langages de haut niveau, comme C, Pascal, etc. où justement inventé pour faire abstraction de la machine sous-jacente et de rendre un programme plus indépendant de la machine.

Je suppose que vous essayez d'exécuter quelque chose, mais avoir aucune idée de comment utiliser de manière classique pour le faire.

de nombreux accès aux registres sont cachés dans des constructions de niveau supérieur ou dans le système ou les appels bibliothèque qui vous permet d'éviter le codage de la « partie de sale ». nous en dire plus sur ce que vous voulez faire et nous pouvons vous proposer une alternative.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top