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 0x8048268hier 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 gefundenWas hab ich falsch gemacht? Für Eure Hilfe wäre ich sehr dankbar