c - 翻译内联汇编以支持 x64

标签 c assembly 64-bit inline-assembly

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

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

这一切都适用于 x86,但根据微软的说法:x64 不支持内联汇编。 我如何将其全部转换为支持 x64? 我找不到编译器内部过程来执行我想要的,我不知道如何将参数传递给外部 asm 文件。

最佳答案

我认为您刚刚找到了内联汇编令人头疼的原因 - 它完全不可移植(不仅在体系结构之间;编译器通常具有不同且不兼容的语法)。编写一个外部程序集文件并以这种方式执行您需要的操作。将参数传递给汇编例程与将参数传递给 C 函数完全相同;只需在某处转发声明您的函数签名,调用代码(在 C 中)就会做正确的事情。然后在外部汇编文件中实现例程(确保遵守调用约定)并导出适当的符号以使链接器正确连接所有内容。 Presto - 工作 assembly !

一个例子,根据要求。我没有尝试以任何方式编译或测试它,所以它可能不是 100%。祝你好运。

myHeader.h:

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

我的程序集文件.s:

.text
.globl someOperation

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

.end

我的源代码.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 - 翻译内联汇编以支持 x64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1554351/

相关文章:

c - 为什么我的c程序突然用了30g的虚拟内存?

java - 如何将 jchararray 作为参数发送给 C 函数

c - VxWorks 堆栈帧异常大

C++ 代理 DLL(64 位)

c - stat64 一个大(~5GB)文件

c - C 中的静态多维数组与指针和地址

c - 在 C 中实现互斥锁

linux - linux中的 'registering an ISR in DOS'相当于什么

windows-vista - 您会为 Windows Vista 推荐 32 位还是 64 位系统?

visual-studio - 在 VS 2008 中编译 Qt 应用程序时 64 位 Win 7 中的 "cannot open input file odbc32.lib"错误