使用嵌入式汇编实现64位linux上文件的基本操作

2019-07-12 17:22发布

#include #include #include #include #include //打开文件 int my_open(const char *pathname,int flags,mode_t mode) { int ret = 0; int nu = __NR_open; __asm__ __volatile__( "mov %1,%%eax " "syscall " "mov %%eax,%0 " :"=m"(ret) :"r"(nu) ); return ret; } //读文件 ssize_t my_read(int fd, void *buf, size_t count) { ssize_t ret = 0; int nu = __NR_read; __asm__ __volatile__( "mov %1,%%eax " "syscall " "mov %%eax,%0 " :"=m"(ret) :"r"(nu) ); return ret; } //写文件 ssize_t my_write(int fd, const void *buf, size_t count) { ssize_t ret = 0; int nu = __NR_write; __asm__ __volatile__( "mov %1,%%eax " "syscall " "mov %%eax,%0 " :"=m"(ret) :"r"(nu) ); return ret; } //关闭文件 int my_close(int fd) { int ret = 0; int nu = __NR_close; __asm__ __volatile__( "mov %1,%%eax " "syscall " "mov %%eax,%0 " :"=m"(ret) :"r"(nu) ); } //设置文件读写位置 off_t my_lseek(int fd, off_t offset, int whence) { off_t ret; int nu = __NR_lseek; __asm__ __volatile__( "mov %1,%%eax " "syscall " "mov %%eax,%0 " :"=m"(ret) :"r"(nu) ); } //使用例子 int main(int argc,char *argv[]) { int fd; char buff[512]={0}; fd = my_open("/test/te.c",O_RDWR|O_CREAT,0644); if(fd < 0) printf("error "); printf("Wriet ret=%d ",my_write(fd,"12345",sizeof("12345"))); printf("lseek ret=%d ",my_lseek(fd,0,SEEK_SET)); printf("read ret =%d ",my_read(fd,buff,512)); printf("rad buff=%s ",buff); printf("close ret=%d ",my_close(fd)); return 0; }