Detlef G.: Zwei Zahlen mit Assembler addieren und ausgeben

Beitrag lesen

Hallo Markus,

bei mir ist es zwar schon Ewigkeiten her, dass ich Assembler programmiert
habe (außerdem für Dos und nicht für Linux), trotzdem werde ich dir ein paar
Fragen beantworten können. Fangen wir mal zum Schluss an.

Wann muss eigentlich immer der Kernel aufgerufen werden?

Was meinst du, wer dein Programm zur Ausführung in den Speicher lädt, und
wem du auch mitteilen solltest, dass das Programm fertig ist und wieder aus
dem Speicher entfernt werden kann?
Und wer soll es auf dem Bildschirm ausgeben, oder programmierst du auch
selbst die Grafikkarte komplett?

mov edx,len  ;message length
mov ecx,msg  ;message to write

Also die Länge der _Zeichenkette_ in edx, die Adresse der _Zeichenkette_ in
ecx.

mov ebx,1         ;file descriptor (stdout) <- Wozu ist das gut?,

Weil due dem Kernel ja mitteilen musst, wohin er die Zeichen kette ausgeben
soll, hier die Standardausgabe, es gibt sicher auch andere Möglichkeiten.

und warum ebx?

Gehen wir davon aus, dass der Kernel genau dort diese Angabe beim
Interruptaufruf erwartet.

mov eax,4  ;system call number (sys_write) <- Wozu dient das?

Woher soll der Kernel sonst wissen, was du überhaupt von ihm willst, wenn du
ihn anschließend aufrufst.

int 0x80  ;call kernel

section .data
zahl1 db 1000
zahl2 db 1500

Hier fehlt der Speicherplatz, der dann das Ergebnis als Zeichenfolge
aufnehmen kann, damit du sie ausgeben kannst (oder willst du kryptische
Zeichen?)

section .text
global _start

_start:

mov eax, [zahl1]   ;Zahl1 in Accumulator schieben
add eax, [zahl2]   ;Zahl2 dazuaddieren
mov edx, eax       ;Bekomme ich so den Wert aus dem Accumulator?

Wozu willst du den Wert aus dem Akkumulator in edx haben?
ebx erwartet die Länge der Ausgabezeichenkette, du hast aber keine.

mov  ebx,1        ;Ausgabekanal 1? (Warum eigentlich ebx, laut "Hello World"

s. oben

mov eax,1        ;system call number (sys_exit)

Du hast die Adresse der (nichtvorhanden) Zeichenkette noch nicht in ecx
geaschrieben.

int 0x80               ;Kernel benachrichtigen (muss das eigentlich geschehen)

Du sagst also:
Lieber Kernel gib die (nicht vorhandene) Zeichenkentte aus, von der ich dir
zwar die Länge (Ergebnis der Addition) mitgeteilt habe, ohne zu verraten,
wo diese steht.

Das Programm lässt sich zwar problemlos kompilieren und linken, aber es gibt einfach nichts aus.

Wenn es etwas ausgeben würde, dann irgendetwas, dass zufällig in irgendeinem
Speicherbereich steht, aber mit Sicherheit nicht das, was du erwartest.

Auf Wiederlesen
Detlef

--
- Wissen ist gut
- Können ist besser
- aber das Beste und Interessanteste ist der Weg dahin!