stdin
使用方法とstdout
組み立て方法について理解しやすい 2 つの例を次に示します。
STDIN
あなたは正しかった、入力の長さはレジスタの1つに格納されます:
; read a byte from stdin
mov eax, 3 ; 3 is recognized by the system as meaning "read"
mov ebx, 0 ; read from standard input
mov ecx, name ; address to pass to
mov edx, 1 ; input length (one byte)
int 0x80 ; call the kernel
私の記憶が正しければstdin
、改行はカウントされません。ただし、確認のためにテストする必要があります。
STDOUT
あなたの実装は正しかったですが、私はあなたにコメントを付けてあなたに与えます:
; print a byte to stdout
mov eax, 4 ; the system interprets 4 as "write"
mov ebx, 1 ; standard output (print to terminal)
mov ecx, name ; pointer to the value being passed
mov edx, 1 ; length of output (in bytes)
int 0x80 ; call the kernel
数か月前に行ったコードに戻るのは非常に難しいため、アセンブリで行っていることを最大限コメントすることをお勧めします...
EDIT :
eax レジスタで読み取った文字数を取得できます。
整数値とメモリ アドレスは、EAX レジスタに返されます。
関数はsys_read
読み取った文字数を返すため、この数値はeax
関数の呼び出しの後にあります。
を使用したプログラムの例を次に示しeax
ます。
section .data
nameLen: db 20
section .bss
name: resb 20
section .text
global _start
_exit:
mov eax, 1 ; exit
mov ebx, 0 ; exit status
int 80h
_start:
mov eax, 3 ; 3 is recognized by the system as meaning "read"
mov ebx, 0 ; read from the standard input
mov ecx, name ; address to pass to
mov edx, nameLen ; input length
int 80h
cmp eax, 0 ; compare the returned value of the function with 0
je _exit ; jump to _exit if equal
mov edx, eax ; save the number of bytes read
; it will be passed to the write function
mov eax, 4 ; the system interprets 4 as "write"
mov ebx, 1 ; standard output (print to terminal)
mov ecx, name ; pointer to the value being passed
int 80h
jmp _start ; Infinite loop to continue reading on the standard input
この単純なプログラムは、標準入力で読み取りを続け、結果を標準出力に出力します。