Assembly-programming-assembly-file-management
アセンブリ-ファイル管理
システムは、入力または出力データをバイトストリームと見なします。 3つの標準ファイルストリームがあります-
- 標準入力(stdin)、
- 標準出力(stdout)、および
- 標準エラー(stderr)。
ファイル記述子
- ファイル記述子*は、ファイルにファイルIDとして割り当てられた16ビット整数です。 新しいファイルが作成されるか、既存のファイルが開かれると、ファイルへのアクセスにファイル記述子が使用されます。
標準ファイルストリームのファイル記述子- stdin、stdout および stderr はそれぞれ0、1および2です。
ファイルポインタ
- ファイルポインター*は、ファイル内の後続の読み取り/書き込み操作の場所をバイト単位で指定します。 各ファイルは一連のバイトと見なされます。 開いている各ファイルは、ファイルの先頭を基準にしたバイト単位のオフセットを指定するファイルポインターに関連付けられています。 ファイルが開かれると、ファイルポインターはゼロに設定されます。
ファイル処理システムコール
次の表は、ファイル処理に関連するシステムコールを簡単に説明しています-
%eax | Name | %ebx | %ecx | %edx |
---|---|---|---|---|
2 | sys_fork | struct pt_regs | - | - |
3 | sys_read | unsigned int | char * | size_t |
4 | sys_write | unsigned int | const char* | size_t |
5 | sys_open | const char * | int | int |
6 | sys_close | unsigned int | - | - |
8 | sys_creat | const char* | int | - |
19 | sys_lseek | unsigned int | off_t | unsigned int |
システムコールを使用するために必要な手順は、前に説明したものと同じです-
- システムコール番号をEAXレジスタに入れます。
- システムコールへの引数をレジスタEBX、ECXなどに保存します。
- 関連する割り込み(80h)を呼び出します。
- 通常、結果はEAXレジスタに返されます。
ファイルを作成して開く
ファイルを作成して開くには、次のタスクを実行します-
- システムコールsys_creat()番号8をEAXレジスタに入れます。
- EBXレジスタにファイル名を入れます。
- ファイルのアクセス許可をECXレジスタに入れます。
システムコールは、作成されたファイルのファイル記述子をEAXレジスタに返します。エラーの場合、エラーコードはEAXレジスタにあります。
既存のファイルを開く
既存のファイルを開くには、次のタスクを実行します-
- システムコールsys_open()番号5をEAXレジスタに入れます。
- EBXレジスタにファイル名を入れます。
- ファイルアクセスモードをECXレジスタに入れます。
- EDXレジスタにファイルのアクセス許可を入れます。
システムコールは、作成されたファイルのファイル記述子をEAXレジスタに返します。エラーの場合、エラーコードはEAXレジスタにあります。
ファイルアクセスモードの中で、最も一般的に使用されるのは、読み取り専用(0)、書き込み専用(1)、および読み取り/書き込み(2)です。
ファイルからの読み取り
ファイルから読み取るには、次のタスクを実行します-
- システムコールsys_read()番号3をEAXレジスタに入れます。
- ファイル記述子をEBXレジスターに入れます。
- 入力バッファーへのポインターをECXレジスターに入れます。
- バッファーサイズ、つまり読み取るバイト数をEDXレジスタに入れます。
システムコールは、EAXレジスタに読み込まれたバイト数を返します。エラーの場合、エラーコードはEAXレジスタにあります。
ファイルへの書き込み
ファイルに書き込むために、次のタスクを実行します-
- システムコールsys_write()番号4をEAXレジスタに入れます。
- ファイル記述子をEBXレジスターに入れます。
- ECXレジスタに出力バッファへのポインタを置きます。
- バッファーサイズ、つまり書き込むバイト数をEDXレジスタに入れます。
システムコールは、EAXレジスタに書き込まれた実際のバイト数を返します。エラーの場合、エラーコードはEAXレジスタにあります。
ファイルを閉じる
ファイルを閉じるには、次のタスクを実行します-
- システムコールsys_close()番号6をEAXレジスタに入れます。
- ファイル記述子をEBXレジスターに入れます。
システムコールは、エラーの場合、EAXレジスタ内のエラーコードを返します。
ファイルを更新する
ファイルを更新するには、次のタスクを実行します-
- システムコールsys_lseek()番号19をEAXレジスタに入れます。
- ファイル記述子をEBXレジスターに入れます。
- ECXレジスタにオフセット値を入れます。
- EDXレジスタにオフセットの参照位置を配置します。
基準位置は次のとおりです。
- ファイルの始まり-値0
- 現在の位置-値1
- ファイルの終わり-値2
システムコールは、エラーの場合、EAXレジスタ内のエラーコードを返します。
例
次のプログラムは、_myfile.txt_という名前のファイルを作成して開き、このファイルに「Welcome to Tutorials Point」というテキストを書き込みます。 次に、プログラムはファイルから読み取り、_info_という名前のバッファーにデータを保存します。 最後に、_info_に保存されているテキストを表示します。
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
;create the file
mov eax, 8
mov ebx, file_name
mov ecx, 0777 ;read, write and execute by all
int 0x80 ;call kernel
mov [fd_out], eax
; write into the file
mov edx,len ;number of bytes
mov ecx, msg ;message to write
mov ebx, [fd_out] ;file descriptor
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
; close the file
mov eax, 6
mov ebx, [fd_out]
; write the message indicating end of file write
mov eax, 4
mov ebx, 1
mov ecx, msg_done
mov edx, len_done
int 0x80
;open the file for reading
mov eax, 5
mov ebx, file_name
mov ecx, 0 ;for read only access
mov edx, 0777 ;read, write and execute by all
int 0x80
mov [fd_in], eax
;read from file
mov eax, 3
mov ebx, [fd_in]
mov ecx, info
mov edx, 26
int 0x80
; close the file
mov eax, 6
mov ebx, [fd_in]
int 0x80
; print the info
mov eax, 4
mov ebx, 1
mov ecx, info
mov edx, 26
int 0x80
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
file_name db 'myfile.txt'
msg db 'Welcome to Tutorials Point'
len equ $-msg
msg_done db 'Written to file', 0xa
len_done equ $-msg_done
section .bss
fd_out resb 1
fd_in resb 1
info resb 26
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Written to file
Welcome to Tutorials Point