linux简单之美

linux简单之美

(一)

话说windows也有syscall,这是必须的。但是win的syscall可以直接call吗?可以是

可以但是破费周折,搞成SDT之类的复杂概念。下面看看linux是如何做的吧。


  1. section .data
  2. msg db "hello hopy!",0x0a
  3.  
  4. section .text
  5. global _start
  6.  
  7. _start:
  8. mov eax,4
  9. mov ebx,1
  10. mov ecx,msg
  11. mov edx,12
  12. int 0x80
  13. mov eax,1
  14. mov ebx,0
  15. int 0x80

关键是系统调用号要知道,开始找的是usr/include/asm-gen*/unistd.h,

可是都不对。后来找的是usr/include/x86_64_linux_gnu/asm/下的头文件,

有2个,分别对应x86和x64.、编译连接指令如下:


  1. nasm -f elf main.asm
  2. ld main.o

运行,段转储错误鸟,查了一下,本猫用的是x64位的linux,所以要生成

x64位的程序,或者指明是x86的程序,我选择后者:


  1. ld -m elf_i386 -o main main.o

哦鸟!

(二)

我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用

C标准库中的函数快速做一些"复杂"的事:


  1. section .data
  2. ft db "now is %d",10
  3.  
  4. section .text
  5. extern puts
  6. extern exit
  7. extern sleep
  8. extern printf
  9. global main
  10.  
  11. main:
  12. mov edi,11
  13. again:
  14. dec edi
  15. push edi
  16. push ft
  17. call printf
  18. push 1
  19. call sleep
  20. cmp edi,0
  21. jnz again
  22.  
  23. push msg
  24. call puts
  25. push 0
  26. call exit
  27. msg:
  28. db "happy xxx day!",0

以上代码功能很简单,从10倒数到0,然后打印一行,最后结束.与之前代码不同的是其中

调用了C标准库中的函数.编译和以前一样:


  1. nasm -e elf main.asm

我们看看怎么连接:


  1. gcc -m32 -o main main.o

好鸟!运行正常.

值得注意的是:我的OS是ubuntu64,而asm代码中是32位的,如果开始用


  1. ld -m elf_i386 -lc -o main main.o

的方式,首先会提示找不到c库,这可以进入/usr/lib,然后使用


  1. sudo ln -sv /lib/i386-linux-gun/libc.so.6 libc.so

创建软连接解决.

但在运行时提示无法找到可执行文件!该文件明明在的!

遂用gcc来连接,但要将_start改为main,还要装载32库


  1. sudo apt-get install ia32-libs

还会提示找不到h文件,这时再装载库


  1. sudo apt-get install g++-multilib

还有2族库,如有必要也可加载:


  1. sudo apt-get install libc6:i386 libgcc1:i386 gcc-4.6-base:i386 
  2. libstdc++5:i386 libstdc++6:i386
  3. sudo apt-get install libc6-i386

最后要说的是,一些C代码在用std=c99编译时会发现提示无法获取结构大小,

这时改成如下即可:


  1. gcc -D_GNU_SOURCE -std=c99 main.c

 (三)

在(二)中我们尝试使用了C库的函数完成功能,那么能不能用syscall方式

来搞呢?显然可以!


  1. section .data
  2. ft db "now is X",10
  3.  
  4. section .text
  5. global _start
  6.  
  7. _start:
  8. mov edi,10
  9. again:
  10. dec edi
  11. mov eax,edi
  12. add eax,0x30
  13. mov byte [ft+7],al
  14.  
  15. mov eax,4
  16. mov ebx,1
  17. mov ecx,ft
  18. mov edx,9
  19. int 0x80
  20.  
  21. mov eax,162
  22. push 0
  23. push 1
  24. mov ebx,esp
  25. mov ecx,0
  26. int 0x80
  27. cmp edi,0
  28. jnz again
  29. mov eax,4
  30. mov ebx,1
  31. mov ecx,msg
  32. mov edx,15
  33. int 0x80
  34. mov eax,1
  35. mov ebx,0
  36. int 0x80
  37. msg:
  38. db "happy xxx day!",10

--


  1. nasm -f elf main.asm
  2. ld -m elf_i386 -o main main.o

在代码中延时使用的是nanosleep,其他和第一篇一致,只不过做了一个bin->ascii的小转换.

原文发布时间:2014-06-24

本文来自云栖合作伙伴“linux中国”

时间: 2024-09-16 21:13:25

linux简单之美的相关文章

linux简单之美(三)

