kostenloser Webspace werbefrei: lima-city


assembler problem

lima-cityForumProgrammiersprachenSonstige Programmiersprachen

  1. Autor dieses Themas

    phpi

    phpi hat kostenlosen Webspace.

    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.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Mache aus dem Pfad einfach
    /home/daniel/Dokumente/hello.o
    bzw. wenn "Dokumente" bei dir wirklich kein geschrieben ist
    /home/daniel/dokumente/hello.o
  4. Autor dieses Themas

    phpi

    phpi hat kostenlosen Webspace.

    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
  5. phpi schrieb:
    danke! hat funktioniert. das mit dem home wusste ich nicht. hab mir ubuntu erst gestern installiert.
    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.

    Beitrag zuletzt geändert: 17.5.2011 14:29:48 von drafed-map
  6. Autor dieses Themas

    phpi

    phpi hat kostenlosen Webspace.

    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
  7. 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.
  8. 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
  9. Autor dieses Themas

    phpi

    phpi hat kostenlosen Webspace.

    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
  10. Hallo phpi,

    wenn wir dir helfen sollen, musst du schon mehr Infos herausgeben. Das heißt, du musst mindestens
    -Deinen (Assembler-) Quellcode
    -Die Befehle, mit der du den Quellcode übersetzt hast

    angeben. Schließlich können wir nicht hellsehen, was du da verzapft hast.
  11. Autor dieses Themas

    phpi

    phpi hat kostenlosen Webspace.

    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
  12. 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:
    daniel@MeinPinguin:~$
    ^      ^           ^--- Aktuelles Verzeichnis
    |      '--------------- Rechnername
    '---------------------- Benutzername
    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:~$ pwd
    /ich/bin/hier/irgendwo
    Wenn Du in ein Verzeichnis wechseln willst, dann kannst Du das mit dem Befehl 'cd' machen:
    daniel@MeinPinguin:~$ cd /home/daniel/dokumente
    Wenn Du einfach nur 'cd' schreibst, dann wird automatich in Dein Heimatverzeichnis gewechselt und mit 'cd ..' kommst Du ein Verzeichnis höher.
    Zum Kompilieren und ausführen sollte es bei Dir dann so funktionieren:
    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:~$
    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.
    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
  13. Autor dieses Themas

    phpi

    phpi hat kostenlosen Webspace.

    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
  14. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!