Sie meinen 16 Bytes, keine Bits.
Sie machen einen Makro read(2)
zu nennen. Details dazu finden Sie auf der Manpage. Es liest nur Bytes aus einem Dateideskriptor. Wenn der Dateideskriptor im kanonischen Modus (nicht im Raw-Modus) mit normalen Terminaleinstellungen ein tty ist, wird er liniengepuffert. d.h. der Systemaufruf blockiert bis zu einer neuen Zeile oder EOF (ctrl-d). Oder bis etwas vorzeitig unterbrochen wird und -EINTR
zurückgegeben wird, da Sie es direkt aufrufen, anstatt die Glibc-Wrapperfunktion zu verwenden, die unterbrochene Systemaufrufe für Sie wiederholt.
Siehe stty(1)
und termios(3)
für die übliche Standard-Bibliothek Wrapper oben auf der entsprechenden tty ioctl
s. TL: DR: Alles andere als gekochte Eingabe ist wirklich kompliziert. Sie sehen also keine "Enter-Taste", Sie sehen nur Zeilenumbrüche.
Es ist wichtig zu beachten, dass, wenn es mehr Eingabe gibt als in den Puffer passt read(2)
übergeben, liest es nur genügend Bytes, um den Puffer zu füllen, und der Rest steht noch aus. Sie werden nicht verworfen, so dass ein weiterer read
Anruf sie bekommt, nicht der Anfang der nächsten Zeile.
stdin wird immer Descriptor Null in POSIX-Datei, so rdi=0
korrekt ist.
Der 3. arg (Größe) geht in rdx
, obwohl. Sie setzen es in rdi
, die wahrscheinlich Ihre read(2)
Anruf Rückkehr mit -EBADF
machen, da Ihr Prozess ist unwahrscheinlich, dass irgendetwas auf fd geöffnet haben 16
Führen Sie Ihr Programm unter strace
, um zu sehen, was passiert. (strace ./a.out
)
Machen Sie Ihre Puffer so groß wie die längste Zeile Sie Ihr Programm wollen in einem Rutsch akzeptieren. Auf einem interaktiven Gerät wird read(2)
nach einer neuen Zeile zurückgegeben, es sei denn, das System ist so stark ausgelastet, dass Ihr Prozess nicht geweckt wird, bis bereits eine zweite neue Zeile eingegeben wurde. (z. B. als Teil einer großen Paste.)
... Warum schreiben Sie das in Assembler? Nur zum Spaß? – zwol
@zwol versucht, Grundlagen der Montage zu verstehen – daemon7osh