汇编语言调用Linux系统调用read和write
.section .data
UserMsg:
.ascii "Please input the message:"
LenOfUserMsg:
.equ lenMsg, LenOfUserMsg - UserMsg
#.section .bss
# .lcomm resb,
OutputMsg:
.ascii "This is your input:"
LenOfOutputMsg:
.equ lenOutput, LenOfOutputMsg - OutputMsg
.section .bss
.lcomm resb, .section .text
.globl _start
_start:
#display UserMsg
movl $, %eax
movl $, %ecx
movl $UserMsg, %ecx
movl $lenMsg, %edx
int $0x80 #Read what input
movl $, %eax
movl $, %ebx
movl $resb, %ecx
movl $, %edx
int $0x80 #dispaly what you input
movl $, %eax
movl $, %ebx
movl $OutputMsg, %ecx
movl $lenOutput, %edx
int $0x80 movl $, %eax
movl $, %ebx
movl $resb, %ecx
movl $, %edx
int $0x80 movl $, %eax
movl $, %ebx
int $0x80
代码就是这样的。要做什么呢?
很简单:运行后,命令行提示你输入数字或者是字符,然后回车,把你输入的现实出来。
显然,这个用C语言实现起来简直太简单了。
但是,用汇编实现起来同样很简单。
==========知识准备============
在汇编中使用系统调用,只要是将系统调用号复制到eax寄存器。
可以看到每个系统调用都有一个系统调用号。
然后,系统调用必然要使用终端。这里使用的是软中断。int $0x80
比如,要使用exit这个系统调用
movl $1, %eax
int $0x80
某些系统调用有参数,怎么办呢?
在C样式函数中,输入参数存放在堆栈中;系统调用与之不同,需要输入参数被存放在寄存器中。每个输入值按照特定的顺序放到寄存器中。
简而言之。
按照顺序:
ebx (第1个输入参数)
ecx (第2个输入参数)
edx (第3个输入参数)
esi (第4个输入参数)
edi (第5个输入参数)
具体的输入顺序,就取决于系统调用中参数的顺序。比如,write(fd, *buf, count)
那么,ebx就是fd,ecx就是*buf,edx就是count
=========程序代码简要说明=============
ebx:文件描述符
ecx:指向要写入的字符串的指针
edx:要写入的字符串长度
write系统调用的值是4,将它存到eax寄存器中。然后将各个参数存放到相应的寄存器中。
需要指出,Linux中,0表示标准输入一般是键盘,1表示标准输出一般是终端屏幕。
首先在终端屏幕打印字符,提示你输入。输入后,使用read存放到一个内存区域。
在使用,write将相应区域的输入值打印出来。
要指出的是,$UserMsg将标签的内存地址存放到ecx中,而不是将实际存放在内存中的值放在ecx中。
附录:
汇编语言调用Linux系统调用read和write的更多相关文章
- 使用 Linux 系统调用的内核命令【转】
转自:http://www.ibm.com/developerworks/cn/linux/l-system-calls/ 探究 SCI 并添加自己的调用 Linux® 系统调用 —— 我们每天都在使 ...
- 【原创】xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
版权声明:本文为本文为博主原创文章,转载请注明出处.如有错误,欢迎指正. 1. 引出问题 上一篇文章xenomai内核解析--双核系统调用(一)以X86处理器为例,分析了xenomai内核调用的流程, ...
- Linux系统调用和库函数调用的区别
Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思 ...
- linux系统调用和库函数调用的区别(转)
Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).可以参考<Linux程序设计>(英文原版为<Beginning ...
- 关于Linux系统调用,内核函数【转】
转自:http://blog.csdn.net/ubuntulover/article/details/5988220 早上听人说到某个程序的一部分是内核态,另一部分是用户态,需要怎么怎么.当时突然想 ...
- Linux系统调用(转载)
目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...
- Linux系统调用的实现机制分析
API/POSIX/C库的关系 系统调用的实现 3.1 系统调用处理程序 添加新系统调用 给Linux添加一个新的系统调用是件相对容易的工作.怎样设计和实现一个系统调用是难题所在, ...
- linux内核剖析(六)Linux系统调用详解(实现机制分析)
本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系.然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递 ...
- Linux系统调用的运行过程【转】
本文转自:http://blog.csdn.net/kernel_learner/article/details/7331505 在Linux中,系统调用是用户空间访问内核的唯一手段,它们是内核唯一的 ...
随机推荐
- [LeetCode] 675. Cut Off Trees for Golf Event_Hard tag: BFS
You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...
- JVM、Java编译器和Java解释器
作用: JVM:JVM有自己完善的硬件架构,如处理器.堆栈(Stack).寄存器等,还具有相应的指令系统(字节码就是一种指令格式).JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需要生成 ...
- css样式属性-字体和隐藏
1.字体 font-family:字体: <body> <div style="font-family:宋体">宋体</div> </bo ...
- Maven的常用功能
一.jar包管理(仓库) 最佳实践: 1:排除依赖 pom中依赖了某个第三方API,此API又依赖其它API,有可能出问题.(必须申明排除该第三方依赖) Spring-core又隐式的依赖了commo ...
- VC++文件操作之最全篇
一.剖析VC中的文件操作 各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分 ...
- Linux命令:删除与恢复命令
敲命令按以下顺序 ①vim filename ②e ③i ④ESC 删除命令: x(小写):删除光标所在处字符. dd:删除光标所在的行. D:删除从光标所在之处开始直到该行末尾的全部字符. < ...
- css去掉a标签点击后的虚线框,outline,this.blur()
css去掉a标签点击后的虚线框,outline,this.blur() outline是css3的一个属性,用的很少.声明,这是个不能兼容的css属性,在ie6.ie7.遨游浏览器都不兼容. outl ...
- checkbox的readonly不起作用的解决方案
checkbox的readonly不起作用的解决方案 <input type="checkbox" readonly /> checkbox没有readOnly属性,r ...
- Redis设置密码重启后失效的解决方案
原因可能有两个: 1.只是单纯的通过命令行设置了密码,这种设置方式是临时的,当服务器重启后,密码会失效. config set requirepass yourPassword 解决方案:在redis ...
- 从Oracle到MySQL,余额宝云实践分享
原文链接:http://www.csdn.net/article/2013-11-/2817426-interview-financial-case-yuerbao-aliyun07 余额宝.百度百发 ...