2016-09-11 13 views
0

ファイルを記述するstruct statを得るためには、構造体の値を渡したポインタによって指し示されるメモリを満たす*関数ファミリを呼び出します。 アセンブリからのstat struct呼び出しのフィールドオフセットを調べる方法は?

C では、マクロoffsetofはPOSIX.1-2008を呼び出すことができますが、それは、マクロ、アセンブリでは使用できません。 1のようにst_sizest_modeなど、必要なフィールドを抽出することができるように、アセンブリとどのようにフィールドのオフセットを決定するための構造体のサイズを決定する方法

答えて

1

プラットフォームのABIは、C構造体のパディングの規則を決定します。たとえば、x86-64 Linuxではthe x86-64 System V ABIが使用されます。

難しい方法:ABIを読んで自分で解決してください。 タグwikiのリンク。 (実際にはそれほど難しいことではありませんが、構造体内のアライメント/パディングのルールは非常に単純です:すべてのメンバーが宣言順になり、自然にアライメントされます。

簡単な方法:構造体に格納する関数を記述してコンパイラにオフセットを計算させ、asmを調べます。

Godbolt compiler explorerから)

#include <sys/stat.h> 
void foo(struct stat *st) { 
    st->st_size = 1; 
    st->st_mode = 2; // different numbers so you know which field is which in the output 
} 

    mov  QWORD PTR [rdi+48], 1 
    mov  DWORD PTR [rdi+24], 2 
    ret 

+0

あなたは「...コンパイラの計算をしましょう」に、より詳しく説明してください、どこAMD64プラットフォーム用のABIを見つけるためにもらえますか? –

+0

@BulatM。 amd64には2つのABIがあります。 Windowsと他のもの(amd64 SysV ABI)は他のほとんどのオペレーティングシステムで使用されています。あなたはどれが欲しいですか? – fuz

+1

@BulatM .: ABIは[x86タグwiki](http://stackoverflow.com/tags/x86/info)にリンクしています。 –

関連する問題