2009-10-12 57 views
6

我有一个用我的C代码编写的小型内联汇编代码。 asm通过一个数组,如果需要的话,将数值从一个不同的数组移到一个寄存器。最后,中断被调用。 的代码与此类似:将内嵌程序集转换为支持x64

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

在86这一切工作,但据微软:64位不支持内嵌汇编。 如何将它全部翻译成支持x64? 我无法找到一个编译器内在过程来执行我想要的,我无法弄清楚如何将参数传递给外部asm文件。

+0

由于'INT 3h'用于跳转到调试器,我'd说翻译是'assert(0)'。 – avakar 2009-10-12 15:38:07

+0

int 3h只是一个例子。我也有不同的int,主要是int 15h。 – Eldad 2009-10-13 07:25:31

回答

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); 
} 
+0

我还不是很熟悉装配。你能给我一些代码吗? [如果我的C函数是:assembleThingy(短shortArr [],焦炭byteArr) – Eldad 2009-10-13 07:27:46

+0

我认为,几乎完全取决于你的汇编语法,我害怕。 – 2009-10-13 17:01:04

+0

这取决于我的汇编语法,但你给了我一个好的开始。谢谢! – Eldad 2009-10-14 11:48:50