home ホーム search 検索 -  login ログイン  | help ヘルプ

find 検索

781 - 790 / 1320    [|<]  [|<]  [<]  71  72  73  74  75  76  77  78  79  80   [>]  [>|][>|]
タイトル/名前 更新者 更新日
C言語系/呼び出し規約/x86/thiscall msakamoto-sf 2010-03-27 13:00:27
C言語系/呼び出し規約/x86/naked msakamoto-sf 2010-03-25 10:36:23
C言語系/呼び出し規約/x86/"WINAPI"他 msakamoto-sf 2010-03-19 20:32:19
C言語系/呼び出し規約/x86/"PASCAL" msakamoto-sf 2010-03-19 20:13:04
C言語系/呼び出し規約/x86/watcall msakamoto-sf 2010-03-19 18:06:27
C言語系/呼び出し規約/x86/stdcall msakamoto-sf 2010-03-19 17:43:15
C言語系/呼び出し規約/x86/cdecl msakamoto-sf 2010-03-19 17:30:32
C言語系/呼び出し規約/x86/pascal msakamoto-sf 2010-03-19 17:17:18
C言語系/呼び出し規約/x86/register msakamoto-sf 2010-03-19 17:07:24
C言語系/呼び出し規約/x86/fastcall msakamoto-sf 2010-03-19 17:07:07
ソート項目 / ソート順     1ページ 件ずつ表示

C言語系/呼び出し規約/x86/thiscall  

所有者: msakamoto-sf    作成日: 2010-03-17 10:33:52
カテゴリ: Assembler C言語 UNIX Windows 

thiscall呼び出し規約:

  • C++でクラスのメンバ関数(インスタンスメソッド)で使われる。
  • 引数はスタック上にPUSHする。(主に右から左へPUSH)
  • スタックのクリーンアップは、コンパイラや可変長引数の有無により異なる。
    • 関数(callee)側でスタックをクリーンアップする場合は、アセンブラレベルでは "RET imm16" 命令を使い、戻る時にスタックポインタを"imm16"バイト分だけ戻す。つまり、"imm16"バイト分だけSPが増える(x86ではスタックはアドレスの小さい方へ進んでいくので、「戻る」=SPのアドレス値は大きくなる)。
    • 関数を呼ぶ(caller)側でスタックをクリーンアップする場合は、アセンブラレベルではCALL命令の直後(=関数からRETした直後)に、スタックポインタ(SP)にPUSHした引数のバイト分だけ即値を加算 (ADD)する。(x86ではスタックはアドレスの小さい方へ進んでいくので、「スタックのクリーンアップ」=「戻る」=SPのアドレス値を大きくする)。
  • thiscall呼び出し規約はC++専用のため、C言語での他の呼び出し規約における装飾名のルールは使われず、C++でのmanglingがそのまま適用される。
(全て表示する)
プレーンテキスト形式でダウンロード
現在のバージョン : 7
更新者: msakamoto-sf
更新日: 2010-03-27 13:00:27
md5:5c8585ac906bab64d8906393c0a7a834
sha1:c0bfd943f33bd6d1c4bad19235ebda6c394ea246

C言語系/呼び出し規約/x86/naked  

所有者: msakamoto-sf    作成日: 2010-03-17 12:27:16
カテゴリ: Assembler C言語 Windows 

"__declspec(naked)"を関数に指定すると、コンパイラはその関数のprolog, epilogを省略する。これがNaked FunctionあるいはNaked Function Callと呼ばれる呼び出し規約である。

"naked"属性は関数の「型」とは異なり、関数本体にのみ作用する。関数プロトタイプや変数に"__declspec(naked)"を指定するとコンパイルエラーになる。"naked"属性はx86アーキテクチャでのみ有効で、x86_64(x64)やItaniumアーキテクチャでは無効。

"naked"属性を指定しない場合の典型的なprolog/epilogとは以下のような機械語のことである。
prolog:

push        ebp                ; Save ebp
mov         ebp, esp           ; Set stack frame pointer
sub         esp, localbytes    ; Allocate space for locals
push        <registers>        ; Save registers

EBPをスタックに保存した後、ESPに合わせる(スタックフレームの生成)。ローカル変数用の領域をESPをずらすことで確保し、必要であればレジスタをスタックに保存する。これが、コンパイラが自動的に生成して関数本体の前に追加するprologコードになる。

epilog:

pop         <registers>   ; Restore registers
mov         esp, ebp      ; Restore stack pointer
pop         ebp           ; Restore ebp
ret                       ; Return from function

必要であればレジスタをスタックから復元し、ESPとEBPを復元し(スタックフレームの破棄)、RET命令を呼ぶ。これが、コンパイラが自動的に生成して関数本体の後ろに追加するepilogコードになる。

