操作系统都开始向64位过度了,但大部分教材教程书籍资料还停留在32位,绝大部分语言不用care这个问题,但汇编还是有较大变化的。
C语言代码:
int main()
{
exit(2);
}
32位汇编实现上述C语言代码相同功能:
.section .data
.section .text
.global _start
_start:
movl $1, %eax
movl $2, %ebx
int $0x80
64位Linux系统汇编以上代码:
$ as -32 -o exit.o exit.s
链接:
$ ld -m elf_i386 -o exit exit.o
运行:
$ ./exit
查看运行结果:
$ echo $?
相同功能的64位版本:
.section .data
.section .text
.global _start
_start:
movq $60, %rax
movq $2, %rdi
syscall
汇编:
$ as -o exit.o exit.s
链接:
$ ld -o exit exit.o
运行和查看运行结果同32位:
$ ./exit
$ echo $?
32位汇编和64位汇编区别:
寄存器名不同,分别是eax和rax
系统调用号不同,详见文件/usr/include/asm/unistd_32.h 和 unistd_64.h
系统调用参数所用寄存器不同,32位是ebx,ecx,edx而64位是rdi,rsi,rdx
系统调用触发指令不同,分别是int 80和syscall