2009-10-12 113 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