系統(tǒng)認(rèn)為任何輸入或輸出數(shù)據(jù)的字節(jié)流。有三種標(biāo)準(zhǔn)的文件流:
標(biāo)準(zhǔn)輸入 (stdin)
標(biāo)準(zhǔn)輸出 (stdout)
標(biāo)準(zhǔn)錯誤 (stderr)
文件描述符是一個16位的整數(shù),分配到一個文件作為一個文件ID。當(dāng)一個新的文件被創(chuàng)建,或者打開現(xiàn)有的文件,文件描述符用于訪問該文件。
標(biāo)準(zhǔn)的文件流 - 標(biāo)準(zhǔn)輸入,輸出和錯誤文件描述符分別為0,1和2。
文件指針指定的位置用于后續(xù)讀/寫操作的字節(jié)文件。每個文件被認(rèn)為是一個字節(jié)序列。每個打開的文件相關(guān)聯(lián)的一個文件指針,指定的偏移量(以字節(jié)為單位),相對于文件開頭的。當(dāng)一個文件被打開時,文件指針被設(shè)置為零。
下表簡要介紹了相關(guān)文件處理系統(tǒng)調(diào)用:
%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 |
使用系統(tǒng)調(diào)用所需的步驟是一樣的,正如我們前面討論過的:
把EAX寄存器中的系統(tǒng)調(diào)用號。
存儲的參數(shù)在寄存器中的系統(tǒng)調(diào)用EBX,ECX等
調(diào)用相關(guān)的中斷(80H)
結(jié)果通常是在EAX寄存器中返回
對于創(chuàng)建和打開一個文件,請執(zhí)行以下任務(wù):
將系統(tǒng)調(diào)用sys_creat()數(shù)字8,在EAX寄存器中
把文件名放到EBX寄存器中
將文件權(quán)限放到ECX寄存器中
EAX寄存器中創(chuàng)建的文件系統(tǒng)調(diào)用返回的文件描述符,在錯誤的情況下,錯誤代碼是在EAX寄存器中。
為了打開一個現(xiàn)有的文件,請執(zhí)行以下任務(wù):
將系統(tǒng)調(diào)用sys_open() 數(shù)字5到EAX寄存器中
把文件名EBX寄存器中
將文件訪問模式放入到ECX寄存器
把文件權(quán)限放到EDX寄存器中
EAX寄存器中創(chuàng)建的文件系統(tǒng)調(diào)用返回的文件描述符,在錯誤的情況下,錯誤代碼是在EAX寄存器中。
在該文件的訪問模式中,最常用的有:只讀(0),只寫(1),(2)讀寫。
讀取文件,執(zhí)行以下任務(wù):
將系統(tǒng)調(diào)用sys_read() 數(shù)字3到EAX寄存器中
把文件描述符放入 EBX寄存器
將輸入緩沖區(qū)的指針放入 EBX寄存器
將緩沖區(qū)的大小,即要讀取的字節(jié)數(shù)放到EDX寄存器中
系統(tǒng)調(diào)用返回EAX寄存器中讀取的字節(jié)數(shù),錯誤代碼是在錯誤的情況下,在EAX寄存器中。
寫入到一個文件中,執(zhí)行以下任務(wù):
把系統(tǒng)調(diào)用 sys_write() 數(shù)字4放到 ECX 寄存器
把文件描述符放入 EBX 寄存器
輸出緩沖區(qū)的指針放入 EBX 寄存器
將緩沖區(qū)的大小,即要寫入的字節(jié)數(shù)放入 EBX 寄存器
系統(tǒng)調(diào)用返回EAX寄存器中寫入的字節(jié)的實際數(shù)量,在錯誤的情況下,錯誤代碼是在EAX寄存器中。
為了關(guān)閉文件,請執(zhí)行以下任務(wù):
把系統(tǒng)調(diào)用sys_close() 數(shù)字 6放到 ECX 寄存器
把文件描述符放入到EBX寄存器
系統(tǒng)調(diào)用返回時,在錯誤的情況下,在EAX寄存器中的錯誤代碼。
對于更新文件,請執(zhí)行以下任務(wù):
把系統(tǒng)調(diào)用sys_lseek () 數(shù)字19放到 ECX 寄存器中
將文件描述符放到 ECX 寄存器中
將偏移值放到 ECX 寄存器中
將基準(zhǔn)位置的偏移量放在EDX寄存器中
參考位置可以是:
文件開始的位置 - 0
當(dāng)前文件位置- 1
文件尾 - 2
下面的程序創(chuàng)建和打開一個文件,名為myfile.txt,并寫入一個文本'Welcome to Yiibai“到這個文件中。接下來,從文件中讀取的程序和存儲數(shù)據(jù)到一個緩沖區(qū)中的命名信息。最后,它顯示的文本信息存儲。
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 yiibai.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
上面的代碼編譯和執(zhí)行時,它會產(chǎn)生以下結(jié)果:
Written to file Welcome to yiibai.com