Wie hängen Assemblersprachen von Betriebssystemen ab?

8

Da eine Assemblersprache eine symbolische Darstellung von CPU-Anweisungen implementiert, die unabhängig von Betriebssystemen sind, während Assembler immer unter einem bestimmten Betriebssystem laufen, habe ich mich gefragt, wie Assemblersprachen von Betriebssystemen abhängen? Sind zum Beispiel Assemblersprachen für die gleiche CPU mit unterschiedlichen Betriebssystemen identisch? Danke!

    
Tim 28.07.2011, 12:59
quelle

7 Antworten

11

Wie andere darauf hingewiesen haben, sind Systemaufrufe und Interrupts unterschiedlich. Ich kann mir noch ein paar Unterschiede vorstellen.

Der Befehlssatz ist für alle Betriebssysteme auf einem bestimmten Prozessor gleich, aber das ausführbare Dateiformat ist möglicherweise nicht identisch. Auf dem x86 verwendet Windows beispielsweise das PE-Format, Linux ELF und MacOS Mach-O. Das bedeutet, dass Assembler auf diesen Plattformen ihre Ausgaben in diesen Formaten produzieren müssen, was ein Unterschied ist.

Entsprechend könnte die Aufrufkonvention auch für verschiedene Betriebssysteme unterschiedlich sein. Das spielt wahrscheinlich nur eine Rolle, wenn Sie Assembler-Code schreiben, der von kompilierten Code-Routinen aufgerufen wird oder aufgerufen wird, oder vielleicht, wenn Sie Inline-Assembler in einem kompilierten Code schreiben. Die Aufrufkonvention bestimmt, welche Register während eines Funktionsaufrufs für welche Zwecke verwendet werden, so dass unterschiedliche Konventionen eine unterschiedliche Verwendung von Registern durch Aufruf und aufgerufenen Code erfordern. Sie legen auch Beschränkungen für die Position des Stapelzeigers und verschiedene andere Dinge fest. In der Vergangenheit waren Aufrufkonventionen in vielen Fällen ein seltenes Beispiel für Konsistenz zwischen Betriebssystemen: Ich glaube, dass die Windows- und UNIX-Aufrufkonventionen auf dem x86 identisch sind (und alle auf der ehrwürdigen UNIX System V ABI-Spezifikation basieren), und sind auf Betriebssystemen auf den meisten anderen Architekturen konsistent. Die Konventionen unterscheiden sich jetzt jedoch zwischen Windows und UNIX auf dem x86_64.

Außerdem kann es Unterschiede in der von der Assemblersprache verwendeten Syntax geben. Wiederum auf dem x86 verwendeten die Windows- und Linux-Assembler unterschiedliche Syntax, wobei der Windows-Assembler eine von Intel erfundene Syntax und der Linux-Assembler (eigentlich der GNU-Assembler) eine von AT & amp; T erfundene traditionelle UNIX-Syntax verwendete. Diese Syntaxen beschreiben den gleichen Befehlssatz, sind aber anders geschrieben. Heutzutage kann der GNU-Assembler auch die Intel-Syntax verstehen, so dass es weniger Unterschiede gibt.

    
Tom Anderson 28.07.2011, 13:17
quelle
4

Die verfügbaren Anweisungen (und natürlich die Semantik jeder Anweisung) hängen von der CPU ab, nicht vom Betriebssystem - also haben Sie in gewisser Weise Recht.

Aber Für die meisten Aufgaben von Interesse (zB E / A) müssen Sie mit dem Betriebssystem sprechen (Systemaufrufe tätigen). Plattformübergreifende Abstraktionen über diese Dinge gibt es auf dieser Ebene nicht (naja, Sie könnten versuchen, beispielsweise libc zu verwenden, aber selbst dann müssen Sie die verwendete Aufrufkonvention kennen, die sich unterscheiden kann zwischen Plattformen usw. - am Ende müßtest du ziemlich viel Arbeit in den Aufbau einer solchen Abstraktion investieren, so dass AFAIK nur wenige der wenigen Leute, die in Assembly programmieren, versuchen, etwas zu tun, was mit dem ( OS-unabhängige) CPU-Anweisungen, Sie müssen wissen, für welches Betriebssystem Sie programmieren und wie Sie es diesem Betriebssystem mitteilen.

Dies gilt nicht so stark für Inline-Assemblercode in z.B. C-Code, wie er meist verwendet wird, um rein CPU-gebundene Berechnungen in einer intelligenteren / schnelleren Weise durchzuführen, als der Compiler erwartet.)

    
delnan 28.07.2011 13:07
quelle
3

Assemblersprachen sind nicht von einem OS abhängig, sondern vom Befehlssatz der CPU.