在linux简单之美(二)中我们尝试使用了C库的函数完成功能,那么能不能用syscall方式 来搞呢?显然可以! section .data ft db "now is X",10 section .text global _start _start: mov edi,10 again: dec edi mov eax,edi add eax,0x30 mov byte [ft+7],al mov eax,4 mov ebx,1 mov ecx,ft mov edx,9 int 0x8

linux简单之美(一)

    话说windows也有syscall,这是必须的.但是win的syscall可以直接call吗?可以是 可以但是破费周折,搞成SDT之类的复杂概念.下面看看linux是如何做的吧. section .data msg db "hello hopy!",0x0a section .text global _start _start: mov eax,4 mov ebx,1 mov ecx,msg mov edx,12 int 0x80 mov eax,1 mov ebx,0 in

linux简单之美(二)

    我们在前一章中看到了如何仅仅用syscall做一些简单的事,现在我们看能不能直接调用 C标准库中的函数快速做一些"复杂"的事: section .data ft db "now is %d",10 section .text extern puts extern exit extern sleep extern printf global main main: mov edi,11 again: dec edi push edi push ft call p

9条Linux简单又实用的指令介绍

  9条Linux简单又实用的指令介绍          今天,与大家分享的是学习Linux过程中的心得体会,写下来与大家分享. 1.指令:ls 说明:ls常常用于在Console界面下,查看当前目录下文件,其中包括文档.脚本.软件包等.类似于Windows资源管理器,可以快速便捷查看. 2.指令:cd 说明:在Linux系统下,常需要切换不同路径,查看.添加或者是运行脚本等.借助cd命令可以快速切换当前工作目录. 如下所示,借助cd,路径切换到 /Desktop目录下,借助ls可以查看Desk

OpenRisc入门(18) or1200下linux简单gpio字符设备驱动

前几次我们把linux给boot通了,这所谓的移植也只是个名头而且,真正的移植有时间可以去看看\arch\openrisc下的移植代码,强调我现在也是在用而已,按我的理解的话不是真正意义的开发. 那就继续先用这吧,好,现在回来<or1200软件环境搭建>的过程来,那时我们在虚拟机cross compile了lrz和lsz文件,这是因为什么,因为现在我们只是boot通了内核,除了UART这个外设之外我们在内核或模块程序中有关于ipcores的驱动,所以,我们想在这个最简单的内核上调试程序的时,至

金山WPS for Linux 简单测评

从去年有WPS for Linux的消息到现在,Linux 版的WPS Office在经过一系列的alpha版本之后终于迎来了Beta版本.笔者也是第一时间下载安装,WPS 文字.WPS 演示和WPS 表格三组件完整呈现.作为国内老牌办公套件的金山WPS终于运行在Linux平台上,尽管来的晚些,但还是很激动,接下来就简单体验一番,看看效果如何. ▲WPS for Linux 套件 有人问怎么装?软件中心直接搜索 "WPS" 关键字就能找到了(当然这是在内测源,很快将同步到外网). 打开

Linux简单配置SendMail发送邮件

本文简单整理了一下如何在Linux服务器上安装.配置SendMail发送邮件的步骤,此文不是配置邮件服务器,具体测试环境为CentOS Linux release 7.2.1511 (Core) ,如遇特殊平台有所差别,请以实际情况为准则. Linux 系统版本查看   检查.了解系统版本信息,主要是如果使用rpm安装时,需要下载合适的版本. [root@mylnx06 ~]# more /etc/redhat-release CentOS Linux release 7.2.1511 (Cor

QQ for Linux简单体验: 简洁实用!

编辑本段QQ for Linux是什么? &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;      Tencent QQ for Linux是腾讯公司把握市场需求,针对日渐增多的Linux用户,推出的基于Linux的即时通讯软件. Linux用户期盼已久的官方QQ Linux版终于发布了,期盼的岁月是多么漫长!腾讯在今日如期发布了QQ for Linux 1.0 Preview,并且提供了rpm.deb及tar.

知意图大数据一体机诠释Hadoop简单之美

[IT168 资讯]2012 年12月3日消息,在北京开幕的HBTC 2012 (Hadoop 与大数据技术大会 2012,原 Hadoop in China) 技术盛会上,云集众多学者.企业用户以及技术领袖.大会发扬开源精神的角度,联合国际和国内 Hadoop 及大数据应用的产学界人士和成功企业,通过技术应用审视大数据技术生态系统的现状和发展趋势,围绕大数据处理.信息检索.内容挖掘.自然语言理解.数据可视化.计算广告学.地理信息系统等相关技术主题进行探讨,充分促进 Hadoop 与大数据技术在