系統認為任何輸入或輸出資料的位元組流。有三種標準的檔案流:
標準輸入 (stdin)
標準輸出 (stdout)
標準錯誤 (stderr)
檔案描述符是一個16位元的整數,分配到一個檔案作為一個檔案ID。當一個新的檔案被建立,或者開啟現有的檔案,檔案描述符用於存取該檔案。
標準的檔案流 - 標準輸入,輸出和錯誤檔案描述符分別為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暫存器
將輸入緩衝區的指標放入 EBX暫存器
將緩衝區的大小,即要讀取的位元組數放到EDX暫存器中
系統呼叫返回EAX暫存器中讀取的位元組數,錯誤程式碼是在錯誤的情況下,在EAX暫存器中。
寫入到一個檔案中,執行以下任務:
把系統呼叫 sys_write() 數位4放到 ECX 暫存器
把檔案描述符放入 EBX 暫存器
輸出緩衝區的指標放入 EBX 暫存器
將緩衝區的大小,即要寫入的位元組數放入 EBX 暫存器
系統呼叫返回EAX暫存器中寫入的位元組的實際數量,在錯誤的情況下,錯誤程式碼是在EAX暫存器中。
為了關閉檔案,請執行以下任務:
把系統呼叫sys_close() 數位 6放到 ECX 暫存器
把檔案描述符放入到EBX暫存器
系統呼叫返回時,在錯誤的情況下,在EAX暫存器中的錯誤程式碼。
對於更新檔案,請執行以下任務:
把系統呼叫sys_lseek () 數位19放到 ECX 暫存器中
將檔案描述符放到 ECX 暫存器中
將偏移值放到 ECX 暫存器中
將基準位置的偏移量放在EDX暫存器中
參考位置可以是:
檔案開始的位置 - 0
當前檔案位置- 1
檔案尾 - 2
下面的程式建立和開啟一個檔案,名為myfile.txt,並寫入一個文字'Welcome to Yiibai“到這個檔案中。接下來,從檔案中讀取的程式和儲存資料到一個緩衝區中的命名資訊。最後,它顯示的文字資訊儲存。
section .text global _start ;must be declared for using gcc _start: ;tell linker entry yiibai ;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] ; 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 tw511.com' 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 tw511.com