Was stellt sicher, dass das Lesen / Schreiben von Operanden zum gewünschten Zeitpunkt mit erweitertem ASM erfolgt?

Nach GCC'sExtended ASM and Assembler Template, um Anweisungen fortlaufend zu halten, müssen sie sich im selben ASM-Block befinden. Ich habe Probleme zu verstehen, was die Zeitplanung oder das Timing von Lese- und Schreibvorgängen für die Operanden in einem Block mit mehreren Anweisungen bereitstellt.

Als Beispiel,EBX oderRBX muss bei Verwendung von @ erhalten bleibCPUID weil es laut ABI dem Anrufer gehört. Es gibt einige offene Fragen bezüglich der Verwendung vonEBX undRBX, also wollen wir es unbedingt erhalten (es ist eine Voraussetzung). Es müssen also drei Anweisungen in einem einzigen ASM-Block codiert werden, um die Aufeinanderfolge der Anweisungen zu gewährleisten (in Bezug auf die im ersten Absatz diskutierte Assembler-Vorlage):

unsigned int __FUNC = 1, __SUBFUNC = 0;
unsigned int __EAX, __EBX, __ECX, __EDX;

__asm__ __volatile__ (

  "push %ebx;"
  "cpuid;"
  "pop %ebx"
  : "=a"(__EAX), "=b"(__EBX), "=c"(__ECX), "=d"(__EDX)
  : "a"(__FUNC), "c"(__SUBFUNC)

);

Wenn der Ausdruck, der die Operanden darstellt, zum falschen Zeitpunkt interpretiert wird, dann__EBX wird das gespeicherte @ seEBX (und nicht dasCPUID 'sEBX), der wahrscheinlich ein Zeiger auf die globale Versatztabelle (GOT) ist, wenn PIC aktiviert ist.

Wo genau gibt der Ausdruck an, dass der Speicher vonCPUID 's%EBXin__EBX sollte passieren (1) nach demPUSH %EBX; (2) nach demCPUID; aber (3) vor demPOP %EBX?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage