最小の実行可能ファイル

読書では - ときは、「図書館とプログラマの自己修養ローディングリンク、」第4章では、静的にリンク== == == == 4.6.2最小プログラム、それはプログラムlinux32ビットシステムではなく、64に基づいていることを発見ビットシステムは、コンパイルして実行します。

正しい64ビットプログラムはする必要があります

コード

char *str = "Hello world!\n";

void print(){
    asm("movq $13,%%rdx \n\t"
        "movq %0,%%rsi \n\t"
        "movq $0,%%rdi \n\t"
        "movq $1,%%rax \n\t"
        "syscall \n\t" 
        ::"r"(str) : "rdx", "rsi", "rdi");
}

void exit(){
    asm("movq $42,%rdi \n\t"
        "movq $60,%rax \n\t"
        "syscall \n\t");
}

void nomain(){
    print();
    exit();
}

業績

業績

理由

主に次の方法でコンパイルされたLinuxのコンパイルシステム64ビットおよび32ビットシステムコール:

  • このようなのx86 SYS_WRITEような異なるシステムのコール数が4である、sys_exitは1であり; x86_64でのながら
    SYS_WRITEが1で、60をsys_exit。Linuxのシステムコール番号は、実際にある/usr/include/asm/unistd_32.hと/usr/include/asm/unistd_64.hで定義されています。
  • システムコール異なるレジスタがx86_64では、RDXは、代わりのx86 EBX / ECX / EDXの、最初の3つのパラメータを渡さ/ RDI / RSIを使用した>対応RAX送達システムコール番号を使用して、x86_64でのEAX、使用、しかし。
  • 「80のint型」ではなく「システムコール」システムコールを使用します

おすすめ

転載: www.cnblogs.com/LiShiZhen/p/11494429.html