使用嵌入式汇编实现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;
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