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