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