2016-03-27 19 views
0

Bir .asm modülüm var ve yordamlarını .c modülünde kullanmak istiyorum. Ben şuna benzeyecektir MASM benim kodunu kullanarak bu yana:Değişkenleri burk yordamına geçirme

SECTION .text 

func PROC arg1: DWORD, arg2:DWORD 
... 
ret 
ENDPROC 

ve .c modülünde:

extern "C"{ 
    void func (int arg1, int arg2); 
} 

Şimdi ubuntu kullanmak ve NASM denemeye karar verdi. Bu yüzden şu sorularım var: Yalnızca bir etiket olduğu için argümanları nasm'deki bir prosedüre nasıl aktarabilirim? NASM kodumda .c modülünde extern "C" altında açıklanan değişkenleri nasıl kullanabilirim?

Ayrıca, argümanların yığın kullanarak bir prosedüre geçilmesi hakkında bir sözleşme olduğunu da duydum. Bir şekilde kullanabilir miyim? Bana biraz örnek verir misiniz?

+0

Her şey değişir. Ubuntu'da 64 bit kod veya 32 bit kod yazmak istiyor musunuz? Arama kuralı, oluşturmak istediğiniz koda bağlı olarak farklılık gösterir. _NASM_ ile _MASM_'ın PROC deyimi aracılığıyla ayrıntıların çoğunu gizlediği gibi arama kurallarını anlamalısınız. –

+0

X86 ve x86-64'te ABC işlev çağrısı ABB'yi açıklayan bir yanıt yazacaktım, ancak daha sonra "C" etiketli bir gönderide "C" {...} 'yi gördüm. Yuk. Bu tür yanlış anlamalar ile başlayanlar bence, yardımcı olmak için çok yol vardır. –

cevap

0

birkaç şey işaret etmek vardır: kayıtları aracılığıyla

  • Kişisel montajcı prosedürü geçirilir argümanlar, yığın ya da her ikisinin bir kombinasyonu olabilir. Platform ABI'nizi kontrol edin.
  • C'den aramak istediğiniz assembler işlevleri genellikle bir alt çizgi öneki _'a sahiptir. Sen ortaya çıkarmak için gidiyoruz her fonksiyon için bunu yapabilirsiniz ya:
    _func: 
        ; Do stuff 
        ret 
    

    Ya (tüm fonksiyonlar için yapacağım) nasm derleme argüman --prefix _

    • aracılığıyla

    section .text global _func

    Son olarak, C++ programlarını çağırıyorsanız sadece extern "C"'a ihtiyacınız vardır.

İyi eğlenceler!

İlgili konular