PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Assembler-Programmierung z.B. mit nasm



dk4ek
01-05-2005, 18: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

almoeli
02-05-2005, 09:35
Hi,

einen ersten Einstieg findest du auf

http://linuxassembly.org

Im Bereich Tutorials gibts einige Einstiegsanleitungen.

Dort ist auch kurz beschrieben wie du die Teile deines Programmes richtig aufteilst (in .data, .bss uns .text Sektionen), damit du keine Speicherschutzverletzung kriegst. Unter DOS hast du keinen Speicherschutz, deshalb macht man sich da keine Gedanken über sowas.

Grüsse

almoeli

dra
02-05-2005, 10:16
Hi!

Also ich kann dir folgendes (freie) Buch empfehlen: Programming from the Ground Up (http://savannah.nongnu.org/download/pgubook/ProgrammingGroundUp-1-0-booksize.pdf), ist allerdings in Englisch.

Gruß,
dra

dk4ek
04-05-2005, 19:28
Ein herzliches Danke in die Runde! :)

Das ist zwar alles auf Englisch, aber da beiße ich mich durch. Die Tips scheinen auf jeden Fall hilfreich zu sein.

dk4ek

7.e.Q
09-05-2005, 11:07
Ein Programm ist, soweit ich weiß, im System in mehrere Sektionen unterteilt. Dazu gehören auch .data und .text. Die Sektion .text beinhaltet dabei nachher den reinen Programm-Code, die Sektion .data stellt den Datenbereich des Programms dar.

Das Programm hat auf seine eigene .text Sektion keinen Zugriff. Darum bekommst du einen Speicherzugriffsfehler. Da in dem Beispiel aus dem Buch die eigentliche Message (also der Datenblock aus msg db "Hello World",0x0A) in der .data Sektion des Programms abgelegt ist, funktioniert dort der Zugriff auf den Bereich.

Korrigiert mich, wenn ich falsch liege.