Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30678
  • 博文数量: 3
  • 博客积分: 197
  • 博客等级: 入伍新兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-18 00:48
文章分类
文章存档

2012年(1)

2011年(1)

2010年(1)

分类: LINUX

2012-01-23 23:59:48

linux系统中64位汇编和32位汇编的系统调用主要有以下不同:
(1)系统调用号不同.比如x86中sys_write是4,
sys_exit是1;而x86_64中sys_write是1, sys_exit是60。linux系统调用号实际上定义在/usr/include/asm/unistd_32.h和/usr/include/asm/unistd_64.h中。
(2)系统调用所使用的寄存器不同,x86_64中
使用与eax对应的rax传递系统调用号,但是  x86_64中分别使用rdi/rsi/rdx传递前三个参数,而不是x86中的ebx/ecx/edx。
(3)系统调用使用“syscall”而不是“int 80”。


一个简单的输出命令行参数的程序

  1. .text
  2. .globl _staet

  3. _staet:
  4. popq %rsi

  5. vnext:
  6. popq %rsi
  7. test %rsi, %rsi
  8. jz exit
  9. movq %rsi, %rdi
  10. xorq %rdx, %rdx

  11. strlen:
  12. movb (%rdi), %al
  13. inc %rdx
  14. inc %rdi
  15. test %al, %al
  16. jnz strlen
  17. movb $10, -1(%rdi)
  18. movq $1, %rax
  19. movq $1, %rdi
  20. syscall
  21. jmp vnext

  22. exit:
  23. movq $60, %rax
  24. movq $0, %rdi
  25. syscall

  26. ret
阅读(3830) | 评论(0) | 转发(0) |
0

上一篇:grep 技巧10则

下一篇:没有了

给主人留下些什么吧!~~