Wo bekomme ich eine aktuelle Liste der Syscalls her?



  • Guten Tag,

    ich versuche mich zurzeit in Assembler für mein 64bit Linux-System. Gewissermaßen funktioniert es auch, aber nicht so wie es soll...

    Zurzeit habe ich mich an folgender Liste orientiert: http://syscalls.kernelgrok.com/
    Nach einigen Probieren habe ich folgenden Code erzeugt:

    .global _start
    
    .text
    _start:
        movq $4, %rax
        movq $1, %rdi
        movq $msg, %rsi
        movq $12, %rdx
        syscall
    
        movq $1, %rax
        xor %rdi, %rdi
        syscall
    
    .data
    msg:
        .ascii "Hello World\n"
    

    Laut der syscall-Liste ist write() syscall 4, daher schiebe ich 4 in %rax. stdout ist 1, daher schiebe ich dann in rdi und dann den String und die Länge. Dann am Ende möchte ich exit() aufrufen und schiebe 1 nach %rax und rdi wird genullt. Allerdings gibt das Programm keine Ausgabe.

    Nach einiger Scuhe habe ich folgendes Beispiel gefunden, welches funktioniert:

    .global _start
    
            .text
    _start:
            # write(1, message, 13)
            mov     $1, %rax                # system call 1 is write
            mov     $1, %rdi                # file handle 1 is stdout
            mov     $message, %rsi          # address of string to output
            mov     $13, %rdx               # number of bytes
            syscall                         # invoke operating system to do the write
    
            # exit(0)
            mov     $60, %rax               # system call 60 is exit
            xor     %rdi, %rdi              # we want return code 0
            syscall                         # invoke operating system to exit
    message:
            .ascii  "Hello, world\n"
    

    Warum funktioniert mein Code nicht? Warum verwendet das zweite Beispiel andere syscalls? Was habe ich übersehen? 😕

    Vielen liebe Dank,
    Dudu



  • Die Syscall-Nr unterscheiden sich je nach Architektur.

    Bei mir gibt es "/usr/include/asm/unistd_32.h":

    #define __NR_exit 1
    #define __NR_write 4
    

    und "/usr/include/asm/unistd_64.h":

    #define __NR_write 1
    #define __NR_exit 60
    

    kA ob es da eine elegante Möglichkeit in Asm gibt.



  • Vielen Dank! Vor einem Moment habe ich die Liste auch gefunden. ^^ (Warum muss man immer erst fragen, bevor man die relevanten Sachen findet?)

    Gibt es da eigentlich auch eine Liste/Datei wo drin steht, welche Zahl für stdin, stdout und so stehen?



  • "/usr/include/unistd.h":

    #define STDIN_FILENO    0       /* Standard input.  */
    #define STDOUT_FILENO   1       /* Standard output.  */
    #define STDERR_FILENO   2       /* Standard error output.  */
    


  • Dudu52 schrieb:

    Vielen Dank! Vor einem Moment habe ich die Liste auch gefunden. ^^ (Warum muss man immer erst fragen, bevor man die relevanten Sachen findet?)

    Gibt es da eigentlich auch eine Liste/Datei wo drin steht, welche Zahl für stdin, stdout und so stehen?

    Hier suchte evtl. man stdin.
    ~(Ich hasste Punkte als Abkürzungszeichen, die verwechselt man beim Lesen mit dem Satzzeichen.)
    ~
    "On program startup, the integer file descriptors associated with the streams stdin, stdout, and stderr are 0, 1, and 2, respectively. The preprocessor symbols STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO are defined with these values in <unistd.h>. (Applying freopen(3) to one of these streams can change the file descriptor number associated with the stream.)"



  • volkard schrieb:

    Dudu52 schrieb:

    Vielen Dank! Vor einem Moment habe ich die Liste auch gefunden. ^^ (Warum muss man immer erst fragen, bevor man die relevanten Sachen findet?)

    Gibt es da eigentlich auch eine Liste/Datei wo drin steht, welche Zahl für stdin, stdout und so stehen?

    Hier suchte evtl. man stdin.
    ~(Ich hasste Punkte als Abkürzungszeichen, die verwechselt man beim Lesen mit dem Satzzeichen.)
    ~
    "On program startup, the integer file descriptors associated with the streams stdin, stdout, and stderr are 0, 1, and 2, respectively. The preprocessor symbols STDIN_FILENO, STDOUT_FILENO, and STDERR_FILENO are defined with these values in <unistd.h>. (Applying freopen(3) to one of these streams can change the file descriptor number associated with the stream.)"

    Ouch... Ich habe in der man-page von read geschaut; direkt bei stdin zu schauen bin ich nicht auf die Idee gekommen...

    Danke!




Anmelden zum Antworten