システムコールに、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, %edx
4を)に保存しますrdx
。 8ビットと16ビットの値は明示的にゼロ拡張する必要があります(movzbl
またはmovzwl
8ビットまたは16ビットレジスタから32ビットレジスタに64ビットに暗黙的に0拡張する必要があります)。
実際にポインタでない場合、システムコールの実装は下位レベルのみを読み込みます。Nそれにもかかわらず、少なくとも32ビット値では実際の違いは見られません。 (例えばSYS_read
最初の32ビットでガベージを呼び出すとRDI
エラーは発生せず、下位32ビットのみが考慮されます。 )__X32_SYSCALL_BIT
ポインタの最初の32ビットをクリアせずに設定した場合はどうなるか確認していません。