在线二区人妖系列_国产亚洲欧美日韩在线一区_国产一级婬片视频免费看_精品少妇一区二区三区在线

鍍金池/ 教程/ Java/ Assembly匯編 文件管理
Assembly 變量聲明
Assembly匯編 STOS指令
Assembly 條件
Assembly 尋址模式和MOV指令
Assembly匯編教程
Assembly - 什么是匯編語言
Assembly 循環(huán)
Assembly 內(nèi)存段
Assembly匯編 宏
Assembly 寄存器
Assembly匯編 遞歸
Assembly匯編 CMPS指令
Assembly匯編 內(nèi)存管理
Assembly匯編 LODS指令
Assembly 基本語法
Assembly匯編 過程
Assembly匯編 文件管理
Assembly匯編 數(shù)組
Assembly匯編 SCAS指令
Assembly 算術(shù)指令
Assembly 環(huán)境設(shè)置
Assembly匯編 字符串處理
Assembly 數(shù)字
Assembly 常量
Assembly匯編 MOVS指令
Assembly 邏輯指令
Assembly 系統(tǒng)調(diào)用

Assembly匯編 文件管理

系統(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è)置為零。

文件處理系統(tǒng)調(diào)用

下表簡要介紹了相關(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)建和打開文件

對于創(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)閉文件

為了關(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

系統(tǒng)調(diào)用返回時,在錯誤的情況下,在EAX寄存器中的錯誤代碼。


例子:

下面的程序創(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