2012-01-14 23 views
1

私のasmプロジェクトからC関数を呼び出す際の作業。nasm x86-64からc関数を呼び出す

私は整数値をc関数にプッシュしようとしています。

私のコード

mov rdi, [input] 
push rdi     ;push rdi into stack for c function to work with 
call dtoch 
pop rdi     ;to keep stack balanced 

「 私が間違っているレジスタへの入力を移動するのですか?

LinuxのUbuntu OSで実行しても、エラーが表示されず、正しい値が表示されないだけです。

私はC environementで関数を実行すると問題なく動作しますが、自分のnasmプロジェクトでは間違った数値が出力されます。

C機能:

void dtoch(int d) 
{ 
int n , r[10], i = 0, number, j = 0; 
while (number > 0) 
{ 
r[i] = number%16; 
number = number/16; 
i++; 
j++; 
} 
printf ("It's hexadecimal equivalent is: "); 
for (i = j -1; i > = 0; i--) 
{ 
if (r[i] == 10) 
printf("A"); 
else if (r[i] == 11) 
printf("B"); 
else if (r[i] == 12) 
printf("C"); 
else if (r[i] == 13) 
printf("D"); 
else if (r[i] == 14) 
printf("E"); 
else if (r[i] == 15) 
printf("F"); 
else 
printf("%d", r[i]); 
} 

} 
+0

呼び出される関数は、引数をスタックにプッシュするために使用するレジスタを気にしません。 C関数の呼び出し規約は何ですか?エラーが発生していますか?あなたはより多くの情報を提供する必要があります。 –

+0

どのオペレーティングシステムですか? – zvrba

+0

C関数プロトタイプを表示します。 –

答えて

1

のx64は__fastcallのみを使用して、Linux用、AMD64 ABIが使用され、thisを参照してください、Windows上で(Agner霧のoptimization manuals違いや、この素敵な夏のテーブルon wikipediaについてを参照してください(マイクロソフトABI))。 Linuxで実行しているたとえば

、あなたは何PUSH S(とペアPOP年代)はを必要としない、RDIでそれをしたいです。完全なAMD64 ABI hereを見直すことができます。これには、いくつかのコーディング用のsmaplesが含まれています(ウィンドウ上では、RCXに1つのargを入れてもらいたい、もう一度PUSHが必要です)。

簡単なヒント:アセンブリの出力を使ってc呼び出しをコンパイルし、コンパイラが生成するコードを確認することができます.GCCのオプション-Wa,-adhln -gはそのトリックを行う必要があります。

+0

プッシュとポップを削除しようとしました。関数を "number"変数に変換しますが、実行するたびに2の汎用数を与えるだけです。 – user1050632

関連する問題