64位Linux汇编

来源:互联网 发布:数据结构英文版 c语言 编辑:程序博客网 时间:2024/05/16 00:30

操作系统都开始向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位汇编区别:

  1. 寄存器名不同,分别是eax和rax
  2. 系统调用号不同,详见文件/usr/include/asm/unistd_32.h 和 unistd_64.h
  3. 系统调用参数所用寄存器不同,32位是ebx,ecx,edx而64位是rdi,rsi,rdx
  4. 系统调用触发指令不同,分别是int 80和syscall


0 0