C 将内联部件转换为支持x64

C 将内联部件转换为支持x64,c,assembly,64-bit,inline-assembly,C,Assembly,64 Bit,Inline Assembly,我用C代码编写了一个小的内联汇编代码。 asm遍历一个数组,如果需要,将值从另一个数组移动到寄存器。 最后,调用一个中断。 代码与此类似: cmp arrPointer[2],1h jne EXIT mov AX, shortArrPtr[2] EXIT: int 3h 这些都可以在x86中使用,但根据microsoft的说法:x64不支持内联汇编。 如何将其全部转换为支持x64? 我找不到一个编译器内部过程来执行我想要的,我也不知道如何将参数传递给外部asm文件。我想你刚刚了解了内联汇编令人

我用C代码编写了一个小的内联汇编代码。 asm遍历一个数组,如果需要,将值从另一个数组移动到寄存器。 最后,调用一个中断。 代码与此类似:

cmp arrPointer[2],1h
jne EXIT
mov AX, shortArrPtr[2]
EXIT:
int 3h
这些都可以在x86中使用,但根据microsoft的说法:x64不支持内联汇编。 如何将其全部转换为支持x64?
我找不到一个编译器内部过程来执行我想要的,我也不知道如何将参数传递给外部asm文件。

我想你刚刚了解了内联汇编令人头疼的原因-它完全不可移植(不仅仅是在体系结构之间;编译器通常有不同且不兼容的语法). 编写一个外部程序集文件,并以这种方式执行所需的操作。向汇编例程传递参数与向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:

#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);
}

由于
int3h
用于跳转到调试器,因此我认为转换为
assert(0)
。int3h只是一个示例。我也有不同的int,主要是int 15h。我还不太熟悉汇编。你能给我一些密码吗?[如果我的C函数是:assembleThingy(short-shortArr[],char-byteArr)],恐怕这几乎完全取决于你的汇编程序语法。这确实取决于我的汇编程序语法,但你给了我一个好的开始。谢谢