25 Kasım 2013 Pazartesi

C++ ile Assembly Kodu Çalıştırma



                C++ ile assembly kodlarımızı çalıştırmak için 2 seçeneğimiz var. Bunlardan ilki direk C/C++ kodumuzun içine _asm yazarak assembly kodlarımızı dahil etmektir. Diğeri ise projemize eklediğimiz .asm dosyasından assembly kodlarımızı çalıştırmaktır. Öncelikle bunlardan zahmetsiz olan ilk yönteme bakalım:

1.Yöntem

                Bu işlem için yapmamız gereken tek şey kodumuzun içerisine aşağıda olduğu gibi _asm yazmak ve süslü parantez ile açıp kapamak. Sonrasında içerisine assembly kodumuzu yazarak rahatlıkla çalıştırabiliriz.

Örnek 1: Çarpımlarının 2 fazlası

#include <iostream>

using namespace std;

int asmdenal(int,int);

int main()
{
       cout<<"Alınan değer  "<<asmdenal(3,8);
}

int asmdenal(int t1,int t2)
{
       _asm
       {
             mov eax,t1;
             mov ebx,t2;
             imul eax,ebx;
             add eax,2;
             mov t2,eax;
       }
       return t2;
}

Örnek 2: a , b , c değerlerini yığın kullanarak değiştiriyor.

#include <iostream>

using namespace std;

void Asmdenal(int,int,int);

int main()
{
       Asmdenal(30,8,12);
}

void Asmdenal(int a,int b,int c)
{
       cout<<"a : " <<a<<endl<<"b : "<<b<<endl<<"c : "<<c<<endl<<endl;
       _asm
       {
             mov eax,a;
             mov ebx,b;
             mov ecx,c;
             push eax;
             push ebx;
             push ecx;
             pop eax;
             pop ebx;
             pop ecx;
             mov a,eax;
             mov b,ebx;
             mov c,ecx;
       }
       cout<<"a : " <<a<<endl<<"b : "<<b<<endl<<"c : "<<c<<endl<<endl;
}

2.Yöntem

                Bu yöntemde Visual Studio dan yeni bir boş c++ projesi oluşturuyorum. Daha sonra Solution Explorer penceremdeki projemin üzerine gelip sağ tık ile AddàNew Item kısmından C++ (cpp) dosyası oluşturuyorum.





                Hemen ardından aynı şekilde sağ tık AddàNew Item diyerek bu seferde Name kısmına “deneme.asm” yazıyorum ve asm dosyamı oluşturuyorum.



                Şimdi oluşturduğum C++(.cpp) dosyama kodlarımı yazıyorum:

#include <iostream>

using namespace std;

extern "C" int Carp(int,int,int);// deneme.asm dosyasına link oluşturur.

int main()
{
       cout<<"Carpım Sonucu : "<<Carp(2,8,9)<<endl;
}

extern "C" int Carp(int,int,int) ile asm dosyama link oluşturuyorum. Aynı zamanda 3 integer değer alan ve integer değer dönderen bir Carp fonksiyonuda tanımlamış olduk.

Şimdi de deneme.asm dosyamın içerisine aşağıdaki gibi kodlarımı yazıyorum:

.model flat,C              ;"C" ifadesi Asm dosyamızdan C/C++ dosyamıza link oluşturur.
.code

Carp proc ,\               ;Fonksiyonun başlangıcı
s1:dword,s2:dword,s3:dword ;Gelen üç değerin boyutunun ayarlanması(double word olarak)
mov eax,s1
mov ebx,s2
mov ecx,s3
imul eax,ebx
imul eax,ecx
ret                               
Carp endp
end

                Bu hali ile çalıştırırsak eğer bize aşağıdaki gibi 2 hata verecektir ve program çalışmayacaktır.



                Bu hataları vermesinin sebebi ise bizim asm dosyamızı programın derleyememesidir. Bu problemi çözmek için yine projemizin üzerine gelip sağ tık ile Build Customizations seçeneğini seçiyoruz. Burada gelen 2 seçeneğe de tik atarak Ok butonuna basalım. Biz bu işlem ile asm dosyamızı derleyecek olan masm(Microsoft Assembler) ı etkin hale getirmiş olduk. Daha sonra yine Solution Explorer da projeme eklediğim deneme.asm dosyamın üzerinde sağ tık ile Properties seçeneğini seçiyorum. Açılan pencerede Item type kısmını Microsoft Macro Assembler olarak değiştiriyorum ve uygula diyorum. Şimdi problem çözülmüş oldu. Artık derleyip sonucu görebilirsiniz!





             Özetle dikkat edilmesi gereken hususlar:
  • C/C++ dan link eklemeyi unutmamalı
  • Asm dosyasından link eklemeyi unutmamalı
  •  Masm aktif hale getirilmeli


Bu uygulamalar 32 bit için yapılmıştır. 64 bitte çalıştırabilmek ve 64 bit registerlarını kullanabilmek için BuildàConfugration Manager i seçiyoruz ve aşağıdaki gibi Win32 yazan kısma tıklayıp New diyoruz , yeni açılan pencereden de ARM yazan kısmı x64 olarak değiştiriyoruz.  


0 yorum:

Yorum Gönder