x86_64でLinuxシステムコールに32ビット引数を渡すにはどうすればよいですか?

x86_64でLinuxシステムコールに32ビット引数を渡すにはどうすればよいですか?

システムコールに、uid_tまたはint(ファイル記述子用)unsigned intなどの一部の32ビットパラメータまたは一部の16ビットタイプが必要な場合は、64ビットレジスタを使用してそれをどのように渡すことができますか?

この命令を使用する前に、64ビットでゼロ拡張または符号拡張が必要ですかsyscall

元の64ビットポインタ型パラメータが32ビットになるようにRAXを使用している場合は、__X32_SYSCALL_BIT同じ64ビットレジスタを使用してパラメータを渡す必要があります。この場合、アドレスパラメータをゼロ拡張する必要がありますか?

答え1

これをゼロ拡張する必要がありますが、x86-64の32ビット値の一般的なケースでは考慮する必要はありません。 32ビットレジスタに値を格納すると、対応する64ビットレジスタはゼロ拡張されます。 (つまりmovl $4, %edx4を)に保存しますrdx。 8ビットと16ビットの値は明示的にゼロ拡張する必要があります(movzblまたはmovzwl8ビットまたは16ビットレジスタから32ビットレジスタに64ビットに暗黙的に0拡張する必要があります)。

実際にポインタでない場合、システムコールの実装は下位レベルのみを読み込みます。Nそれにもかかわらず、少なくとも32ビット値では実際の違いは見られません。 (例えばSYS_read最初の32ビットでガベージを呼び出すとRDIエラーは発生せず、下位32ビットのみが考慮されます。 )__X32_SYSCALL_BITポインタの最初の32ビットをクリアせずに設定した場合はどうなるか確認していません。

関連情報