2009-10-12 12 views
6

C koduma yazılmış küçük bir inline derleme kodum var. Asm bir diziden geçer ve gerekirse, farklı bir diziden değerleri bir kayıt birimine taşır. Sonuçta, bir kesme denir. kod benzer:Satır içi montajı x64'e yedekleyin

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

microsoft göre Bu, tüm x86 çalışmadır ama: x64 satır içi montaj desteklemez. X64'ü desteklemek için hepsini nasıl çevirebilirim? İstediğimi yürütmek için bir derleyici iç yordamı bulamadım ve parametreleri harici bir asm dosyasına nasıl geçirebileceğimi anlayamıyorum.

+0

ben 'Çevirinin' assert (0) 'olduğunu söyleyebilirim. – avakar

+0

int 3h sadece bir örnektir. Ayrıca farklı int, özellikle int 15h var. – Eldad

cevap

6

Sadece inline asamblajın eşcinselde bir ağrının neden olduğunu anladığınızı düşünüyorum - bu tamamen tartışılmaz (sadece mimariler arasında değil, derleyiciler genellikle farklı ve uyumsuz sözdizimine sahipler). Harici bir montaj dosyası yazın ve bu şekilde ihtiyacınız olanı yapın. Parametrelerin montaj rutinlerine geçirilmesi, C fonksiyonlarına geçmekle aynıdır; Sadece işlev imzanızı bir yere ilan edin ve çağrı kodu (C) doğru olanı yapacağız. Ardından, dış derleme dosyasındaki rutini uygulayın (çağrı kurallarına uyduğunuzdan emin olun) ve bağlayıcının her şeyi doğru şekilde bağlaması için uygun sembolü dışa aktarın. Presto - çalışma grubu!

İstenildiği gibi bir örnek. Bunu herhangi bir şekilde derlemeyi ya da test etmeyi denemedim, bu yüzden% 100 olmayabilir. İyi şanslar.

myHeader.h:

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

myAssemblyFile.s:

.text 
.globl someOperation 

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

.end 

mySourceCode.c:

int 3h` hata ayıklayıcı atlamak için kullanılan `yana
#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

Henüz montaj ile aşina değilim. Bana bir kod verebilir misin? [C işlevim şöyle olurdu: assembleThingy (kısa shortArr [], char byteArr)] – Eldad

+0

Bence bu neredeyse tamamen assembler sözdizimine bağlıdır, korkarım. –

+0

Bu, assembler sözdizimine bağlı, ama bana iyi bir başlangıç ​​yaptınız. Teşekkürler! – Eldad