読書では - ときは、「図書館とプログラマの自己修養ローディングリンク、」第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型」ではなく「システムコール」システムコールを使用します