Linux NASM erkennen EOF

Ich versuche zu lernen, die Grundlagen von asm auf linux und ich kann nicht finden, eine sehr gute Referenz. Die NASM docs scheinen davon ausgehen, dass Sie bereits wissen, masm... fand ich keine Beispiele in der Dokumentation der cmp (außerhalb der Intel-instruction-Referenz).

Ich würde ein Programm geschrieben, das liest ein einzelnes byte von stdin und schreibt Sie auf die Standardausgabe. Unten ist meine Modifikation, um zu versuchen, um zu erkennen, EOF auf Standardeingabe und beendet, wenn EOF erreicht ist. Das Problem ist, es nie beendet. Ich habe gerade hält Druck das Letzte Zeichen von stdin Lesen. Das Problem ist entweder in meinem EOF-Erkennung (cmp ecx, EOF) und/oder mein Sprung zu den _exit label ( je _exit ), denke ich.

Was mache ich falsch?

%define EOF     -1

section .bss
        char:   resb    1

section .text
        global  _start

_exit:
        mov     eax,    1       ; exit
        mov     ebx,    0       ; exit status
        int     80h

_start:
        mov     eax,    3       ; sys_read
        mov     ebx,    0       ; stdin
        mov     ecx,    char    ; buffer
        cmp     ecx,    EOF     ; EOF?
        je      _exit
        mov     edx,    1       ; read byte count
        int     80h

        mov     eax,    4       ; sys_write
        mov     ebx,    1       ; stdout
        mov     ecx,    char    ; buffer
        mov     edx,    1       ; write byte count
        int     80h

        jmp     _start

For the sake of sanity, ich habe überprüft EOF -1 ist mit dieser C:

#include <stdio.h>
int main() { printf("%d\n", EOF); }
  • Ich bin nicht vertraut mit NASM, aber ist char einen Zeiger auf ein einzelnes Zeichen? Es sieht aus wie Sie können vergleichen, eine pointer-Adresse des Charakters, um den EOF-Wert. Wenn das der Fall ist, müssen Sie dereferenzieren Sie den Zeiger und dann vergleichen. Die read und write system ruft einen Zeiger auf einen Puffer als argument, nicht einen einzigen Charakter. Auch würde ich umbenennen char auf etwas anderes als ein basic-C-Typ-Namen.
InformationsquelleAutor tMC | 2012-02-23
Schreibe einen Kommentar