Ist es möglich, auf 32-Bit-Register in C zuzugreifen?

8

Ist es möglich, auf 32-Bit-Register in C zuzugreifen? Wenn es ist, wie? Und wenn nicht, gibt es eine Möglichkeit, den Assemblercode in C einzubetten? Ich benutze übrigens den MinGW-Compiler. Vielen Dank im Voraus!

    
C4theWin 11.06.2010, 10:33
quelle

7 Antworten

12

Wenn Sie nur das Register lesen möchten, können Sie einfach:

%Vor%

Offensichtlich ist es an Instanziierung gebunden.

Eine andere Möglichkeit ist die Inline-Montage. Zum Beispiel:

%Vor%

Dies speichert den Wert ecx in der Variablen value . Ich habe bereits eine ähnliche Antwort hier gepostet >.

    
jweyrich 11.06.2010, 10:44
quelle
7

Auf welche Register möchten Sie zugreifen?

Register für allgemeine Zwecke können normalerweise nicht von C aus aufgerufen werden. Sie können Registervariablen in einer Funktion deklarieren, aber sie geben nicht an, welche spezifischen Register verwendet werden. Außerdem ignorieren die meisten Compiler das Schlüsselwort register und optimieren die Registerverwendung automatisch.

In eingebetteten Systemen ist es oft erforderlich, auf Peripherieregister zuzugreifen (wie Timer, DMA-Controller, I / O-Pins). Solche Register sind normalerweise speicherabgebildet, so dass sie von C ...

aus zugänglich sind

durch Definieren eines Zeigers:

%Vor%

oder mit dem Pre-Prozessor:

%Vor%

Oder Sie können die Assembly-Routine verwenden.

Für die Verwendung der Assemblersprache gibt es (mindestens) drei Möglichkeiten:

  1. Eine separate .asm-Quelldatei, die mit dem Programm verknüpft ist. Die Assembly-Routinen werden von C wie normale Funktionen aufgerufen. Dies ist wahrscheinlich die gebräuchlichste Methode und hat den Vorteil, dass hw-abhängige Funktionen vom Anwendungscode getrennt sind.
  2. Inline-Montage
  3. Intrinsische Funktionen, die Anweisungen für individuelle Assemblersprachen ausführen. Dies hat den Vorteil, dass die Assembleranweisung direkt auf beliebige C-Variablen zugreifen kann.
PauliL 11.06.2010 12:19
quelle
1

Sie können Assembly in C einbetten

Ссылка

Beispiel aus Wikipedia

extern int errno;

%Vor%     
Charles Ma 11.06.2010 10:38
quelle
0

Ich glaube nicht, dass Sie sie direkt machen können. Sie können Inline-Assemblierungen mit Code wie:

ausführen %Vor%     
paxdiablo 11.06.2010 10:38
quelle
0

Wenn Sie sich auf einem 32-Bit-Prozessor befinden und einen geeigneten Compiler verwenden, dann ja. Das genaue Mittel hängt von dem jeweiligen System und Compiler ab, für den Sie programmieren, und natürlich wird Ihr Code so unportabel wie möglich sein.

Wenn Sie MinGW verwenden, sollten Sie sich die Inline-Assembler-Syntax von GCC ansehen .

    
Crashworks 11.06.2010 10:39
quelle
0

Sie können natürlich. "MinGW" (gcc) erlaubt (wie andere Compiler) Inline-Assembly, wie andere Antworten bereits zeigen. Welche Assembly, es hängt von der CPU Ihres Systems ab (prob. 99,99%, dass es x86 ist). Dies macht jedoch Ihr Programm nicht auf anderen Prozessoren tragbar (nicht so schlimm, wenn Sie wissen, was Sie tun und warum).

Die relevante Seite, die über Assembly für gcc spricht, ist hier und hier , und wenn Sie möchten, auch hier . Vergessen Sie nicht, dass es nicht spezifisch sein kann, da es architekturabhängig ist (gcc kann für mehrere CPUs kompilieren)

    
ShinTakezou 11.06.2010 11:22
quelle
-2

Es besteht im Allgemeinen keine Notwendigkeit, von einem in einer Hochsprache geschriebenen Programm auf die CPU-Register zuzugreifen: Hochsprachen wie C, Pascal usw. wurden genau erfunden, um die zugrundeliegende Maschine zu abstrahieren und ein Programm zu rendern mehr maschinenunabhängig.

Ich vermute, dass Sie versuchen, etwas zu tun, aber keine Ahnung haben, wie man es konventionell macht.

Viele Zugriffe auf die Register sind in Konstrukten höherer Ebene oder in System- oder Bibliotheksaufrufen verborgen, wodurch Sie vermeiden können, den "Dirty-Part" zu codieren. erzählen Sie uns mehr über das, was Sie tun möchten, und wir schlagen Ihnen vielleicht eine Alternative vor.

    
Adrien Plisson 11.06.2010 10:42
quelle