Assembly彙編 文件管理
系統認爲任何輸入或輸出數據的字節流。有三種標準的文件流:
標準輸入 (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
系統調用返回時,在錯誤的情況下,在EAX寄存器中的錯誤代碼。
例子:
下面的程序創建和打開一個文件,名爲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 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
上面的代碼編譯和執行時,它會產生以下結果:
Written to file
Welcome to yiibai.com