"naked"属性を指定された関数では、これらprolog/epilogコードが追加されない。代わりに、インラインアセンブラ(inline assembler)を用いてprolog/epilog相当のコードを手動で実装する。仮想デバイスドライバや割り込みハンドラなど、CPUに近い処理を実装する場合に活用できる。

"naked"属性の関数内ではスタックフレームの生成が開発者に委ねられるため、コンパイラの生成するスタックフレームに依存する機能が使えなくなる。

  • returnステートメントが使えなくなる。
  • _alloca 関数, setjmp 関数が使えなくなる。
  • スタックフレームをunwindする構造化例外処理およびC++の例外処理が使えなくなる。
  • フレームポインタ最適化オプション("/Oy")は推奨されなくなる(開発者自身の手動調整が前提になるため)。
  • C++のオブジェクト生成でいくつか制限が発生する(下記MSDN参照)。
  • ローカル変数については"__LOCAL_SIZE"シンボルをprologのインラインアセンブラで使う(下記MSDN参照)。

参考MSDN:(Visual C++ のリファレンス以下)

(全て表示する)
プレーンテキスト形式でダウンロード
現在のバージョン : 3
更新者: msakamoto-sf
更新日: 2010-03-25 10:36:23
md5:f4facb9b199b11db44113cc2b0c883f1
sha1:16dedad7b0f7a3694e0b11ba5f4cb32da14bea58

C言語系/呼び出し規約/x86/"WINAPI"他  

所有者: msakamoto-sf    作成日: 2010-03-17 17:52:51
カテゴリ: Assembler C言語 Windows 

"WINAPI", "CALLBACK", "APIENTRY"はヘッダーファイルで定義された呼び出し規約で、実際にどの呼び出し規約("__stdcall", "__cdecl", "__pascal", ...)になるかは OS/コンパイラによって異なってくるので、使用する場合は注意が必要。

ただし、2010年現在の Win32 APIプラットフォームにおいては基本的にどれも "__stdcall" と考えて良い。
VC++2008, Borland C++ Compiler, OpenWatcom(32bit), MinGW-gcc 共に、この3つは"__stdcall"にdefineされている。

(全て表示する)
プレーンテキスト形式でダウンロード
現在のバージョン : 3
更新者: msakamoto-sf
更新日: 2010-03-19 20:32:19
md5:05d2de2bebda4ced35431135fdbb593d
sha1:8d2b316a8af3dde999172b8393d5909d21b889d6

C言語系/呼び出し規約/x86/"PASCAL"  

所有者: msakamoto-sf    作成日: 2010-03-17 17:25:54
カテゴリ: Assembler C言語 Windows 

"PASCAL"はヘッダーファイルで定義された呼び出し規約で、"__pascal"呼び出し規約のことではない。
実際にどの呼び出し規約("__stdcall", "__cdecl", "__pascal", ...)になるかは、OS/コンパイラによって異なってくるので、使用する場合は注意が必要。

ただし、2010年現在の Win32 APIプラットフォームにおいては基本的に PASCAL == "__stdcall" と考えて良い。
VC++2008, Borland C++ Compiler, OpenWatcom(32bit), MinGW-gcc 共に、PASCALは"__stdcall"にdefineされている。

(全て表示する)
プレーンテキスト形式でダウンロード
現在のバージョン : 3
更新者: msakamoto-sf
更新日: 2010-03-19 20:13:04
md5:27a45baeded37804789044507b7aa922
sha1:20e4367b603e88e52d04eccec241b0210ce0d9fe

C言語系/呼び出し規約/x86/watcall  

所有者: msakamoto-sf    作成日: 2010-03-19 17:51:00
カテゴリ: Assembler C言語 Windows 

OpenWatcom で特に呼び出し規約を指定しない場合のデフォルトの呼び出し規約。

OpenWatcomでは、main()関数は強制的に __watcall 呼び出し規約になる(他の呼び出し規約を指定しても、無視される)。(ただし実験した結果であって、マニュアル・ドキュメント上でこの点について記載されているかは未確認)

(全て表示する)
プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2010-03-19 18:06:27
md5:9822a63f4ab0173827cf16ff500085dd
sha1:8233e74b10e61f47f31962f29a8e96903701454d

C言語系/呼び出し規約/x86/stdcall  

所有者: msakamoto-sf    作成日: 2010-03-17 10:28:45
カテゴリ: Assembler C言語 UNIX Windows 

__stdcall呼び出し規約:

  • 引数はスタック上にPUSHする。(主に右から左へPUSH)
  • 関数(callee)側でスタックをクリーンアップする。
    • アセンブラレベルではRET imm16命令を使って、戻る時にスタックポインタを"imm16"バイト分だけ戻す。つまり、"imm16"バイト分だけSPが増える(x86ではスタックはアドレスの小さい方へ進んでいくので、「戻る」=SPのアドレス値は大きくなる)。
