2012-02-23 16 views
4

私はLinuxで基本asmを学ぼうとしていますが、私は非常に良いリファレンスを見つけることができません。 NASMのドキュメントは、すでにあなたがmasmを知っていると仮定しているようです... cmp(インテルの命令リファレンス以外)のドキュメントには例が見つかりませんでした。Linux NASMはEOFを検出します

私はstdinから1バイトを読み込んでstdoutに書き込むプログラムを書いていました。以下は、EOFに達したときにstdinとexitでEOFを検出しようとする私の修正です。問題は決して出てこないということです。私はstdinから最後に読み込まれたcharを出力し続けます。問題は、私のEOF検出(cmp ecx, EOF)または_exitラベル(je _exit)へのジャンプです。

私は間違っていますか?正気の便宜上

%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 

、私はEOFが-1このCで検証:

#include <stdio.h> 
int main() { printf("%d\n", EOF); } 
+1

私はNASMに精通していませんが、 'char'は1文字へのポインタですか?文字のポインタアドレスとEOF値を比較しているようです。その場合、ポインタを間接参照して比較する必要があります。 'read'と' write'システムコールは、単一の文字ではなく、引数としてバッファへのポインタをとります。また、 'char'の名前を基本的なCの型名以外の名前に変更します。 –

答えて

6

あなたが代わりに格納された文字のEOF(-1)へのバッファのアドレスを比較しますバッファ

システムコールは、ファイルの終わりに達したときにEOFの値を返しませんが、ゼロを返し、バッファに何も貼り付けません(man 2 read参照)。 、ファイルの終了を識別だけreadの呼び出し後eaxの値を確認するには:あなたが適切にいくつかの値、使用する文字を比較したいなかった場合

section .bss 
    buf: 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, buf ; buffer 
    mov  edx, 1  ; read byte count 
    int  80h 

    cmp  eax, 0 
    je  _exit 

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

    jmp  _start 

:また

cmp byte [buf], VALUE 

、I charbufと改名されました。 charは、基本的なCのデータ型であり、変数名としては不適切です。

+0

私は 'gdb'を使ってプログラムを実行しようとしましたが、' ecx'の内容は決して変わっていないようです。私は一定のままです( '0x80490c0') – tMC

+2

私は何かを実現した後に私の答えを更新しました。しかし、これは正確です。あなたのバッファのアドレスをecxに格納します。この場合、メモリに '0x80490c0'で格納されています。 'sys_read'コールによって読み込まれた値は、そのメモリ位置に格納されます。バッファの内容を変更しても、メモリ内の位置は変わりません。ポインタを逆参照し、別のバイトと比較するには 'cmp byte [buf]、VALUE'を使います。 –

関連する問題