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 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