2012-01-26 9 views
1

現在、私はバッファ内のすべての単一バイトを(ファイルから読み込み)ループし、それらのどれかが空白であるかどうかを比較し、それらをSTDOUTに書き込もうとしています。なんらかの理由でプログラムはコンパイルされて正常に動作しますが、出力はゼロになります。バイト以上のNASMループ

section .data 
    bufsize dw  1024 

section .bss 
    buf  resb 1024 
section .text 
    global _start 

_start: 
    ; open the file provided form cli in read mode 
    mov edi, 0 
    pop ebx 
    pop ebx 
    pop ebx 
    mov eax, 5 
    mov ecx, 0 
    int 80h 
    ; write the contents in to the buffer 'buf' 
    mov  eax, 3 
    mov  ebx, eax 
    mov  ecx, buf 
    mov  edx, bufsize 
    int  80h 

    ; write the value at buf+edi to STDOUT 
    mov  eax, 4 
    mov  ebx, 1 
    mov  ecx, [buf+edi] 
    mov  edx, 1 
    int  80h 
    ; if not equal to whitespace, jump to the loop 
    cmp byte [buf+edi], 0x20 
    jne loop 

loop: 
    ; increment the loop counter 
    add  edi, 1 
    mov  eax, 4 
    mov  ebx, 1 
    mov  ecx, [buf+edi] 
    int  80h 
    ; compare the value at buf+edi with the HEX for whitespace 
    cmp byte [buf+edi], 0x20 
    jne loop 

; exit the program 
mov eax, 1 
mov ebx, 0 
int 80h 
+3

0x20は「空白」ではなく、文字通り単に*スペース*、つまり空白のサブセットです。しかしこれはおそらくニットピッキングです。 :) – unwind

+1

愚かな質問ですが、あなたのファイルに '0x20'がいくつかあるのでしょうか? – cha0site

+1

これは32ビットLinuxですか、それともBSDですか? –

答えて

1

主な問題は、私はループがいくつかの問題があったも、BUFSIZEのアドレス([bufsize])を与えられていなかったということでした。

ここには固定バージョンがあります。ありがとうございました。

section .data 
    bufsize dd  1024 

section .bss 
    buf:  resb 1024 
section .text 
    global _start 

_start: 
    ; open the file provided form cli in read mode 
    mov edi, 0 
    pop ebx 
    pop ebx 
    pop ebx 
    mov eax, 5 
    mov ecx, 0 
    int 80h 
    ; write the contents in to the buffer 'buf' 
    mov  eax, 3 
    mov  ebx, eax 
    mov  ecx, buf 
    mov  edx, [bufsize] 
    int  80h 

    ; write the value at buf+edi to STDOUT 
    ; if equal to whitespace, done 
loop: 
    cmp byte [buf+edi], 0x20 
    je done 
    mov  eax, 4 
    mov  ebx, 1 
    lea  ecx, [buf+edi] 
    mov  edx, 1 
    int  80h 
    ; increment the loop counter 
    add  edi, 1 
    jmp loop 
done: 
; exit the program 
mov eax, 1 
mov ebx, 0 
int 80h 
+1

まだバグがあります。たとえば、 "bufsize dw"は16ビット値を作成しますが、32ビット値として読み取ります。それを "bufsize dd"または "movzx edx、word [bufsize]"に変更する必要があります。エラー処理もありません(たとえば、 "open()"が失敗した場合)?また、個々の文字ごとにカーネルを呼び出すのではなく、 "puts()"または "write()"を出力に使用したいと思っています。 – Brendan

+0

有効なポイントは、ありがとうございます。エラー処理以外のあなたの提案に対応するようにコードを変更しました。 –

関連する問題