CのCの関数呼び出しのgccのインラインアセンブリコード:私はちょうど証明するためにされていました

私はそれを書き留めていない私は、ネストされたアセンブリ言語、プロセスの呼び出しC関数アセンブリコードcは、将来的にまだあったとき、私は覚えていないんです。

データのオンラインビューで、1日の午後をトスして、私が遭遇した問題を解決するためにCコードにコピーするネストされたモデルのコンパイル、最終的には無駄ですべてを見つけることができます。

私の最初の理解によると、アセンブラは、C cで時間のネストされた関数を呼び出すには、あまりにも多くのパラメータCの関数のアセンブリコードを書くことができないとき、パラメータの数に相当な制限を持っているようです。

I C関数のパラメータが3に増加した場合、次のコードは、私が達成するためのパラメータを追加するための簡単なアセンブリコードでアセンブリコードを書き、ないではないでしょう。

増加パラメータよりも、コードがコンパイルされ、それはエラーがスローされます:「ASM」オペランドが不可能な制約があります|(オペランド制約不可能「のasm」)

私は完全に放棄された、それを呼び出します。

 

INT ABC2(int型int型B)
{ 
のprintf(" の\ n " ); 

printf(" 参数(%d)が:%Dを\ n "、&、A)。
printf(" 参数B(%d)が:%Dを\ n "、&B、B)。
// のprintf( "参数C(%d)が:%Dを\ n"、&C、C)。
// printfの( "参数D(%d)は:%dは\ nを"、&D、D)。

戻る > bは?A:B; 
} 

 

int型のmain(int型 ARGC、CHAR * ARGV [])
{ 
ボイド * saved_my_esp、* target_addr。return_eax、return_edx。

無効 * FUNC = ABC2。

int型 = 10 ;
INT B = 20 INT C = 30 int型の D = 40 ; 

printf(" &:%dは\ nを"、&​​A )。
printf(" &B:%d個の\ n "、&B)。
printf(" &FUNC:%dは\ nを" 、FUNC)。


// 参考:https://bbs.csdn.net/topics/360148698 


__asm__ __volatile__(

" MOVL %% ESP、%0; " 

" MOVL%3、"  // 变量:D 
" プッシュ%% EAX; " 

" MOVL 4%、%% EAX。"  // 变量:C 
" プッシュ%% EAX; " 


" MOVL 5%、%% EAX。"  // 函数
" コール* %% EAX; " 

" MOV %% EAX、%1。" 
" MOVの%%のEDX、%2。" 
" MOVL%0、%% EAX。" 

// "MOVL %% EAX、%% ESP;"/ **加这一句、就出错** / 
" + M "(saved_my_esp)、" = M "(return_eax)、"
" R "(B)、" R "(A)、" R "(FUNC)// 关于M、R说明:https://www.cnblogs.com/Jezze/archive/2011/12/23/2299838。 HTML 
" %のEAX "" %のEDX "" ESP%" 
)。

printf(" saved_my_esp:%dは\ nを" 、saved_my_esp)。
printf(" return_eax:%dは\ nを" 、return_eax)。
printf(" return_edx:%dは\ nを" 、return_edx)。
" ); 

// のprintf(" RETURN_VALUE: '%s'は\ n "は、return_eax
 // printfの( "RETURN_VALUE:%dは\ nを"、*(int型*)return_eax);
 // のprintf(" RETURN_VALUE:%LF \ N "*(フロート*)return_eax);
 // のprintf( "RETURN_VALUE:%dは\ nを"、*(BYTE *)return_eax); 

のprintf(" RETURN_VALUE:%dは\ nを" 、return_eax); 

のprintf(" \ N " ); 

のprintf(" ------------------端------------- \ n " ); 

戻り 0 ; 

}

 

おすすめ

転載: www.cnblogs.com/personnel/p/11414480.html