assembler problem
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
aktuelle verzeichnis
befehl
code
dank
datei
dokument
elf
label
modul
not
pfad
programm
quellcode
setting
stelle
string
symbol
text
verzeichnis
warnung
-
ich habe gerade nasm installiert. wenn ich eine datei übersetzen will gibt das programm folgende meldung aus:
nasm: fatal: unable to open output file `/daniel/dokumente/hello.o'
logischerweise gibt er dann auch keine datei aus. weiss einer woran das liegt und was ich dagegen machen kann?
danke schon im vorraus. -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Mache aus dem Pfad einfach
bzw. wenn "Dokumente" bei dir wirklich kein geschrieben ist/home/daniel/Dokumente/hello.o
/home/daniel/dokumente/hello.o
-
danke! hat funktioniert. das mit dem home wusste ich nicht. hab mir ubuntu erst gestern installiert.
Beitrag zuletzt geändert: 17.5.2011 14:44:36 von phpi -
phpi schrieb:
Wenn du im Nautilus (Dateibrowser) bist, drücke einfach Strg+L, oder wähle "Gehe zu" -> "Ort...", um deine aktuelle Position an zu zeigen. Du kannst sie an dieser Stelle auch ändern und mit der Eingabetaste bestätigen. Genau so gelangst du auch wieder zur normalen Ansicht zurück.
danke! hat funktioniert. das mit dem home wusste ich nicht. hab mir ubuntu erst gestern installiert.
Beitrag zuletzt geändert: 17.5.2011 14:29:48 von drafed-map -
Hallo phpi,
hast Du _start oder _START in Deinem Quelltext geschrieben? Ich habe mal gelesen, dass man Symbole unter Linux (für ld) lieber klein schreiben sollte. Du kannst ja mal versuchen, ob es funktioniert, wenn Du alles klein schreibst. -
phpi schrieb:
ich stelle mich vielleicht etwas sehr dumm an aber wenn ich die datei jetzt mit folgendem befehl linken will: ld -s -o hello /home/daniel/Dokumente/hello.o
bekomme ich schon wieder eine fehlermeldung:
ld: warning: cannot find entry symbol _start; not setting start address
Es ist eine Warnung und kein Fehler! Aber trotzdem solltest du diese Warnung berücksichtigen. (*)
Du hast ganz offensichtlich vergessen ein _start Label zu setzen. Dieses _start Label legt fest, wo das Programm anfangen soll zu arbeiten.
Und wie Darkpandemic bereits richtig angemerkt hat, spielt die Groß- und Kleinschreibung eine wichtige Rolle.
Liest du zufällig Assembly Language Step by Step von Jeff Dunteman?
(*) es kann sinnvoll sein, ein Modul zu linken, auch wenn es kein _start Label hat. Dies nutzt man in der Regel für Module, die in ein anderes Programm eingebunden und von dort aus aufgerufen werden sollen.
Beitrag zuletzt geändert: 17.5.2011 20:45:31 von bladehunter -
ich habe jetzt _start klein geschrieben und es hat funktioniert. aber jetzt lässt sich die datei nicht öffnen. habe auch schon versucht mit c++ ein programm zu schreiben, ließ sich wunderbar übersetzen aber wenn ich es öffnen will passiert nichts.
Beitrag zuletzt geändert: 17.5.2011 21:46:30 von phpi -
hier ist der quellcode. ich habe ihn aus dem internet kopiert, weil ich mal schauen wollte ob das übersetzen klappt.
SECTION .DATA hello: db 'Hello world!',10 helloLen: equ $-hello SECTION .TEXT GLOBAL _start _start: ; Write 'Hello world!' to the screen mov eax,4 ; 'write' system call mov ebx,1 ; file descriptor 1 = screen mov ecx,hello ; string to write mov edx,helloLen ; length of string to write int 80h ; call the kernel ; Terminate program mov eax,1 ; 'exit' system call mov ebx,0 ; exit with error code 0 int 80h ; call the kernel
übersetzt hab ich mit
nasm -f elf /home/daniel/dokumente/hello.asm
ld -s -o hello /home/daniel/hello.o
Beitrag zuletzt geändert: 18.5.2011 19:31:27 von phpi -
Hallo phpi,
der Quellcode sieht soweit richtig aus. Evtl. kannst Du noch die "Linux-Konvention" einhalten und SECTION .DATA und SECTION .TEXT auch noch klein schreiben (aber das ist wohl eher unwichtig).
Nachdem Du neu auf Linux bist vermute ich bei Dir eher ein Anfänger-Problem.
Ich gehe mal davon aus, dass Du das Kompilieren und Linken in einem Terminal machst, von daher schreibe ich jetzt mal die wichtigsten Schritte auf:
Wenn Du das Terminal öffnest, dann solltest Du ungefähr sowas sehen:
Die Schlange (~) steht für Dein Heimatverzeichnis, also /home/daniel. Falls Du nicht im Heimatverzeichnis bist, dann kannst Du über den Befehl 'pwd' anzeigen lassen wo Du gerade bist:daniel@MeinPinguin:~$ ^ ^ ^--- Aktuelles Verzeichnis | '--------------- Rechnername '---------------------- Benutzername
Wenn Du in ein Verzeichnis wechseln willst, dann kannst Du das mit dem Befehl 'cd' machen:daniel@MeinPinguin:~$ pwd /ich/bin/hier/irgendwo
Wenn Du einfach nur 'cd' schreibst, dann wird automatich in Dein Heimatverzeichnis gewechselt und mit 'cd ..' kommst Du ein Verzeichnis höher.daniel@MeinPinguin:~$ cd /home/daniel/dokumente
Zum Kompilieren und ausführen sollte es bei Dir dann so funktionieren:
Zum ausführen musst Du ./ (Punkt, Vorwärtsschrägstrich) vor den Programmnamen schreiben, da Linux ausführbare Programme nur im Pfad sucht und da ist das aktuelle Verzeichnis meistens nicht drin, weshalb er dann nur sagt, dass er das Programm nicht findet. Der '.' ist eine Kurzschreibweise für das aktuelle Verzeichnis, d.h. in obigen Beispiel ist .=/home/daniel.daniel@MeinPinguin:irgendwo$ cd daniel@MeinPinguin:~$ nasm -f elf hello.asm daniel@MeinPinguin:~$ ld -s -o hello hello.o daniel@MeinPinguin:~$ ./hello Hello world! daniel@MeinPinguin:~$
Falls Du versucht hast, dass Programm aus einem Dateimanager heraus per Klick zu starten, dann kann es so aussehen, als ob nichts passiert, da unter Linux nicht automatisch ein Terminal-Fenster geöffnet wird.
Edit: Fette Schrift.
Beitrag zuletzt geändert: 18.5.2011 21:27:42 von darkpandemic -
danke! ich hab gedacht es geht wie unter windows durch anklicken der datei.
Beitrag zuletzt geändert: 18.5.2011 21:25:49 von phpi -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage