汇编系统调用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条回答

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
linux中的read和write系统调用
linux中read和write系统调用在这里小koala着重于read()和write()来读写普通文件,因为小koala在编写实际文件读写函数时,疏忽了一些重要的地方,造成无休止的向系统中写数据,最后系统崩溃。当时瞬间“三观”尽毁。现在较为详细地分析错误的原因,有问题或是模糊的话,希望大神们告诉小koala,先行谢过了。在《深入理解linux内核》中虚拟文件系统一章中有这样的说明:VFS所隐含的
文件操作的系统调用之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下64位汇编的系统调用(3)
背景知识基本交代清楚了,下面我们实际写一个小例子看一下。代码的功能很简单,显示一行文本,然后退出。我们使用了syscall中的write和exit调用,查一下前面的调用号和参数,我们初步总结如下:write(即sys_write)调用号为1,需传递3个参数unsigned int fd const char *buf size_t countexit(sys_exit)调用号为60,只需传递一个错误
Linux read系统调用
最近一个项目做了一个模拟u盘的设备,但是在read虚拟u盘的内容时必须每次都从磁盘内读取,而不是从系统的cache中读取,由于这个问题,就查资料看了下read的系统调用,以及文件系统的一些内容。由于文件系统涉及面较广,例如虚拟文件系统(VFS),页缓存,块缓存,数据同步等内容,不可能全部分析到位,这里只记录和read有关的两种使用方式。cached IO和direct IO。 1. 什么是系
Linux虚拟文件系统之文件读取(sys_read())
在文件成功打开之后,进程将使用内核提供的read和write系统调用,来读取或修改文件的数据。内核中文件读写操作的系统调用实现基本都一样,下面我们看看文件的读取。 [cpp] view plain copy  print? /*sys_read()*/   SYSCALL_DEFINE3(read, unsigned int, fd, char 
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开始,直到
int 0x80系统调用的参数传递规则
系统调用的参数传递规则: 传递给系统调用的参数则必须按照参数顺序依次存放到寄存器ebx,ecx,edx,esi,edi中,当系统调用完成之后,返回值存放在eax中; A.当系统调用所需参数的个数不超过5个的时候,执行"int$0x80"指令时,需在eax中存放系统调用的功能号,传递给系统调用的参数则按照参数顺序依次存放到寄存器ebx,ecx,edx,esi,edi中,当系统调用完成之后,返回值
read 系统调用为什么返回 int ?
read 返回值类型为 int
WINDOWS系统调用
Windows系统调用 Windows 2K通过2Eh中断来实现系统调用的,但是在XP后使用SysEnter来实现系统调用了,同时2Eh中断还是保存着的。不管是2EH中断还是SYSENTER,Windows对所有的系统调用都会生成下面的KTRAP_FRAME堆栈框
四种读写文件的方式:系统调用(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
Linux中open、write、read、close系统调用
个人学习整理 如有不足之处 请不吝指教 open系统调用 open函数的三个参数: (1)path是已经存在的文件的路径; (2)oflags参数:若值为 O_RDONLY ,就以只读方式打开文件;                若值为 O_WDONLY,就以只写方式打开文件;                若值为 O_RDWR,就以读写方式打开文件; (3)
Linux下C编程-----文件操作(1) 通过系统调用简单操作标准输入、标准输出、标准错误
Linux的 C系统调用操作  ,下面我们就来练习下 简单的系统调用操作 read系统调用测试 /************************************************************************* > File Name: read.c > Author: > Mail: > Created Time: Tue 10 Feb 2015
Linux AT&T汇编 系统调用
.data #数据段声明 msg: .ascii "Hello world, hello AT&T asm!\n" #要输出的字符串 len = . - msg #字符串长度 .text #代码段声明 .global _start #指定入口函数 _start: movl $len, %edx # string length 参
int $0x80系统调用的idea
1、基础知识      用户态和内核态           一般现代CPU都有几种不同的指令执行级别,Linux总共划分为4个指令执行级别:内核运行在0级别上,1,2级别默认不运行,用户程序运行在3级别上。           在内核指令执行级别上,代码可以执行特权指令,访问任意的物理地址。           在用户指令执行级别上,代码的掌控范围会受到限制。只能在对应级别允许的范围内活动
linux下32位汇编调用规则
传递给系统调用的参数必须安装参数顺序一次放到寄存器中,当系统调用完成后,返回值放在eax中: 当系统调用参数<=5个时: eax中存放系统调用的功能号,传递给系统调用的参数顺序依次放到寄存器:ebx,ecx,edx,esi,edi中 当系统调用参数>5个时: eax中存放系统调用的功能号,全部参数应依次放在一块连续的内存区域中,同时在寄存器ebx中保存指向该内存区域的指针(内存块的首地址);li
读文件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
VFS中的read/write系统调用
VFS中的read/write系统调用 ​ VFS所隐含的主要思想在于引入了一个通用的文件模型(common file model),这个模型能够表示所有支持的文件系统。VFS是所有文件系统的抽象。 ​ linux内核对每个文件读写操作都必须使用一个指针,指向要访问的具体文件系统的适当函数。换句话说,当应用程序对read()或是write()调用引起内核调用相应的sys_read()或...
linux下64位汇编的系统调用(1)
现在基本上系统都是64位了,而64位系统下的汇编和32位有了较大的变化,无论是系统调用的接口还是C标准库的接口都和32位汇编有所不同;下面简单谈一下在64位linux下如何利用汇编直接调用系统调用。需要准备的有:1.一台linux机器:我的系统是ubuntu 14.10 x64版; 2.还要一个汇编器;我没有使用gas,而是使用了跨平台的nasm; 3.一个调试器;这里选择的不多,要不就是gdb
Linux系统调用:使用int 0x80
系统调用 系统调用的概念 系统调用是计算机程序请求操作系统内核服务的方式,包括硬件相关的服务(例如访问硬盘驱动器)、创建和执行新的进程和进程调度等等。系统调用提供了进程和操作系统间的必要接口。 在大多数操作系统中,系统调用只能被用户空间进程使用。而在某些操作系统中,比如在OS/360及其后续的一些操作系统中,有特权的系统代码也会触发系统调用。 系统调用的分类 系统调用大体上可分为...
read系统调用深度剖析
本文转自:http://blog.csdn.net/unbutun/article/details/6101354#ibm-pconRead 系统调用在用户空间中的处理过程Linux 系统调用(SCI,system call interface)的实现机制实际上是一个多路汇聚以及分解的过程,该汇聚点就是 0x80 中断这个入口点(X86 系统结构)。也就是说,所有系统调用都从用户空间中汇聚到 0x
应用程序中read()函数返回值一直错误
d = open(“/dev/gpio_key”, O_WRONLY ); 调用read()函数时,返回-1,改为 fd = open(“/dev/gpio_key”, O_RDWR ); 读写成功
(转)详解汇编系统调用过程(以printf为例)
(转)详解汇编系统调用过程(以printf为例) 本文以printf为例,详细解析一个简单的printf调用里头,系统究竟做了什么,各寄存器究竟如何变化。环境:linux + gnu as assembler + ld linker如何在汇编调用glibc的函数?其实也很简单,根据c convention call的规则,参数反向压栈,call,然后结果保存在eax里头。注意,保存的是地址。在汇编
read()系统调用的流程-图比较多
大部分程序员可能会有这样的疑问:当在程序中调用库函数 read 时,这个请求是经过哪些处理最终到达磁盘的呢,数据又是怎么被拷贝到用户缓存区的呢?本文介绍了从 read 系统调用发出到结束处理的全过程。该过程包括两个部分:用户空间的处理、核心空间的处理。用户空间处理部分是系统调用从用户态切到核心态的过程。核心空间处理部分则是 read 系统调用在 linux 内核中处理的整个过程。Read 系统
用asm内联汇编实现系统调用
原创内容(cxsmarkchan 陈晓爽) 转载请注明出处 《Linux内核分析》MOOC课程学习笔记 为保证系统的稳定运行,CPU运行状态被分为内核态和用户态。操作系统在内核态下运行,因此拥有所有计算机资源的操作权限。而一般的应用程序则在用户态下运行,它们不能直接操作底层的硬件设备,从而保证应用软件不会破坏系统的稳定。但是,应用程序在运行时常常需要和各种资源打交道,为此,操作系统提供了“系统
brk系统调用实现分析
brk(addr)直接修改堆的大小。addr指定current->mm->brk的新值,返回值是线性区新的结束地址,这是一个系统调用。当用户态的进程调用brk()系统调用时,内核执行sys_brk(addr)函数。下面分析这个函数的执行流程: 1:检测addr参数是否位于进程代码段所在的线性区,如果是直接返回,因为堆不能与进程代码段所在的线性区重合。 mm=current->mm; down_
浅析read()函数(man 2)返回值
问题:read 函数(man 2)的返回值
java:IO流(read()方法返回值为什么是int)
read()方法读取的是一个字节,为什么返回是int,而不是byte *  因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111,那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会...
一次read()系统调用在内核中的处理过程
部分程序员可能会有这样的疑问:当在程序中调用库函数 read 时,这个请求是经过哪些处理最终到达磁盘的呢,数据又是怎么被拷贝到用户缓存区的呢?本文介绍了从 read 系统调用发出到结束处理的全过程。该过程包括两个部分:用户空间的处理、核心空间的处理。用户空间处理部分是系统调用从用户态切到核心态的过程。核心空间处理部分则是 read 系统调用在 linux 内核中处理的整个过程。Read 系统调用在用
Linux系统调用(syscall)原理
http://blog.csdn.net/nanfenglei23/article/details/41928293 版权声明:本文为博主原创文章,未经博主允许不得转载。 Linux体系结构 内核空间与用户空间是程序执行的两种不同状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移。如下图所示: linux 体系结构图 从上图得知,Linux
java.io.FileInputStream.read()的返回值类型为什么是int而不是byte
通过阅读InputStream类和FileInputStream类里的read()方法(native方法)的源码,read()方法的返回值有两种含义,虽然他们都是int类型。下面我们来看一下源码:/** * Reads the next byte of data from the input stream. The value byte is * returned as an <
C语言利用open、read、write等系统调用函数实现cp(文件复制)功能
话不多说,直接上代码! #include &amp;lt;sys/types.h&amp;gt; #include &amp;lt;sys/stat.h&amp;gt; #include &amp;lt;unistd.h&amp;gt; #include &amp;lt;fcntl.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;string.h&amp;gt;
linux系统调用open、write、close、read以及stat函数详解
参考链接1 、参考链接2以及百度百科 在进行C语言学习的时候我们了解到了C语言相关的一些IO操作,如fopen,fwrite,fread,fprintf,fclose等相关函数,他们都是由C库函数提供的一些函数,是将操作系统的系统调用加以封装,虽说Linux是由C语言实现的,但为了使我们更加的了解Linux,就需要了解更接近与底层的一些IO操作,因此就需要来了解下基本的...
系统调用read,write和标准库fread,fwrite的区别
read,write属于Linux系统调用,fread,fwrite属于C语言标准库 使用系统调用会影响系统的性能。与函数调用相比,系统调用的开销要大些,因为在执行系统调用时,Linux必须从运行用户代码切换到执行内核代码,然后再返回用户代码。减少这种开销的一个好方法是,在程序中尽量减少系统调用的次数,并且让每次系统调用完成尽可能多的工作。例如,每次读写大量的数据而不是每次仅读写一个字符。
JAVA IO中read()方法的返回值
以下是不太严谨的个人理解,有错误欢迎指出,共同进步:read()方法的作用是从输入流读取数据的下一个字节,返回的字节的值是一个0~255之间的整数。到达流的末尾返回-1。刚开始我以为这个返回值表示的是所读取的数据的长度,可是之后在一个示例程序中发现这种说法解释不通。我就好奇研究了一下这个返回值到底表示什么。首先要知道什么是字节(Byte)和比特(bit),它们都是计算机信息量的度量单位。 每一个二
系统调用——open、write、read和close
一、文件描述符 每一个进程都有一个与之相关的文件描述符,它们是一些小值整数,我们可以通过这些文件描述符来访问打开的文件。 一般地,一个程序开始运行时,会自动打开3个文件描述符: 0——–标准输入———-stdin 1——–标准输出———-stdout 2——–标准错误———-二、write系统调用1.write系统调用的原型:#include <unistd.h>size_t write(
[文件系统]read系统调用剖析(一)
 一:read系统调用剖析 1,kernel层的read系统调用的入口函数是在kernel/fs/Read_write.c文件中,如下所示: fget_light(fd, &fput_needed)函数的作用是根据用户层的文件描述符fd根据当前进程的current->files->fdt->fd[fd]中找到内核中的struct file结构体。 file_pos_read(fil
文章热词 CAVLC系数矩阵解析 统计学稳健估计opencv函数 设计制作学习 机器学习教程 Objective-C培训
相关热词 返回值为指针的函数c++ c++ fread返回值为0 c#中函数参数为读取文件 词汇学习系统java java学习返回值