Versammlung, Hallo Weltfrage

8

Ich lerne asm unter Linux (noobuntu 10.04) Ich habe den folgenden Code von Ссылка

erhalten %Vor%

Es ist eine einfache Hallo Welt. Läuft unter Linux + ruft den Kernel (scheinbar) direkt auf. Kann mir bitte jemand erklären, was hier wirklich vorgeht? Ich denke, es liest die ganzen Zahlen in der eax & amp; ebx Prozessorregister & amp; ecx, edx data und definiert den Systemaufruf beim Aufruf des Kernels. Wenn ja, definieren verschiedene Ganzzahlkombinationen verschiedene Systemaufrufe, wenn int 0x80 aufgerufen wird?

Ich bin nicht gut mit man-Seiten, aber habe alle verwandten gelesen, die ich finden kann, sagt mir irgendeine man-Seite, welche Kombinationen definieren was syscalls?

JEDE Hilfe wird geschätzt. Eine Zeile für Zeile Erklärung wäre erstaunlich ... -Danke im Voraus Jeremy

    
Jeremy 30.07.2010, 23:47
quelle

3 Antworten

7

Wenn Sie int 0x80 aufrufen, prüft der Kernel den Wert des Registers eax , um die Funktion zu bestimmen, die Sie aufrufen möchten (dies ist die "syscall number"). Abhängig von dieser Zahl werden die restlichen Register als spezifische Dinge interpretiert. Der Aufruf sys_write erwartet, dass die Register wie folgt eingerichtet werden:

  • eax enthält 4
  • ebx enthält den Dateideskriptor
  • ecx enthält die Adresse der zu schreibenden Daten
  • edx enthält die Anzahl der Bytes

Weitere ausführliche Informationen finden Sie unter Linux-Systemaufrufe .

    
Greg Hewgill 30.07.2010 23:58
quelle
2
%Vor%

Dies ist nur Header-Material, der "Text" -Abschnitt eines Assembly-Programms ist nur die Maschinenanweisungen (gegenüber den Daten, schreibgeschützten Daten und BSS-Abschnitten). Die global -Zeile entspricht der Aussage, dass die Funktion _start "public" ist.

%Vor%

Aus den Kommentaren wissen wir, dass wir uns die Funktion sys_write ansehen, so dass wir man 2 write erhalten können, um die Details zu erhalten. Der C-Prototyp enthält die folgenden Parameter: fd , *buf und count . Beginnend mit% ebx sehen wir, dass diese übereinstimmen (% ebx = fd,% ecx = zu schreibende Zeichenfolge und% edx = Länge der Zeichenfolge). Da wir ein Benutzerprozess sind, müssen wir den Kernel bitten, die Ausgabe durchzuführen. Dies geschieht über die SYSCALL-Schnittstelle und die write() -Funktion erhält (anscheinend) die Zahl 4. INT 0x80 ist ein Software-Interrupt, der die SYSCALL-Routine des Linux-Kernels aufruft.

Sie können die tatsächlichen Nummern aller syscalls in den Linux-Header-Dateien finden (vorausgesetzt, Sie haben sie installiert). Auf meinem System habe ich /usr/include/sys/syscall.h zu /usr/include/asm/unistd.h und dann zu /usr/include/asm-i386/unistd.h überprüft. Wo (ich sehe), #define __NR_write 4 .

%Vor%

Wie bei den letzten beiden Zeilen des vorherigen Segments wird nur die syscall-ID geladen und die Software wird unterbrochen, um das Programm zu beenden (Speicherzuordnung und Bereinigung entfernen).

%Vor%

Dies ist der Datenabschnitt, er beschreibt nur Variablen, die wir in unserem Programm verwendet haben.

    
mjschultz 31.07.2010 00:04
quelle
0

Es gibt zu viele Systemaufrufe, um für jede eine andere Anweisung in der Assemblersprache zu haben.

Stattdessen rufen Sie die TRAP-Anweisung auf. Der Wert von eax bestimmt, welcher Systemaufruf aufgerufen wird. Die anderen Register sind die Argumente für den Systemaufruf.

Die Systemaufrufe sind im Kernel aufgelistet.

    
Borealid 31.07.2010 00:00
quelle