Nur wenn Sie API-Funktionen aufrufen (wie zum Beispiel eine Windows-API-Funktion aus Inline-Assembler-Code in MSVC), erhalten Sie eine Betriebssystemabhängigkeit.

    
Thorsten Dittmar 28.07.2011 13:06
quelle
2

Die Assemblersprache sollte identisch sein; Wie Sie bemerken, hängt der Befehlssatz nur von der CPU und ihrer Architektur ab. Wo ich anfange, mit verschiedenen Betriebssystemen in Schwierigkeiten zu geraten, glaube ich, wenn Sie z. Interrupts (typischerweise für I / O), was definitiv Programme bedeuten kann, die z.B. MSDOS wird nicht mit z.B. Solaris (vielleicht ein schlechtes Beispiel).

    
Patrick87 28.07.2011 13:06
quelle
2

Ein Assembler übersetzt Mnemonics (z. B. jump , mov , add usw.) von einer Assemblersprache in Maschinenanweisungen. Maschinenanweisungen sind vollständig von der Hardware abhängig (sie stellen den Hardware- / CPU-Befehlssatz dar).

Wenn Sie jemals eine Assemblersprache entwickeln wollten, müssten Sie auch einen Assembler entwerfen / schreiben, der das Mapping für Maschinenbefehle übernimmt. In diesem Sinne sollte der Assembler, wenn Sie auf eine bestimmte Rechnerarchitektur abzielen, maschinenspezifischen Code, nicht OS-spezifischen Code, erzeugen. Die Assemblerimplementierung kann jedoch (und im Allgemeinen ist ) für das jeweilige Betriebssystem OS-spezifisch sein (eine Unix-Programmdatei ist sogar nicht die gleiche wie eine Windows-Programmdatei) obwohl der zugrunde liegende Maschinenbefehlssatz beispielsweise x86 ist).

Siehe hier , was ich meine.

    
octy 28.07.2011 13:20
quelle
2

Assemblersprache hat nichts damit zu tun, Sie können Ihre Frage (wie xyz Sprache von Betriebssystemen abhängt) und C, Pascal, Ada, Fortran und eine lange Liste von anderen Sprachen verwenden und stellen Sie die gleiche Frage mit der Gleiche Antwort, die Sprache hat damit nichts zu tun. Die Systemaufrufe in das Betriebssystem unter Verwendung der Aufrufkonvention für das Betriebssystem sind wichtig, IF Sie verwenden die gleiche Sprache oder eine Sprache mit der gleichen Aufrufkonvention wie die Betriebssystemdefinition, die Leben macht einfacher, aber sperrt dich nicht in irgendetwas ein. so ziemlich jede Sprache kann verwendet werden, wie Sie wahrscheinlich gut wissen, die Standards C, C ++, etc sowie die virtuelle oder Laufzeit interpretiert, etc Java, Perl, Python, Shell-Skript, Javascript, etc. Sie scheinen alle auf meinem laufen Computer zumindest. Irgendwo (sprachspezifisch) ist ein Shim, der das System auf eine vom Betriebssystem definierte Weise in das Betriebssystem aufruft. Asm macht das Leben für einige dieser Sprachen einfacher, da Sie an keine Regeln gebunden sind, die Sie asm verwenden können, um die Übereinstimmung zwischen der Sprachaufrufkonvention und dem gewünschten Betriebssystemanruf zu erreichen. Die Verwendung von asm vereinfacht die Anbindung an jede Aufrufkonvention, egal ob Sprache definiert oder Betriebssystem definiert ist.

Auch die bereits beantwortete Assemblersprache ist unabhängig vom Betriebssystem oder einer anderen auf der CPU laufenden Software. Es ist direkt an den Befehlssatz der CPU gebunden. Jetzt gibt es den Maschinencode, die tatsächlichen Bits, die vom Prozessor ausgeführt werden, diese ändern sich nicht, aber die ASCII-Dateien, die diese Anweisungen darstellen, können diese Sprache ändern, aber nicht wegen der CPU oder des Betriebssystems, diese Unterschiede müssen gemacht werden mit der Werkzeugkette. Zum Beispiel x86 Att Syntax vs Intel Syntax. Gleicher Befehlssatz, gleicher Maschinencode, andere Assemblersprache. und wenn man sich genug tasm, masm usw. ansieht, gibt es viele Assembler für x86 und jeder hat seine eigenen Direktiven und andere toolchain-spezifische Nuancen.

    
old_timer 28.07.2011 15:30
quelle
1

Das Betriebssystem spielt keine Rolle. Sie könnten den gleichen Assembler auf verschiedenen Betriebssystemen verwenden, Sie können verschiedene Compiler für dasselbe Betriebssystem verwenden, hey, Sie können sogar kompilieren und auf unterschiedliche Systeme abzielen.

    
Karoly Horvath 28.07.2011 13:06
quelle

Tags und Links