转换内联汇编以支持x64

时间:2009-10-12 12:37:55

标签: 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文件。

1 个答案:

答案 0 :(得分: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);
}