2009-10-12 8 views
6

私はCコードで書かれた小さなインラインアセンブリコードを持っています。 asmは配列を通過し、必要に応じて値を別の配列からレジスタに移動します。 最後に、割り込みが呼び出されます。 コードは次のようになります。x64をサポートするようにインラインアセンブリを翻訳します。

cmp arrPointer[2],1h 
jne EXIT 
mov AX, shortArrPtr[2] 
EXIT: 
int 3h 

Microsoftによると、このすべてのx86での作業が、:x64のインラインアセンブリをサポートしていません。 x64をサポートするにはどうすればよいですか? 私が望むものを実行するコンパイラ組み込みプロシージャが見つかりませんでした。パラメータを外部のasmファイルに渡す方法がわかりません。

+0

、I翻訳は 'assert(0)'と言います。 – avakar

+0

int 3hは単なる例です。私はまた、異なるintの、主にint 15hです。 – Eldad

答えて

6

インラインアセンブリーが邪魔になる理由を打ち明けたと思います。これは完全に移植不可能です(アーキテクチャ間だけでなく、コンパイラーには異なる構文があります)。外部アセンブリファイルを作成し、そのようにする必要があります。アセンブリルーチンにパラメータを渡すことは、それらをC関数に渡すこととまったく同じです。ちょうど前方にあなたの関数の署名をどこかに宣言し、呼び出しコード(Cで)は正しいことをします。次に、外部アセンブリファイルにルーチンを実装し(呼び出し規約に従います)、適切なシンボルをエクスポートして、リンカがすべてを正しく結び付けるようにします。プレスト - 作業組立!

リクエストされた例です。私はこれを何らかの形でコンパイルまたはテストしようとしなかったので、100%ではないかもしれません。がんばろう。

myHeader.h:

void *someOperation(void *parameter1, int parameter2); 

myAssemblyFile.s:

.text 
.globl someOperation 

someOperation: 
    add %rdx, %rcx 
    mov %rcx, %rax 
    ret 

.end 

mySourceCode.c:

int型3h`がデバッガにジャンプするために使用される `ので
#include "myHeader.h" 

void someFunction(void) 
{ 
    void *arg1 = (void *)0x80001000; 
    int arg2 = 12; 
    void *returnValue; 

    printf("Calling with %x %x\n", arg1, arg2); 

    // call assembly function 
    returnValue = someOperation(arg1, arg2); 

    printf("Returned: %x\n", returnValue); 
} 
+0

私はまだアセンブリに精通していません。コードを教えてもらえますか? [C関数が:assembleThingy(shortArr []、char byteArr)] – Eldad

+0

の場合アセンブラの構文にほとんど依存していると思います。 –

+0

それは私のアセンブラ構文に依存しますが、私は良いスタートを与えました。ありがとう! – Eldad

関連する問題