(全て表示する)
プレーンテキスト形式でダウンロード
現在のバージョン : 5
更新者: msakamoto-sf
更新日: 2010-03-19 17:43:15
md5:bce93e08624ecdeb059fb8e94b6baaf4
sha1:d5eae70b7909db67cf545746be596b036adea2c6

C言語系/呼び出し規約/x86/cdecl  

所有者: msakamoto-sf    作成日: 2010-03-17 10:31:36
カテゴリ: Assembler C言語 UNIX Windows 

__cdecl呼び出し規約:

  • 引数はスタック上にPUSHする。(主に右から左へPUSH)
  • 関数を呼ぶ(caller)側でスタックをクリーンアップする。
    • アセンブラレベルではCALL命令の直後(=関数からRETした直後)に、スタックポインタ(SP)にPUSHした引数のバイト分だけ即値を加算(ADD)する。(x86ではスタックはアドレスの小さい方へ進んでいくので、「スタックのクリーンアップ」=「戻る」=SPのアドレス値を大きくする)。
  • 可変長引数を使う場合はこの呼び出し規約を使う必要がある。
    • 通常、引数がいくつPUSHされたのかを正確に判断出来るのは関数を呼ぶ側(caller)だけ。よってスタックのクリーンアップも関数を呼ぶ側(caller)で行う "__cdecl" を使う必要がある。
    • 装飾名に引数のスタック上のバイト数が含まれないのも、可変長引数を意識しているため。
  • UNIX系のシステムの場合は、基本的に "__cdecl" が使われる。
example:
PUSH arg3  ; 4byte
PUSH arg2  ; 2byte
PUSH arg1  ; 1byte
CALL _foobar
ADD ESP, 7 ; スタックポインタを7バイト戻す
(全て表示する)
プレーンテキスト形式でダウンロード
現在のバージョン : 7
更新者: msakamoto-sf
更新日: 2010-03-19 17:30:32
md5:fb473605886f56f37a215e41b6b30af1
sha1:c043de074b57ede5221d5ea7ad8509c0960c3154

C言語系/呼び出し規約/x86/pascal  

所有者: msakamoto-sf    作成日: 2010-03-17 10:32:44
カテゴリ: Assembler C言語 UNIX Windows 

__pascal呼び出し規約:

  • 引数はスタック上にPUSHする。(主に左から右へPUSH)
  • 関数(callee)側でスタックをクリーンアップする。
    • アセンブラレベルではRET imm16命令を使って、戻る時にスタックポインタを"imm16"バイト分だけ戻す。つまり、"imm16"バイト分だけSPが増える(x86ではスタックはアドレスの小さい方へ進んでいくので、「戻る」=SPのアドレス値は大きくなる)。
(全て表示する)
プレーンテキスト形式でダウンロード
現在のバージョン : 6
更新者: msakamoto-sf
更新日: 2010-03-19 17:17:18
md5:b5fc5e66d0d2a3713f69657e2304d9df
sha1:4c2e2f78a4d438c00a8a1ae95d58de882e0affd1

C言語系/呼び出し規約/x86/register  

所有者: msakamoto-sf    作成日: 2010-03-17 13:31:06
カテゴリ: Assembler C言語 Windows 

Borlandのfastcallの別名。Delphiではこちらの名前を使っている。

なおあくまでも "Delphi用の" 名前で、Borland C++ Compiler(Borland C++ 5.5.1)の方では対応していない。Borland C++ Compilerでは代わりに "__fastcall" を指定する。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2010-03-19 17:07:24
md5:cccc2c4e6a0a219334197c75cb282a26
sha1:72163a0746ccdf5a00e20662920e3316ea68704a

C言語系/呼び出し規約/x86/fastcall  

所有者: msakamoto-sf    作成日: 2010-03-17 10:32:13
カテゴリ: Assembler C言語 UNIX Windows 

__fastcall呼び出し規約:

  • 一部の引数はレジスタ経由で渡される。
    • 残りの引数はスタック上にPUSHする。(主に右から左へPUSH)
  • (スタック渡しの引数がある場合は)関数(callee)側でスタックをクリーンアップする。
    • アセンブラレベルではRET imm16命令を使って、戻る時にスタックポインタを"imm16"バイト分だけ戻す。つまり、"imm16"バイト分だけSPが増える(x86ではスタックはアドレスの小さい方へ進んでいくので、「戻る」=SPのアドレス値は大きくなる)。
  • Borland C++ Compilerにおいて、Delphi互換の "__fastcall" と Microsoft互換の "__msfastcall" の二種類がある点に注意すること。("__fastcall"と"__msfastcall"との間には互換性は無い。)
(全て表示する)
プレーンテキスト形式でダウンロード
現在のバージョン : 8
更新者: msakamoto-sf
更新日: 2010-03-19 17:07:07
md5:872e21c7b1f16514590a19e6a2fea7e7
sha1:ea3dabfc74086fb26a9262d646492cd50b326ea7