AT&T彙編學習筆記之使用文件

使用文件:
系統調用
打開 5 打開要訪問的文件並且創建指向該文件的句柄。
讀取 3 使用文件句柄打開文件
寫入 4 使用文件句柄寫入
關閉 6 關閉文件並且刪除文件句柄

打開:
int open(const char* pathname , int flags , mode_t mode);
eax 5
ebx 包含以空字符結尾的文件名字符串的開始位置的內存地址。
ecx 需要文件的訪問;類型的標誌的真數值
edx 如果是創建新文件,則表示包含unix權限的整數值



c常量:   數字值   描述
O_RDONLY 00    打開文件,只讀
O_WRONLY 01    只寫
O_RDWR    02     打開文件,讀寫訪問
O_CREAT  0100    文件不存在則創建
O_EXCL    0200    與O_CREAT一起使用時
O_TRUNC 01000    如果文件存在並且按照只寫,模式打開,則把文件長度截斷爲0.
O_APPEND 02000    把數據追加到文件尾部。
O_NONBLOCK    04000    按照非塊模式打開。
O_SYNC    010000    按照同步模式打開文件(同時只允許一個寫入)
O_ASYNC    020000    按照異步模式打開(同時允許多個寫入操作)

打開文件代碼:
.section    .data
filename:
    .asciz    "output.txt"
..
..
.section    .text
..
..
movl    $filename , %ebx

movl %esp , %ebp
..
movl 8(%ebp) , %ebx


movl $5 , %eax
movl $filename , %ebx
movl $0102 , %ecx
movl $0644 , %edx
int $0x80
test %eax , %eax
js badfile

錯誤碼:錯誤值:描述
EPERM 1 操作不被允許
ENOENT 2 沒有此文件
EBADF 9 壞文件句柄數字
EACCES 13 權限被拒絕
EFAULT 14 壞文件地址
EBUSY 16 設備或者資源忙
EEXIST 17 文件存在
EISDIR 21 是目錄
EMFILE 24 過多打開文件
EFBIG 27 文件過大
EROFS 30 只讀文件系統
ENAMETOOLONG 36 文件名過長

關閉文件
movl filehandle , %ebx
movl $6 , %eax
int $0x80

read調用 ssize_t read(int fd , void* buf , size_t count);
句柄  緩衝區  字節數量

eax  3 系統調用值
ebx    打開文件的句柄
ecx    緩衝區的內存位置
edx    要讀取字節數量的整數值

操作系統不能在讀文件時寫文件。
void *mmap(void* start,size_t length,int port,int flags,int fd,off_t offset);
內存中起始位置  字節數量  內存保護設置 要創建的映射對象類型  要映射到內存文件的句柄  文件中要複製到內存的數據的起始點

保護名稱:
PORT_NONE    0    不允許數據訪問
PORT_READ    1    允許讀取訪問
PORT_WRITE    2    允許寫入訪問
PORT_EXEC    4    允許執行訪問

flags:
MAP_SHARE    1    和其它進程共享內存映射文件的改動
MAP_PRIVATE    2    保持所有改動對這個進程是私有的

msync    原始文件和內存文件做同步映射
munmap    從內存中刪除內存映射文件並且把所有改動寫入原始文件

int msync(const void* start,size_t length, int flags);
int munmap(void* start,size_t length);

MS_ASYNC    在下一次寫入文件時安排更新,並且系統返回調用
MS_SYNC        系統調用等待,直到做出更新,然後再返回調用程序

系統調用值
mmap    90
munmap    91
msync    144


mmap模板
pushl    $0
puhl    filehandle
pushl    $1
pushl    $3
pushl    size
pushl    $0
movl    %esp , %ebp
movl    $90 , %eax
int     $0x80
addl    $24 , %esp
movl    %eax , mappedfile


unmap
movl    $91 , %eax
movl     mappedfile , %ebx
movl     size , %ecx
int    $0x80

int llseek(unsigned int fd,unsigned long offset_high,unsigned long offset_low ,loff_t *result,unsigned int whence);

stack:
offset
fd
flags
port
length
start    ebx
發佈了64 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章