设为首页收藏本站

LUPA开源社区

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

linux简单之美

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

摘要: 话说windows也有syscall,这是必须的。但是win的syscall可以直接call吗?可以是可以,但是破费周折,搞成SDT之类的复杂概念。下面看看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

鲜花

鸡蛋

漂亮

刚表态过的朋友 (1 人)

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

最新评论

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