linux下64位汇编的系统调用(3)
来源:互联网 发布:mac recovery mode 编辑:程序博客网 时间:2024/06/04 18:14
背景知识基本交代清楚了,下面我们实际写一个小例子看一下。代码的功能很简单,显示一行文本,然后退出。我们使用了syscall中的write和exit调用,查一下前面的调用号和参数,我们初步总结如下:
write(即sys_write)调用号为1,需传递3个参数
unsigned int fdconst char *bufsize_t count
exit(sys_exit)调用号为60,只需传递一个错误码
int error_code
如果该值为0表示程序执行成功。
因为以上两个调用最多的也只有3个参数,所以我们依次只会用到3个寄存器rdi,rsi和rdx。
实际代码如下:
section .text;if use ldglobal _start;if use gcc;global main_start:;main mov rax,1 ;write NO mov rdx,1 ;fd mov rsi,msg ;addr of msg string mov rdx,msg_len ;lenght of msg string syscall mov rax,60 ;exit NO mov rdi,0 ;error_code syscall msg: db "Hello World!",0xa msg_len:equ $-msg
编译连接命令如下:
nasm -f elf64 p.sld -o p p.o
如果是mac os x系统下命令如下:
nasm -f macho64 p.sld -o p p.o
因为本博的标题是linux下的汇编,所以mac os x下请参考本猫另一篇博文[Mac OS X64位以及32位汇编系统调用]。
如果你要生成32位的代码,在编译时把elf64改为elf32就可以了,不过我前面说过:32位和64位汇编结构变化较大,光改这个是没办法运行成功的。
不出所料代码运行输出一行:Hello World!并且程序返回后用echo $?看,应该为0.
这个例子很简单,下面看一下稍微复杂点的调用:mmap,该调用共有6个参数,我们再一次总结如下:
mmap(sys_mmap) 系统调用号为9,参数分别为:
unsigned long addrunsigned long lenunsigned long protunsigned long flagsunsigned long fdunsigned long offset
第一个参数是需要映射到的地址,我们这里传0,表示不关心映射到哪;第二个参数是映射空间的大小;第三个参数表示映射区域的保护方式,有很多种,我们这里只让它可读可写即可,所以只用到2者的组合:
PROT_WRITE|PROT_READ
第四个参数是映射区域的一些特性,有很多组合。这里只用MAP_SHARED|MAP_ANONYMOUS,后者表示建立匿名映射,会忽略参数fd,所以不设及文件。
第五个参数就是fd,前面说了可以忽略,所以我们传递-1;最后一个参数是映射的偏移量,我们也传递0.
该调用如果成功返回映射区域内存的起始地址,否则返回MAP_FAILED(-1),错误原因存于errno中,我们可以用strerror(errno)查看具体含义。不过该函数是C库中的,这里我们捎带的用一下。
提到mmap我们不得不提到munmap,用猜大家也知道该调用的含义吧:
munmap(sys_munmap) 调用号为11,需传递2个参数:
unsigned long startsize_t len
- linux下64位汇编的系统调用(3)
- linux下64位汇编的系统调用(1)
- linux下64位汇编的系统调用(2)
- linux下64位汇编的系统调用(4)
- linux下64位汇编的系统调用(5)
- 64位汇编之linux系统调用
- linux系统调用64位汇编与32位汇编不同及兼容
- Linux 下的64位汇编
- linux下32位汇编调用规则
- Mac OS X下64位汇编与Linux下64位汇编的一些不同
- linux 64位系统调用
- Window7的64位系统下配置32位的汇编环境的心得
- Linux汇编教程14:系统调用和文件处理下
- Windows下的64位汇编(1)
- 64位linux 汇编
- 64位Linux汇编
- 64位Linux汇编
- 64位cmd下调用32位系统下的操作指令
- maven依赖范围的解释
- 执行一条sql语句,参数传递越简单越好
- 社説 20150412 イエメン情勢 中東の混乱拡大を憂慮する
- EasyUI的combobox组件Chrome浏览器不兼容问题解决办法
- Function.prototype.bind
- linux下64位汇编的系统调用(3)
- 寻找最大数
- 社説 20150412 将来の電源構成 安定供給と料金抑制が優先だ
- malloc 与 calloc 的使用区别
- unity 友盟社会化分享 微信发送被拒绝
- (others)BGP4
- C++ MFC combo box和list control控件的使用
- Math(数学对象)
- HDOJ 2082 找单词