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