11
votes

Est-il possible d'accéder aux registres 32 bits en C?

est-il possible d'accéder aux registres 32 bits en C? Si c'est le cas, comment? Et sinon, alors y a-t-il un moyen d'intégrer le code de montage en C? Je suis à l'aide du compilateur Mingw, au fait. Merci d'avance!


2 commentaires

Dites-nous plus sur vos besoins: Pourquoi voudriez-vous accéder aux registres de la CPU ???


Vous pouvez indiquer indirectement et définir les registres sur Windows à l'aide de GetThreadContext et son frère SetthreadContext, sans aucune ASM nécessaire: msdn.microsoft.com/en-us/library/ms679362%28vs.85%29.aspx


7 Réponses :


1
votes

Vous pouvez incorporer l'assemblage en C

http://fr.wikipedia.org/wiki/ Inline_assembler p>

Exemple de Wikipedia P>

extern int errno; p>

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;
}


0 commentaires

0
votes

Je ne pense pas que vous puissiez les faire directement. Vous peut faire l'assemblage en ligne avec code comme: xxx


0 commentaires

0
votes

Si vous êtes sur un processeur 32 bits et à l'aide d'un compilateur adéquat, alors oui. Le moyen exact dépend du système et du compilateur particulier que vous programmez pour et, bien sûr, cela rendra votre code aussi inutilisable que possible.

Dans votre cas avec Mingw, vous devriez consulter GCC Syntaxe de montage en ligne .


1 commentaires

Merci beaucoup pour le lien! Très utile.



-1
votes

Il n'est généralement pas nécessaire d'accéder aux registres de la CPU d'un programme écrit dans une langue de haut niveau: langages de haut niveau, tels que C, Pascal, etc., où l'inventé précisément afin de résumer la machine sous-jacente et de rendre un programme plus indépendante de la machine.

Je soupçonne que vous essayez d'effectuer quelque chose mais que vous n'avez aucune idée de l'utilisation d'un moyen conventionnel de le faire.

Beaucoup d'accès aux registres sont cachés dans des constructions de niveau supérieur ou dans des appels de systèmes ou de bibliothèques qui vous permettent d'éviter de coder la "partie sale". Dites-nous plus sur ce que vous voulez faire et nous pouvons vous suggérer une alternative.


1 commentaires

Nope, je sais vraiment ce que je fais. Mais merci de m'aider. :)



16
votes

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

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


1 commentaires

Merci beaucoup pour les exemples de code. Pièce exacte dont j'avais besoin. ;)



0
votes

Vous pouvez bien sûr. "MINGW" (GCC) permet (d'autres compilateurs) Assemblée en ligne, comme d'autres réponses montrent déjà. Quelle assemblée dépend de la CPU de votre système (prob. 99,99% qu'il est X86). Cela fait cependant que votre programme ne soit pas portable sur d'autres processeurs (pas si mal si vous savez ce que vous faites et pourquoi).

La page pertinente parle d'assemblage pour GCC est ici et ici , et si vous le souhaitez, aussi ici . N'oubliez pas que cela ne peut pas être spécifique car il est dépendant de l'architecture (GCC peut compiler pour plusieurs processeurs)


0 commentaires

7
votes

quels registres voulez-vous accéder?

registres à usage général strong> ne peut normalement pas être accessible à partir de C. Vous pouvez déclarer des variables d'enregistrement dans une fonction, mais cela ne spécifie pas quels registres spécifiques sont utilisé. En outre, la plupart des compilateurs ignorent le mot-clé Enregistrement et optimisent automatiquement l'utilisation du registre. P>

dans des systèmes embarqués, il est souvent nécessaire d'accéder à des registres périphériques forts> (tels que les minuteries, les contrôleurs DMA, I / O broches). Ces registres sont généralement mappés de la mémoire, de sorte qu'elles peuvent être accessibles à partir de ... p>

En définissant un pointeur: p> xxx pré>

ou en utilisant avant Processeur: P>

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


1 commentaires

Comment pouvez-vous obtenir ce numéro 0x00000178?