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

#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;
}

猜你喜欢

转载自blog.csdn.net/yldfree/article/details/81480567