dk4ek
01-05-2005, 19:30
Hallo alleseits!
Viele Jahre habe ich mich erfolgreich mit Assemblerprogrammierung unter DOS (Assembler A86/D86) beschäftigt. Nach dem Umstieg von DOS auf Linux (Windows habe ich gleich übersprungen) möchte ich nun auch unter Linux Assemblerprogramme erstellen. Googeln brachte mir schnell den Link
http://www.cce-elmshorn.de/lug/linux/assemb.htm
wo ich auch das Beispielprogramm fand:
section .text
global _start
msg db 'Hello world',0x0A
len equ $ - msg ; Länge des Textes berechnen (12 Bytes)
_start: ; Programmstart für Linker
mov eax,4 ; Systemaufruf Nr. 4 (sys_write) Textausgabe
mov ebx,1 ; Ausgabekanal Nr.1 = stdout
mov ecx,msg ; Adresse unseres Textes im Speicher
mov edx,len ; Länge des Textes in Bytes
int 0x80 ; Kernel aufrufen mit obigen System-Aufrufparametern
mov eax,1 ; Systemaufruf Nr. 1 (sys_exit) Programmende
int 0x80 ; Kernel aufrufen mit obigen System-Aufrufparametern
Das Programm habe ich compiliert mit: nasm -f elf -o hallo.o hallo.asm
und gelinkt mit: ld -o hallo hallo.o
Es läßt sich compilieren und linken, bricht aber beim Aufruf mit einem "Speicherzugriffsfehler" ab.
Ich besitze auch das Buch "Assembler - die Profireferenz" von Oliver Müller. Leider ist das Kapitel zu Linux mit ganzen 7 Seiten mehr als dürftig. Dort steht ein ähnliches Beispiel wie oben, jedoch steht am Programmanfang nicht "section .text", sondern "section .data". Die Direktrive "section .text" steht dort erst vor dem eigentlichen Programanfang. Damit läuft das Programm. Ist ja ganz schön, aber ich wüsste schon gern, warum, damit ich auch selbst Programme (und vielleicht auch Treiber) schreiben kann.
Daher suche ich (bislang vergeblich) eine Anleitung zu den Linux-spezifischen Besonderheiten von Assembler und insbesonders zum nasm. Wer weiß, wo ich fündig werden könnte? Eine Quelle im Internet oder ein Buch, beides wäre mir gleich recht. Ein Stöbern durch bisherige Forenbeiträge brachte auch keinen Erfolg.
Mit Dank im Voraus
Wolfgang Kippels
Viele Jahre habe ich mich erfolgreich mit Assemblerprogrammierung unter DOS (Assembler A86/D86) beschäftigt. Nach dem Umstieg von DOS auf Linux (Windows habe ich gleich übersprungen) möchte ich nun auch unter Linux Assemblerprogramme erstellen. Googeln brachte mir schnell den Link
http://www.cce-elmshorn.de/lug/linux/assemb.htm
wo ich auch das Beispielprogramm fand:
section .text
global _start
msg db 'Hello world',0x0A
len equ $ - msg ; Länge des Textes berechnen (12 Bytes)
_start: ; Programmstart für Linker
mov eax,4 ; Systemaufruf Nr. 4 (sys_write) Textausgabe
mov ebx,1 ; Ausgabekanal Nr.1 = stdout
mov ecx,msg ; Adresse unseres Textes im Speicher
mov edx,len ; Länge des Textes in Bytes
int 0x80 ; Kernel aufrufen mit obigen System-Aufrufparametern
mov eax,1 ; Systemaufruf Nr. 1 (sys_exit) Programmende
int 0x80 ; Kernel aufrufen mit obigen System-Aufrufparametern
Das Programm habe ich compiliert mit: nasm -f elf -o hallo.o hallo.asm
und gelinkt mit: ld -o hallo hallo.o
Es läßt sich compilieren und linken, bricht aber beim Aufruf mit einem "Speicherzugriffsfehler" ab.
Ich besitze auch das Buch "Assembler - die Profireferenz" von Oliver Müller. Leider ist das Kapitel zu Linux mit ganzen 7 Seiten mehr als dürftig. Dort steht ein ähnliches Beispiel wie oben, jedoch steht am Programmanfang nicht "section .text", sondern "section .data". Die Direktrive "section .text" steht dort erst vor dem eigentlichen Programanfang. Damit läuft das Programm. Ist ja ganz schön, aber ich wüsste schon gern, warum, damit ich auch selbst Programme (und vielleicht auch Treiber) schreiben kann.
Daher suche ich (bislang vergeblich) eine Anleitung zu den Linux-spezifischen Besonderheiten von Assembler und insbesonders zum nasm. Wer weiß, wo ich fündig werden könnte? Eine Quelle im Internet oder ein Buch, beides wäre mir gleich recht. Ein Stöbern durch bisherige Forenbeiträge brachte auch keinen Erfolg.
Mit Dank im Voraus
Wolfgang Kippels