linux 64位调用

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 
 4     _staet:
 5     popq %rsi
 6 
 7     vnext:
 8     popq %rsi
 9     test %rsi, %rsi
10     jz exit
11     movq %rsi, %rdi
12     xorq %rdx, %rdx
13 
14     strlen:
15     movb (%rdi), %al
16     inc %rdx
17     inc %rdi
18     test %al, %al
19     jnz strlen
20     movb $10, -1(%rdi)
21     movq $1, %rax
22     movq $1, %rdi
23     syscall
24     jmp vnext
25 
26     exit:
27     movq $60, %rax
28     movq $0, %rdi
29     syscall
30 
31     ret

 

转自:http://blog.chinaunix.net/uid-23745546-id-3061344.html

 

posted on 2016-10-31 16:28  徐北枳  阅读(255)  评论(0编辑  收藏  举报