汇编系统调用read读取文件返回值为-14

```.section .data
name:
.ascii "flags"
name_end:
.equ len,name_end-name
.section .text
.globl _start
_start:
push %rbp
mov %rsp,%rbp
sub $140,%rsp

mov $5,%rax
movl $0,%ecx
movl $name,%ebx
int $0x80

movl %eax,-8(%rbp)
mov $100,%dl
lea -132(%rbp),%rcx
movl -8(%rbp),%ebx
movl $3,%eax
int $0x80

movl $4,%eax
movl $100,%edx
lea -132(%rbp),%rcx
movl $1,%ebx
int $0x80

movl $1,%eax
mov $1,%ebx
int $0x80
正在写一个汇编程序能够读取flag中的文件内容,运行起来总是失败,虽然open函数执行
成功并且返回值是3,但是read系统调用总是不成功,返回值总是-14,关键是写一个c
程序读取文件就没有问题,始终不知道这个写法错在哪里,求指教。




0

1个回答

2
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
汇编语言调用Linux系统调用read和write
.section .data UserMsg: .ascii "Please input the message:" LenOfUserMsg: .equ lenMsg,  LenOfUserMsg - UserMsg #.section .bss # .lcomm resb, 200 OutputMsg: .ascii "This is your input:" LenOfOu
linux平台学x86汇编(十七):在汇编中使用linux系统调用
【版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途】         在前面章节我们已经看到,启动系统调用需要使用INT指令。linux系统调用位于中断0x80,执行INT指令时,所有操作转移到内核中的系统调用处理程序,完成后执行转移到INT指令之后的下一条指令。         linux的系统调用在如下文件(3
syscall 系统调用
转自:http://blog.csdn.net/b02042236/article/details/6136598 5.1.5  如何使用系统调用 如图5.2所示,用户应用可以通过两种方式使用系统调用。第一种方式是通过C库函数,包括系统调用在C库中的封装函数和其他普通函数。   图5.2  使用系统调用的两种方式 第二种方式是使用_syscal
学习Linux:用read()系统调用读取文件
1.内核为每个进程维护一个打开文件的列表,该表由一些叫做文件描述符(fds)的非角整数进行索引。列表中每项均包含一个打开文件的信息。 2.文件描述符由C言语的int类型表示。不使用fd_t这个特殊类型来表示。每个Linux进程有一个打开文件数的上限。文件描述符从0开始,直到
linux中的read和write系统调用
linux中read和write系统调用在这里小koala着重于read()和write()来读写普通文件,因为小koala在编写实际文件读写函数时,疏忽了一些重要的地方,造成无休止的向系统中写数据,最后系统崩溃。当时瞬间“三观”尽毁。现在较为详细地分析错误的原因,有问题或是模糊的话,希望大神们告诉小koala,先行谢过了。在《深入理解linux内核》中虚拟文件系统一章中有这样的说明:VFS所隐含的
Linux虚拟文件系统之文件读取(sys_read())
在文件成功打开之后,进程将使用内核提供的read和write系统调用,来读取或修改文件的数据。内核中文件读写操作的系统调用实现基本都一样,下面我们看看文件的读取。 [cpp] view plain copy  print? /*sys_read()*/   SYSCALL_DEFINE3(read, unsigned int, fd, char 
read 系统调用为什么返回 int ?
read 返回值类型为 int
详解汇编系统调用过程(以printf为例)
本文以printf为例,详细解析一个简单的printf调用里头,系统究竟做了什么,各寄存器究竟如何变化。 环境: linux + gnu as assembler + ld linker 如何在汇编调用glibc的函数?其实也很简单,根据c convention call的规则,参数反向压栈,call,然后结果保存在eax里头。注意,保存的是地址。 在汇编里头,一切皆地址。
int $0x80系统调用的idea
1、基础知识      用户态和内核态           一般现代CPU都有几种不同的指令执行级别,Linux总共划分为4个指令执行级别:内核运行在0级别上,1,2级别默认不运行,用户程序运行在3级别上。           在内核指令执行级别上,代码可以执行特权指令,访问任意的物理地址。           在用户指令执行级别上,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动
文件操作的系统调用之open,read
#include #include #include #include #include #include #define SIZE 1024 /* open() #include #include #include int open(const char *pathname, int flags, mode_tmode); pathname:要打开或要创建的文件名称 f
Linux系统调用:使用int 0x80
系统调用 系统调用的概念 系统调用是计算机程序请求操作系统内核服务的方式,包括硬件相关的服务(例如访问硬盘驱动器)、创建和执行新的进程和进程调度等等。系统调用提供了进程和操作系统间的必要接口。 在大多数操作系统中,系统调用只能被用户空间进程使用。而在某些操作系统中,比如在OS/360及其后续的一些操作系统中,有特权的系统代码也会触发系统调用。 系统调用的分类 系统调用大体上可分为...
系统调用(int 0x80)详解
1、系统调用初始化 在系统启动时,会在sched_init(void)函数中调用set_system_gate(0x80,&system_call),设置中断向量号0x80的中断描述符: #define set_system_gate(n,addr)  _set_gate(&idt[n],15,3,addr) 其中15表示此中断号对应的是陷阱门,注意,这个中断向量不是中断门描述符
linux系统调用open、write、close、read以及stat函数详解
参考链接1 、参考链接2以及百度百科 在进行C语言学习的时候我们了解到了C语言相关的一些IO操作,如fopen,fwrite,fread,fprintf,fclose等相关函数,他们都是由C库函数提供的一些函数,是将操作系统的系统调用加以封装,虽说Linux是由C语言实现的,但为了使我们更加的了解Linux,就需要了解更接近与底层的一些IO操作,因此就需要来了解下基本的...
四种读写文件的方式:系统调用(open/read/write),C语言(fopen,fgets, fputs),C++(ifstream, ofstream getline,)泛型算法
第一种方法是系统调用 (1)open系统调用    原型:        #include        #include        #include        int open(const char *pathname, int flags);        int open(const char *pathname, int flags, mode_t mode
浅析read()函数(man 2)返回值
问题:read 函数(man 2)的返回值
汇编语言学习----系统调用
一、实验要求 试设计一程序,该程序从键盘输入一个字符串,输入的字符串最大允许15个字符且以回车字符结束(15个字符含回车符)。同时,如果输入的字符串中有数字字符,则将数字字符删除,并新起一行显示处理后的字符串。 以下是定义好的数据段和堆栈段: data segment     maxlen db 15;0AH子功能入口参数,指定最大字符数 inputlen db
系统调用——open、write、read和close
一、文件描述符 每一个进程都有一个与之相关的文件描述符,它们是一些小值整数,我们可以通过这些文件描述符来访问打开的文件。 一般地,一个程序开始运行时,会自动打开3个文件描述符: 0——–标准输入———-stdin 1——–标准输出———-stdout 2——–标准错误———-二、write系统调用1.write系统调用的原型:#include <unistd.h>size_t write(
read和write系统调用以及getchar的实现
输入和输出是由read和write两个系统调用实现的。在C语言程序中,可以通过函数read和write访问这两个系统调用。   这两个函数原型为:int n_read = read(int fd,char *buf,int n); int n_written = write(int fd,char *buf,int n);  这两个函数的第一个参数都是文件描述符,第二个参数是程序中存放读或者写的
int 0x80系统调用的参数传递规则
系统调用的参数传递规则: 传递给系统调用的参数则必须按照参数顺序依次存放到寄存器ebx,ecx,edx,esi,edi中,当系统调用完成之后,返回值存放在eax中; A.当系统调用所需参数的个数不超过5个的时候,执行"int$0x80"指令时,需在eax中存放系统调用的功能号,传递给系统调用的参数则按照参数顺序依次存放到寄存器ebx,ecx,edx,esi,edi中,当系统调用完成之后,返回值
汇编dos系统调用(输入输出篇)
程序员编写汇编程序,不可避免要与底层的各种
读文件read,未读到结尾,返回0原因
今天在测试一段程序的时候,程序简单如下: int shouldoplen ; char filebuf[MAXFILESIZE]; int fd = open(logName,O_RDWR); if(fd<0) { writelog(LOG_ERR,"%s,%d,[client] open the file %s error !\n",__FILE__,__LINE__,logNa
errno返回值的对应错误码
<br /> <br /> <br /><asm-generic/errno-base.h> <br />  #ifndef _ASM_GENERIC_ERRNO_BASE_H<br />  #define _ASM_GENERIC_ERRNO_BASE_H<br /> <br />  #define EPERM            1      /* Operation not permitted */<br />  #define ENOENT           2      /* No such
Linux AT&T汇编 系统调用
.data #数据段声明 msg: .ascii "Hello world, hello AT&T asm!\n" #要输出的字符串 len = . - msg #字符串长度 .text #代码段声明 .global _start #指定入口函数 _start: movl $len, %edx # string length 参
VFS中的read/write系统调用
VFS中的read/write系统调用 ​ VFS所隐含的主要思想在于引入了一个通用的文件模型(common file model),这个模型能够表示所有支持的文件系统。VFS是所有文件系统的抽象。 ​ linux内核对每个文件读写操作都必须使用一个指针,指向要访问的具体文件系统的适当函数。换句话说,当应用程序对read()或是write()调用引起内核调用相应的sys_read()或...
Linux底层文件访问---read系统调用
系统调用read的作用是:从与文件描述符files相关联的文件里读入nbytes个字节的数据,并把她们放到数据区buf中。它返回实际读入的字符,这可能会小于请求的字节数。如果read调用返回0,就表示未读入任何数据,已到达了文件结尾。同样,如果返回的是-1,就表示read调用出现了错误。 #include size_t read(int fildes, void *buf, size_t nby
Linux下C编程-----文件操作(1) 通过系统调用简单操作标准输入、标准输出、标准错误
Linux的 C系统调用操作  ,下面我们就来练习下 简单的系统调用操作 read系统调用测试 /************************************************************************* > File Name: read.c > Author: > Mail: > Created Time: Tue 10 Feb 2015
brk系统调用实现分析
brk(addr)直接修改堆的大小。addr指定current->mm->brk的新值,返回值是线性区新的结束地址,这是一个系统调用。当用户态的进程调用brk()系统调用时,内核执行sys_brk(addr)函数。下面分析这个函数的执行流程: 1:检测addr参数是否位于进程代码段所在的线性区,如果是直接返回,因为堆不能与进程代码段所在的线性区重合。 mm=current->mm; down_
应用程序中read()函数返回值一直错误
d = open(“/dev/gpio_key”, O_WRONLY ); 调用read()函数时,返回-1,改为 fd = open(“/dev/gpio_key”, O_RDWR ); 读写成功
read()系统调用的流程-图比较多
大部分程序员可能会有这样的疑问:当在程序中调用库函数 read 时,这个请求是经过哪些处理最终到达磁盘的呢,数据又是怎么被拷贝到用户缓存区的呢?本文介绍了从 read 系统调用发出到结束处理的全过程。该过程包括两个部分:用户空间的处理、核心空间的处理。用户空间处理部分是系统调用从用户态切到核心态的过程。核心空间处理部分则是 read 系统调用在 linux 内核中处理的整个过程。Read 系统
nachos系统调用实现Write、Read、Exec、Join
 了解nachos系统调用的原理:1.  要实现nachos的系统调用,首先查看syscall.h当中声明的系统调用函数可以发现Nachos已经为我们在syscall.h中声明好了这些系统调用函数。2.  观察Start.s中的汇编代码,定义了系统调用函数的实现我们可以观察到Halt函数的实现是将系统调用类型(type)SC_Halt放入了2号寄存器中,然后执行syscall。3.  在Mipss...
WINDOWS系统调用
Windows系统调用 Windows 2K通过2Eh中断来实现系统调用的,但是在XP后使用SysEnter来实现系统调用了,同时2Eh中断还是保存着的。不管是2EH中断还是SYSENTER,Windows对所有的系统调用都会生成下面的KTRAP_FRAME堆栈框
linux下32位汇编调用规则
传递给系统调用的参数必须安装参数顺序一次放到寄存器中,当系统调用完成后,返回值放在eax中: 当系统调用参数<=5个时: eax中存放系统调用的功能号,传递给系统调用的参数顺序依次放到寄存器:ebx,ecx,edx,esi,edi中 当系统调用参数>5个时: eax中存放系统调用的功能号,全部参数应依次放在一块连续的内存区域中,同时在寄存器ebx中保存指向该内存区域的指针(内存块的首地址);li
linux下64位汇编的系统调用(1)
现在基本上系统都是64位了,而64位系统下的汇编和32位有了较大的变化,无论是系统调用的接口还是C标准库的接口都和32位汇编有所不同;下面简单谈一下在64位linux下如何利用汇编直接调用系统调用。需要准备的有:1.一台linux机器:我的系统是ubuntu 14.10 x64版; 2.还要一个汇编器;我没有使用gas,而是使用了跨平台的nasm; 3.一个调试器;这里选择的不多,要不就是gdb
一次read()系统调用在内核中的处理过程
部分程序员可能会有这样的疑问:当在程序中调用库函数 read 时,这个请求是经过哪些处理最终到达磁盘的呢,数据又是怎么被拷贝到用户缓存区的呢?本文介绍了从 read 系统调用发出到结束处理的全过程。该过程包括两个部分:用户空间的处理、核心空间的处理。用户空间处理部分是系统调用从用户态切到核心态的过程。核心空间处理部分则是 read 系统调用在 linux 内核中处理的整个过程。Read 系统调用在用
(转)详解汇编系统调用过程(以printf为例)
(转)详解汇编系统调用过程(以printf为例) 本文以printf为例,详细解析一个简单的printf调用里头,系统究竟做了什么,各寄存器究竟如何变化。环境:linux + gnu as assembler + ld linker如何在汇编调用glibc的函数?其实也很简单,根据c convention call的规则,参数反向压栈,call,然后结果保存在eax里头。注意,保存的是地址。在汇编
系统调用read,write和标准库fread,fwrite的区别
read,write属于Linux系统调用,fread,fwrite属于C语言标准库 使用系统调用会影响系统的性能。与函数调用相比,系统调用的开销要大些,因为在执行系统调用时,Linux必须从运行用户代码切换到执行内核代码,然后再返回用户代码。减少这种开销的一个好方法是,在程序中尽量减少系统调用的次数,并且让每次系统调用完成尽可能多的工作。例如,每次读写大量的数据而不是每次仅读写一个字符。
用fork系统调用,clone系统调用
-
C语言中的Read和Write函数
读函数read  ssize_t read(int fd,void *buf,size_t nbyte)  read函数是负责从fd中读取内容.成功时,read返回实际所读的字节数,如果返回的值是0,表示已经读到文件的结束了. 小于0表示出现了错误.如果错误为EINTR说明读是由中断引起的, 如果是ECONNREST表示网络连接出了问题.     写函数write 
JAVA IO中read()方法的返回值
以下是不太严谨的个人理解,有错误欢迎指出,共同进步:read()方法的作用是从输入流读取数据的下一个字节,返回的字节的值是一个0~255之间的整数。到达流的末尾返回-1。刚开始我以为这个返回值表示的是所读取的数据的长度,可是之后在一个示例程序中发现这种说法解释不通。我就好奇研究了一下这个返回值到底表示什么。首先要知道什么是字节(Byte)和比特(bit),它们都是计算机信息量的度量单位。 每一个二
Linux文件的系统调用
Linux文件的系统调用 文件描述符 操作系统识别文件的唯一标识。当进程创建一个新文件或者打开现有文件时,系统内核向进程返回一个文件描述符。范围为0~255 三个特殊的文件描述符 前三个文件标识符在系统中规定为: #define STDIN_FILENO 0 //标准输入文件 #define STDOUT_FILENO 1 //标准输出文件 #define ST...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 python教程读取文件 java学习返回值