ホームに戻る
 Cとアセンブラの競合

;
;   アセンブラ
;

segment .code USE32

global _f

_f:
  push    ebp
  mov     ebp, esp

  mov     eax, dword [ebp+8]
  mov     dword [eax], 4

  mov     eax, 5

  leave
  ret 
__end__mmx

/*
*   C言語
*/

#include <stdio.h>

extern int f(int *x);

int main()
{
  int a = 3, b;

  b = f(&a);

  printf("\na = %d", a);
  printf("\nb = %d", b);

  return 0;
}


このプログラムについて

Cで書くと以下のようになる処理をアセンブラで書いています。

int f(int *x){
  *x = 4;
  return 5;
}

関数名 f という名前でリンクしています。

Borland C++ Compiler の場合 -S をオプションにしてコンパイルすると、
C言語をアセンブラにまで展開することができます。
この方法でリンクの仕方を調べると関数名の前に _ をつけることがわかり、
引数はスタックに格納され、戻り値は eax に格納して返しているようです。

inserted by FC2 system