6

C コードで記述された小さなインライン アセンブリ コードがあります。asm は配列を通過し、必要に応じて値を別の配列からレジスタに移動します。最後に、割り込みが呼び出されます。コードは次のようになります。

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

これはすべて x86 で機能しますが、マイクロソフトによると、x64 はインライン アセンブリをサポートしていません。すべてを x64 をサポートするように変換するにはどうすればよいですか? 必要なものを実行するためのコンパイラ組み込みプロシージャが見つからず、外部 asm ファイルにパラメータを渡す方法がわかりません。

4

1 に答える 1

6

インラインアセンブリがお尻の痛みである理由を突き止めたと思います-それは完全に移植できません(アーキテクチャ間だけでなく、コンパイラはしばしば異なる互換性のない構文を持っています)。外部アセンブリ ファイルを作成し、その方法で必要なことを行います。パラメーターをアセンブリ ルーチンに渡すことは、パラメーターを C 関数に渡すこととまったく同じです。関数の署名をどこかで前方宣言するだけで、呼び出し元のコード (C) は正しいことを行います。次に、ルーチンを外部アセンブリ ファイルに実装し (呼び出し規約に従っていることを確認してください)、適切なシンボルをエクスポートして、リンカがすべてを正しく結合するようにします。Presto - 作業アセンブリ!

リクエストに応じて、例。これをコンパイルしたりテストしたりしたわけではないので、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:

#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);
}
于 2009-10-12T18:08:28.800 に答える