Assembly-programming-assembly-file-management

提供:Dev Guides
移動先:案内検索

アセンブリ-ファイル管理

システムは、入力または出力データをバイトストリームと見なします。 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