#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <asm/unistd.h>
#include <stdio.h>
//打开文件
int my_open(const char *pathname,int flags,mode_t mode)
{
int ret = 0;
int nu = __NR_open;
__asm__ __volatile__(
"mov %1,%%eax\n"
"syscall\n"
"mov %%eax,%0\n"
:"=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\n"
"syscall\n"
"mov %%eax,%0\n"
:"=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\n"
"syscall\n"
"mov %%eax,%0\n"
:"=m"(ret)
:"r"(nu)
);
return ret;
}
//关闭文件
int my_close(int fd)
{
int ret = 0;
int nu = __NR_close;
__asm__ __volatile__(
"mov %1,%%eax\n"
"syscall\n"
"mov %%eax,%0\n"
:"=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\n"
"syscall\n"
"mov %%eax,%0\n"
:"=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\n");
printf("Wriet ret=%d\n",my_write(fd,"12345",sizeof("12345")));
printf("lseek ret=%d\n",my_lseek(fd,0,SEEK_SET));
printf("read ret =%d\n",my_read(fd,buff,512));
printf("rad buff=%s\n",buff);
printf("close ret=%d\n",my_close(fd));
return 0;
}