Vinzenz Mai: Zwei Zahlen mit Assembler addieren und ausgeben

Beitrag lesen

Hallo Markus,

Danke, aber mein Verständnisproblem ist hier begründet:

mov edx,len                    ;message length
  mov ecx,msg                    ;message to write
  mov ebx,1                      ;file descriptor (stdout)
  mov eax,sys_write              ;system call number (sys_write)
  int 0x80                       ;call kernel to execute system call

Ich schiebe die Länge nach edx, die Nachricht aber nach ecx, wieso? Warum zwei verschiedene Register, und warum gerade edx und ecx. Warum nicht beispielsweise ebx und ecx?

wie in http://asm.sourceforge.net/intro/hello.html#AEN55 erklärt, wird bei Systemcalls die Nummer des Systemcalls in Register eax geschrieben, die Parameter (solange es 6 oder weniger sind) in die weiteren Register.

man 2 write (ja es ist eine C-Funktion) informiert Dich, dass der Systemaufruf "write" drei Parameter erwartet:

1. Parameter: int fd, den Filedeskriptor
2. Parameter: const char *buf, Zeiger auf die zu schreibenden Daten
3. Parameter: size_t count, Anzahl der Bytes die zu schreiben sind

Schauen wir uns nun den Assembler-Systemcall an:

eax: Systemcall-Nummer (hier die 4 für syswrite)
ebx: 1. Parameter (hier den Filedeskriptor für STDOUT, die Standardausgabe)
ecx: 2. Parameter (die zu schreibenden Daten, Dir ist klar, dass in ein
                   Register nur ein Hinweis darauf passt, wo die Daten
                   stehen - und nicht die Daten selbst)
edx: 3. Parameter (Länge der Daten)

Die Systematik geht daraus doch klar hervor.

Mit den nächsten Zeilen ist meine Verwirrung komplett: Ich schiebe "stdout" nach ebx. Nun stehen 3 verschiedene Dinge in 3 verschiedenen Registern, aber sys_write wird plötzlich wieder nach eax geschoben, also steht nun in allen Registern irgendetwas, so wie ich das sehe.

Woher weiß überhaupt "stdout", dass es den Inhalt von ecx ausgeben muss?

STDOUT weiss gar nichts. Der Systemaufruf weiss somit, dass er nach STDOUT schreiben soll.

Was wäre, wenn ich etwas nach edx schreibe, und diesen Wert ausgeben will?

Das würde nichts bringen, da in edx die Länge der Nachricht erwartet wird und nicht die Nachricht selbst.

Ich verstehe den Zusammenhang zwischen den Registern eigentlich überhaupt nicht und wann ich welches wofür benutzen muss.

Nochmals: Die Systemcalls unter Linux erwarten in eax die Nummer des Systemcalls. Nach dem Aufruf steht in eax das Ergebnis des Systemcalls, der Rückgabewert.

In den weiteren Registern können bis zu 6 Parameter stehen. Bei mehr als 6 Parametern wird es etwas komplizierter :-)

Damit Du weißt, welche Parameter wo erwartet werden, benötigst Du die Dokumentation der Systemcalls, nicht mehr und nicht weniger.

Freundliche Grüße

Vinzenz