Frage

Ich habe in vielen Orten lesen, die Assembler-Sprache nicht in der Regel erstellen komplette Programme verwendet wird, wird aber von anderen Programmen verwendet, um bestimmte Verfahren effizienter zu gestalten, vor allem diejenigen zu machen, die ein paar tausend Mal pro Sekunde aufgerufen werden. Ich frage mich, wie kleine Stücke von Assembler-Code in größere Programme aufgenommen.

  • Ich dachte, dass ein kleines ausführbar gemacht werden könnte und dann von einem anderen Programm ausführen, aber das scheint ineffizient.

  • Dann dachte ich über die Inline-Assembler für Visual Studio, aber das ist spezifisch für Microsoft, und es scheint, wie wäre es eine bessere Art und Weise sein.

Wie können kleine Stücke von Assembler-Code innerhalb eines größeren Programms verwendet werden, ohne separate Programme zu erstellen oder den Visual Studio-Inline-Assembler mit?

War es hilfreich?

Lösung

Hier ist ein Beispiel (GCC):

__asm__ ("movl %eax, %ebx\n\t"
"movl $56, %esi\n\t"
"movl %ecx, $label(%edx,%ebx,$4)\n\t"
"movb %ah, (%ebx)");

Für Microsoft Inline Assembly, das Schlüsselwort ist __asm, der Assembler-Code in geschweiften Klammern eingewickelt wird, ist es nicht eine Zeichenfolge, und das Zielregister ist nun auf der linken Seite.

Microsoft Beispiel:

int foo(void) {
  __asm{
   mov eax,100 ; Moves 100 into eax!
   leave
   ret
  };
}

Links für weitere Informationen

Inline Montageanleitung und Referenz: http: // www .ibiblio.org / gferg / LDP / GCC-Inline-Assembly-HOWTO.html

IBM-Tutorial, spezifisch für x86: http: // www. ibm.com/developerworks/linux/library/l-ia.html

Andere Tipps

Inline-Montage ist zu Visual Studio nicht spezifisch - GCC es auch unterstützt. Inline-Montage ist in der Regel der einfachste Weg, Montage in ein Programm zu integrieren. Es gibt ein paar Probleme aber - es erheblich die Portabilität des Codes beeinflussen können, und einige Compiler unterstützen es nicht - zum Beispiel Microsofts x64-Compiler nicht unterstützt

.

Für Compiler, die keine Inline-Assembler unterstützt oder wenn Sie alle maschinenspezifischen Code enthalten soll, trennen Sie in der Regel die Assemblersprache bestimmte Teile in ihre eigenen Dateien, Freilegung der Assembler-Code als Funktionen, die Ihr C ++ Code aufrufen können. Sie dann montieren und verbinden sie als Teil des Build. Ihr Linker kümmert sich nicht darum, welche Sprache verwendet wurde, um die Objektdateien zu erzeugen, -. Es Objektdateien aus mehreren Sprachen in ein einziges Programm zusammenstellen kann

  

Dann dachte ich über die Inline-Assembler für Visual Studio, aber das ist spezifisch für Microsoft, und es scheint, wie wäre es eine bessere Art und Weise sein.

Jeder Compiler unterstützt eine Form der Inline-Assembler, wenn auch in der Regel auf leicht unterschiedliche Weise.

Wenn Sie also Inline-Assembler verwenden, wobei jeder Schnipsel in einer kleinen Funktion kapseln. Dann können Sie diese Funktionen ohne viel Aufwand neu implementieren, wenn auf einen anderen Compiler zu portieren.

Für kleine Stückchen Code wie innere Schleifen, wäre es in der Regel mit Inline-Montage erfolgen. Und das ist auf jeden Fall nicht Microsoft spezifisch! (GCC und so ziemlich jeder moderner Compiler unterstützt es auch, wenn auch mit unterschiedlichen Variationen in der Syntax).

Für größere Teile des Codes (zum Beispiel ein Bootloader für ein Betriebssystem), wäre es in der Regel in einer separaten Quelldatei gesetzt werden (wie Sie mehrere Quelldateien mit jeder Sprache verwenden) und dann mit dem Rest verbunden in des Programms mit dem Linker.

Beachten Sie, dass Montag wird meist nur heute für OSs verwendet, weil Compiler jetzt gut genug ist, dass es nicht viel hilft es wie Spiele in Sachen für innere Schleifen zu verwenden (und es ist überhaupt nicht tragbar verschiedene Architekturen ). Es ist vor allem für wirklich niedriges Niveau Sachen wie Hardware-Interrupts und Einrichten Paging (virtueller Speicher).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top