设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

linux简单之美

2014-6-24 16:23| 发布者: joejoe0332| 查看: 2971| 评论: 0|原作者: linux.cn|来自: linux.cn

摘要: 话说windows也有syscall,这是必须的。但是win的syscall可以直接call吗?可以是可以,但是破费周折,搞成SDT之类的复杂概念。下面看看linux是如何做的吧。


  编译和以前一样:

  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的小转换.

via: http://blog.csdn.net/mydo/article/details/8224352 http://blog.csdn.net/mydo/article/details/8452386 http://blog.csdn.net/mydo/article/details/8452417 

本文地址:http://linux.cn/article-3254-1.html


酷毙

雷人
1

鲜花

鸡蛋

漂亮

刚表态过的朋友 (1 人)

  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部