2016-04-07 22 views
0

Ich versuche, Eingabe von Benutzer in x68-64 Nasm-Code zu akzeptieren. Wenn ich 16 Bytes akzeptiere (zB. 0000000000000001) wie viel Speicher sollte für Variable reserviert werden?Akzeptieren von Eingabe von Benutzer mit Makro

SECTION .bss 
    number resb 16 ;16 or 17(16+enter key)? 

    %macro read 2 ;is it correct SECTION for defining macro? 
    mov rax,00h 
    mov rdi,00h ;unsigned int fd. what is correct value for fd? 
    mov rsi,%1 
    mov rdi,%2 
    syscall 
    %endmacro 

SECTION .text 
    read number,16 ;16 should be passed as length or 17 considering enter key? 
+0

... Warum schreiben Sie das in Assembler? Nur zum Spaß? – zwol

+0

@zwol versucht, Grundlagen der Montage zu verstehen – daemon7osh

Antwort

2

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 ioctls. 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.)

+0

, die eine Menge erklärt. und was ist mit dem Eingabetaste drücken. Wann sollte man darüber nachdenken? Beim Reservieren oder Aufrufen von Makros? – daemon7osh

+1

@Deadpool: Wenn der Benutzer Enter drückt, wird '\ n''auf der Tastatur angezeigt. Du brauchst deine "Lese" -Rufe, um sie aufzuessen. Der Puffer muss groß genug sein, * und * der 'Größe' arg to' read (2) 'muss groß genug sein. –

Verwandte Themen