我有一个用 C 代码编写的小型内联汇编代码。asm 遍历一个数组,如果需要,将值从不同的数组移动到寄存器。最后,调用中断。代码与此类似:
cmp arrPointer[2],1h
jne EXIT
mov AX, shortArrPtr[2]
EXIT:
int 3h
这一切都在 x86 中工作,但根据微软的说法:x64 不支持内联汇编。如何将其全部翻译为支持 x64?我找不到编译器内在过程来执行我想要的,我不知道如何将参数传递给外部 asm 文件。
我有一个用 C 代码编写的小型内联汇编代码。asm 遍历一个数组,如果需要,将值从不同的数组移动到寄存器。最后,调用中断。代码与此类似:
cmp arrPointer[2],1h
jne EXIT
mov AX, shortArrPtr[2]
EXIT:
int 3h
这一切都在 x86 中工作,但根据微软的说法:x64 不支持内联汇编。如何将其全部翻译为支持 x64?我找不到编译器内在过程来执行我想要的,我不知道如何将参数传递给外部 asm 文件。
我认为您刚刚找到了内联汇编令人头疼的原因-它完全不可移植(不仅在体系结构之间;编译器通常具有不同且不兼容的语法)。编写一个外部程序集文件并以这种方式执行您需要的操作。将参数传递给汇编例程与将它们传递给 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
我的源代码.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);
}