3

.c アセンブリ コードを呼び出す方法があるかどうか知りたいですか? このコードを .c ファイルに入れたい

アドレスを返すために.cファイルで実行したいアセンブリコード

1. mov eax, 0x2d
2. mov ebx, 0
3. int 0x80

私は答えが置かれていることを知っています。

これは .c ファイルの一部です。

1. void function(void)
2. {
3. void *sp;
4. sp = eax;
5. fprintf(stderr, "system break:   %p\n", sp);
6. }

どうすればいいですか?

4

5 に答える 5

7

これを行う機能は、コンパイラ固有です。Gcc はキーワード extensionを使用してasmこれを許可しますが、Visual Studio は別の拡張子を実装します。

他のアーキテクチャへの移植性がないという明らかな問題に加えて、インライン アセンブリを含めるとパフォーマンスが低下する可能性があることに注意してください。これは、コンパイラがアセンブリを分析して、アセンブリに副作用がないかどうか、インライン化しても安全かどうか、グローバル リソースにアクセスするかどうかを判断できないためです。 、 等々。

于 2012-11-03T08:36:11.020 に答える
3

一部のコンパイラは、__asm__またはasmキーワードを C 言語の拡張機能として実装しています。

__asm__(
    "mov eax, 0x2d\n"
    "mov ebx, 0\n"
    "int 0x80\n"
);

括弧内のコードは、アセンブラの入力にそのままコピーされます。たとえば、GCC がこの機能をどのように実装するかについての詳細なドキュメントは、ここにあります。

ところで、スタック ポインタの値を変更したい場合 (なぜ? )、1 行で実行できます。

__asm__("mov esp, eax");
于 2012-11-03T08:36:48.757 に答える
2
void function(void){

   void *sp
   __asm__ volatile(
   "movl $0x2d, %%eax;"
   "movl $0, %%ebx;"
   "int $0x80"
   :"=a"(sp)
   :
   :"%ebx"
   );

   fprintf(stderr, "system break: %p\n",sp);
   }

これが私の答えです:)

于 2012-11-04T21:55:38.003 に答える