printf()?



  • hi Leute 🙂

    ich lerne grad assembler unter linux mit nasm

    benutzte bissher den int 0x80 mit den syscalls aus unistd.h

    Will jetzt aber mal solche funktionen wie zB printf aufrufen.
    Wie mache ich das? Gehen die parameter über den stack oder über
    die register? Laut gdb hat bei mir printf() die addr 0x8048268

    hier mein erster versuch:

    ; test.asm dies ist nur ein kleiner 
    ; test mit printf
    
    section .data
    
            msg db "Hallo Welt",0x00
    
    section .text
    
    global _start
    
    _start:
    
            mov eax, msg
            push eax
            call 0x8048268
            mov eax, 1
            mov ebx, 0
            int 0x80
    

    Es kommt immer ein Speicherzugriffsfehler 😞

    Kann mir bitte jemand weiterhelfen?

    Gruss 🙂



  • es gibt bios-interrupt die das tun.. anderenfalls einfach selber in den speicher schreiben..
    wo in dem Programm liegt da printf??
    Welches Prog hast du debuggt um das rauszufinden??



  • BIOS-Interrupts unter Linux?
    Zweifelhaft, dass das funktionieren wird...

    Das mit diesem call wird so nicht funktionieren. IMHO muss es auch irgendwelche Kernel-Funktionen geben, um etwas auf den Bildschirm zu schreiben. Das muss ja nicht unbedingt printf-kompatibel sein.

    Schau dir also mal genauer an, was es fuer Funktionen beim int 80h gibt.



  • Ich würd mal sagen, dass du nicht einfach so irgendeine Adresse aufrufen kannst, und hoffen, dass da zufällig printf liegt. Du musst schon mindestens die libc mit einlinken ...



  • Hi vielen dank für eure Antworten 🙂

    Nobuo T schrieb:

    IMHO muss es auch irgendwelche Kernel-Funktionen geben, um etwas auf den Bildschirm zu schreiben. Das muss ja nicht unbedingt printf-kompatibel sein.

    Schau dir also mal genauer an, was es fuer Funktionen beim int 80h gibt.

    Ja stimmt es gibt den int 0x80h der ale aufrufe von unistd.h enthält.
    Diesen hab ich auch für I/o verwendet mit funktionen wie read() und write()
    Siehe hierzu code:

    ; test.asm ist eine Uebung
    
    section .data
            msg db "Dies ist nur ein kleiner Test",0x0A
    
    section .text
    
    global _start
    
    _start:
    
            mov eax, 4                ; write()
            mov ebx, 1                ; stdout
            mov ecx, msg              ; addr von msg
            mov edx, 30               ; lenge von msg
            int 0x80                  ; fuehre aus 
            mov eax, 1
            mov ebx, 0
            int 0x80
    

    Dieser funktioniert perfekt 🙂

    Jedoch war das nicht mein anliegen 😞 Ich will tatsächlich libc functionen
    aufrufen.

    Bashar schrieb:

    Ich würd mal sagen, dass du nicht einfach so irgendeine Adresse aufrufen kannst, und hoffen, dass da zufällig printf liegt. Du musst schon mindestens die libc mit einlinken ...

    Ja danke das wird es wohl sein 🙂
    Da ich kompletter nasm newbe bin kanst du mir sagen, ob ich das irgendwie
    als header einfügen soll, oder erst beim linken mit 'ld' ?

    Gruss 🙂



  • Ich hab es jetzt irgendwie so versucht:

    ; test.asm dies ist nur ein kleiner test mit printf
    
    extern printf
    
    section .data
    
            msg db "Hallo Welt",0x00
    
    section .text
    
    global _start
    
    _start:
    
            mov eax, msg
            push eax
            call printf ;
            mov eax, 1
            mov ebx, 0
            int 0x80
    

    so assembliert

    nasm -f elf test.asm

    und so gelinkt:

    ld -o test test.o -lc

    Doch dan der hässlige output

    $ ./test
    bash: ./test: /usr/lib/libc.so.1: bad ELF interpreter: Datei oder Verzeichnis nicht gefunden

    Was hab ich falsch gemacht? Für Eure Hilfe wäre ich sehr dankbar 🙂


Anmelden zum Antworten