Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 4.5/5 - 2 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Assembly Diliyle Yazılmış Kodların Delphi'den Çağrılması
#1
Merhaba, bu yazıda assembly dili ile yazıp derlediğimiz kodların Delphi'den çağrılmasından kısaca bahsetmeye çalışacağım.Derleyici bir kodu derlediğinde object formatında dosyalar üretir ve daha sonra linker bu object dosyaları bağlar ve Windows'ta PE (Portable Executable) formatında exe veya dll dosyası oluşur.Object dosyasının Windows'ta iki formatı vardır.Birincisi OMF (Object Module Format) formatı,dos'ta kullanılıyordu,windows 3.x sistemlerinde çeşitli eklemelerle kullanıldı.İkincisi olan  COFF(Common Object File Format) formatına ise 32 bit sistemlerde geçildi ve bu format PE formatına çok benzemektedir.Bu sebeple çoğu dökümanda çalıştırılabilen dosya formatı ile object dosya formatı PE/COFF biçiminde bir arada ele alınmaktadır.Delphi 32 bitte uzun zaman omf formatını destekledi xe2'den sonra coff formatına da destek verdi.64 bitte ise tamamen coff formatı kullanılıyor.Object dosyalarından neden bahsettik diye soracak olursanız? Assembly derleyicisi ile object dosyası üretip sonra bunu delphide kullanacağız.Bu sebeple kısaca anlatmak istedim.Şimdi gelelim asıl konumuza.Örneğin şöyle bir assembly kodumuz olsun.

asmTopla.asm
  
  .386
.model flat
IFDEF _TASM_
public asmTopla; tasm ile derlerseniz burası olmazsa delphi fonksiyonu görmeyecektir.Diğer derleyicilerde belirtmeye gerek yok.
ENDIF
   .code
asmTopla proc

       push ebp
       mov ebp,esp
       mov eax,[ebp+8]                   
       mov ecx,[ebp+12]                            
       add eax,ecx                      
       pop ebp
       ret
asmTopla endp
end

Bu dosyasımızı masm ile tasm32 ile veya jwasm ile derleyebiliriz.
masm için: ml asmTopla.asm
tasm için: tasm32 asmTopla.asm
jwasm için: jwasm -omf asmTopla.asm
komut satırından yukarıdaki assembler'e göre uygun komutu yazıyoruz.
asmTopla.obj adında bir dosyamız oluştu.Şimdi istersek dosyayı proje klasörümüze taşıyabiliriz yada olduğu yerde bırakıp bulunduğu dizini(path) yazarak da kullanabiliriz.Dosyayı 
Delphi içinde kullanmak için   {$L  <path>object_dosyamiz.obj} direktifini yazdıktan sonra "external" olarak fonksiyonumuzu tanımladığımızda işlem tamamlanmıştır.
örnek delphi Kodu:
unit asmunit;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
 TForm6 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form6: TForm6;

{$L asmTopla.obj} //object dosyamızı  bildiriyoruz
function asmTopla(a,b:integer):integer;cdecl;external; // extern fonksiyonuzumun bildirimini yazıyoruz.
{ Ben yukardaki assembly fonksiyonunu c çağırma biçimine göre yazdığım için cdecl bildirimini kullandım değilse hata verirdi.
Siz delphinin çağırma bicimini (register) kullanırsanız,bir bildirim kullanmayabilirsiniz.}
implementation

{$R *.dfm}

procedure TForm6.Button1Click(Sender: TObject);
begin
 ShowMessage(inttostr(asmTopla(2,25)));
end;

end.
Umarım işinize yarar.Saygılarımla.
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#2
Bu kaynakları yedeklemek lazım, hepsi altın değerinde... Smile
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
Cevapla
#3
Merhaba,
Savaş Bey değerli paylaşımınız için teşekkür ederim.

(13-12-2017, Saat: 21:03)hyperxman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlBu kaynakları yedeklemek lazım, hepsi altın değerinde... Smile

Sizin adınıza tüm formu ara ara yedekliyorum. Smile
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#4
Çok değerli paylaşımlar hocam.
Ellerinize, emeğinize sağlık.
My name is nobody.
WWW
Cevapla
#5
Teşekkürler Savaş bey
Cevapla
#6
Paylaşımınız çok kıymetli, DLL'e alternatif bir yöntem sunmuş olduğunuz için tebrik ve teşekkür ederim.
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Can Yücel: "Toprak gibi olmalısın! Ezildikçe sertleşmelisin! Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı."
Cevapla
#7
Keşke bir arkadaşımız, kardeşimiz, abimiz, ablamız ASM dersleri verse Big Grin
Amatör Küme Bilgisayar Programcısı
WWW
Cevapla
#8
(14-12-2017, Saat: 11:01)barutali Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlKeşke bir arkadaşımız, kardeşimiz, abimiz, ablamız ASM dersleri verse Big Grin

Erişimim olmadığı için bilemiyorum (ve saygı duyuyorum), Low Level bölümünde bu tarz konu başlıkları yok mu?
Peyami Safa: "Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır". 
Can Yücel: "Toprak gibi olmalısın! Ezildikçe sertleşmelisin! Seni ezenler sana muhtaç kalmalı! Hayatı sende bulmalı."
Cevapla
#9
Ellerinize sağlık. Bu arada ASM ile ilgili yine Savaş Bey'in bir çalışması forum'da mevcut.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#10
Peki "DLL mi yoksa bu yöntem mi daha iyi (hızlı) sonuç verir?" diye bi soru sorsam.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi'de Inno Setup | Sorgulu Uninstall İşlemi Halil Han Badem 10 301 09-08-2018, Saat: 10:43
Son Yorum: SimaWB
  Delphi'de Dökümantasyon Nasıl Yapılır uparlayan 21 736 17-07-2018, Saat: 16:54
Son Yorum: uparlayan
  Kitap İnceleme ( Algoritma ve Delphi 2005 ) #1 boreas 0 161 02-06-2018, Saat: 15:39
Son Yorum: boreas
  Delphi'de Indy SMTP ile e-mail gönderme. (GMail, Yandex, Yahoo vb.) csunguray 6 855 09-04-2018, Saat: 02:34
Son Yorum: dkadir
  Delphi Direktif Kullanımı narkotik 3 421 12-03-2018, Saat: 00:44
Son Yorum: mcuyan



Konuyu Okuyanlar: 1 Ziyaretçi