【Linux x86汇编踩坑】文件读写
前言
linux的文件是unix的文件处理方式,因此,无论linux文件是什么程序创建的,都可以作为连续的字节流进行访问,明确这一点是相当重要的。
文件调用号
首先看看几个关于文件的系统调用号
3 //读
4 //写
5 //打开
6 //关闭
如果想知道更多linux系统调用号请移步Linux系统调用号。
对文件的操作都需要系统来完成,因此当我们需要打开或者读写一个文件时,需要向系统发出中断信号,由系统来完成这些操作,因为操作系统的安全性,这些对文件的操作都是放在管态中执行的,向系统发送中断信号都是通知cpu从目态进入管态。所以在文件读写中,向系统发送中断信号是必不可少的。
打开文件
当我们需要打开一个文件时,我们要告诉linux打开的文件名,并以特定的方式打开(read,write,create等),这是通过open系统调用处理的,通常来说,需要对文件操作都要经过打开这一步骤,但是有三个文件例外,这三个文件不是说不需要打开,而是系统在程序运行的过程中就已经帮我们完成了,它们是stdin,stdout,stderr分别对应标准输入文件,标准输出文件,标准错误文件,stdin通常指代键盘,用来接收键盘的输入,stdout通常指带屏幕,用来输出东西在屏幕上,stderr,当有错误发生的时,可以往里面写入错误信息。
在打开文件之前,我们需要将系统调用号放入%eax,文件的首地址放在%ebx中,以数字表示的读写意图放在%ecx中(通常用0来表示读,03101表示写),权限集合作为数字放在%edx中(默认为0666)。
把指定的信息放入相应的寄存器之后,就可以向系统发送中断信号来通知打开文件了。
打开文件过后,文件描述符通常放在%eax中,文件描述符可以代表一个文件,在整个程序中你都可以通过文件描述符对文件进行操作,在文件使用完毕后,你可以通知linux将文件关闭,这时,你的文件描述符不会有效。
以下是一个简单的打开文件示例,我们以打开当前目录下的data文件为例
openFile.s