私はそれを書き留めていない私は、ネストされたアセンブリ言語、プロセスの呼び出し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 ; }