将内联汇编转换以支持x64

6

我在我的C代码中写了一小段内联汇编代码。 该汇编代码遍历一个数组,如果需要,将另一个数组中的值移动到寄存器中。 最后,调用一个中断。 代码类似于下面这样:

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

在x86中,这些都可以正常工作。但据微软称,x64不支持内联汇编。我该如何将其全部翻译为x64支持的形式?我无法找到编译器内置过程来执行我想要的操作,也无法弄清楚如何将参数传递给外部汇编文件。

由于int 3h用于跳转到调试器,我会说翻译为assert(0) - avakar
int 3h只是一个例子。我还有不同的int,主要是int 15h。 - Eldad
1个回答

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:

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

我对汇编语言还不是很熟悉。你能给我一些代码吗? [如果我的C函数是:assembleThingy(short shortArr[], char byteArr)] - Eldad
我想这几乎完全取决于您的汇编语法,恐怕我无法确定。 - Carl Norum
这确实取决于我的汇编语法,但你给了我一个很好的起点。谢谢! - Eldad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接