ホームに戻る
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 に格納して返しているようです。