Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Örnek Delphi x64 Inline Assemblier Fonksiyonları
#1
Bu başlık altında kendi oluşturmuş olduğum ya da faydalandığım 64 bit delphi assembly kodları paylaşacağım. Kodlar arasına mümkün mertebe yorum satırları ekleyeceğim.

Delphi'nin inttostr fonksiyonuna alternatif bir assembly fonksiyonu:

{
 Author: Hakan DİMDİK
 Last modified: 30/12/2020
 An alternatif function to inttostr
}
procedure intoansi(src:uint64; dst:pansichar);
asm
   .noframe
   //edx:eax bölünen, kalan dl
   mov eax, ecx   //src'yi eax'e alıyoruz
   mov r9, rdx   //string adresi
   mov r10, 10    //constant 10

   xor r8, r8 //basamak sayısı 0'dan başlıyor, çünkü indeks numarasıyla işlem yapacağız

@basamakLoop:
   xor edx, edx  //dx sıfırlama
   div r10d //eax'i 10'a bölüyoruz
   add r8,1
   cmp eax, 10
   jae @basamakLoop

   mov eax, ecx   //src'yi eax'e tekrar alıyoruz

   cmp eax, r10d  //sayı ondan küçükse sona git
   jb @Ret

@L:
   xor edx, edx  //bölme işleminde kalan kısmı tekrar sıfırlıyoruz
   div r10d //eax'i 10'a bölüyoruz
   //kalanı ekledik
   add dl, 48    //dl'den ascii karakteri elde ediyoruz
   mov [r9+r8], dl
   sub r8, 1
   //bölüm 10'dan küçükse bitir
   cmp eax, r10d
   jb @Ret10
   jmp @L;
@Ret10:
   add al, 48
   mov byte ptr [r9+r8],  al
   ret
@Ret:
   add al, 48  //sayıya 48 eklenince ascii değerini alıyoruz
   mov byte ptr [r9+r8],  al //indekse ascii değeri yaz
end;

Kullanımı:

procedure TestMy;   
var
 str:ansistring;
begin
   SetLength(str,2);
   intoansi(33,pansichar(str));
   write(str);

   Readln;
end;

Bu fonksiyon ansistring içindir.

Agner Fog'un hazırlamış olduğu asmlib kütüphanesinden delphiye aktardığım StrLen fonksiyonu:

{
Agner Fog strlen function
https://github.com/tpn/agner/blob/master...rlen32.asm
}
function StrLen(const AStr: PAnsiChar): NativeUInt;
asm
   .noframe
   mov      rax,  rcx      //; string'in pointerini alıyoruz
   mov      r8,   rcx      //; string'in pointerini kopyalıyoruz

   //; rax = s, ecx = 32 bits of s
   pxor     xmm0, xmm0    //; xmm0 registerini sıfırlıyoruz
   and      ecx,  0FH     //; lower 4 bits indicate misalignment
   and      rax,  -10H    //; align pointer by 16
   movdqa   xmm1, [rax]   //; read from nearest precedingboundary
   pcmpeqb  xmm1, xmm0    //; compare 16 bytes with zero
   pmovmskb edx,  xmm1    //; get one bit for each byte result
   shr      edx,  cl      //        ; shift out false bits
   shl      edx,  cl      //        ; shift back again
   bsf      edx,  edx     //        ; find first 1-bit
   jnz      @L2            //        ; found

   //; Main loop, search 16 bytes at a time
@L1: add     rax,  10H     //        ; increment pointer by 16
   movdqa   xmm1, [rax]   //        ; read 16 bytes aligned
   pcmpeqb  xmm1, xmm0    //        ; compare 16 bytes with zero
   pmovmskb edx,  xmm1    //        ; get one bit for each byte result
   bsf      edx,  edx     //        ; find first 1-bit
   //; (moving the bsf out of the loop and using test here would be faster for long strings on old processors,
   //;  but we are assuming that most strings are short, and newer processors have higher priority)
   jz       @L1
@L2:     //; Zero-byte found. Compute string length
   sub      rax,  r8   //      ; subtract start address
   add      rax,  rdx       //      ; add byte index
   ret

end;

Standard length fonksiyonuna göre oldukça hızlıdır.
Cevapla
#2
elinize sağlık Wink
Cevapla
#3
Teşekkürler.
Cevapla
#4
bu kodlar mobilde de sıkıntısız çalışıyor mu android iOS ortamlarda
Cevapla
#5
(30-12-2020, Saat: 12:28)nguzeller Adlı Kullanıcıdan Alıntı: bu kodlar mobilde de sıkıntısız çalışıyor mu android iOS ortamlarda

Maalesef mobil desteklemiyor.
Cevapla
#6
o zaman sadece windows sunucu tarzı sistemlerde kullanılabilir.
Cevapla
#7
(30-12-2020, Saat: 12:57)nguzeller Adlı Kullanıcıdan Alıntı: o zaman sadece windows sunucu tarzı sistemlerde kullanılabilir.

Evet x64 Windows'ta sorunsuz kullanabilirsiniz.
Cevapla
#8
pos veya copy için elinde birşey var mı
Cevapla
#9
(30-12-2020, Saat: 13:06)nguzeller Adlı Kullanıcıdan Alıntı: pos veya copy için elinde birşey var mı

Çok Hızlı bir StrCpy fonksiyonu

function StrCpy(ADest: PAnsiChar ;const ASource: PAnsiChar):NativeUInt;
asm
    .noframe
    lea r10, [rcx]    //adest'i alıyoruz
    lea r11, [rdx]    //asource'u alıyoruz

    mov rcx, r11  //source'u rcx'e aldık
    call StrLen     //rax'e uzunluk atandı

    mov rcx, r11   //ilk parametre: source
    mov rdx, r10   //ikinci parametre:destination
    mov r8, rax    //uzunluğu r8'e aldık

    cmp r8, 10h  //boyut 16'dan küçük mü?
    jb @LessThen16  //küçükse move16'ya git
    call MoveMultipleOf16
    //mov rax, r8
    ret
@LessThen16:
    call Move16
    //mov rax, r8
end;

Aşağıdakileri de eklemeniz gerekiyor:

procedure Move16(const ASource; var ADest; ACount: NativeInt);
asm
    .noframe
    movdqu xmm0, [rcx]  //sse2 xmm0 registerine alıyoruz.  unaligned version: rem to reg
    movdqu [rdx], xmm0  //dest'e de xmm0'dakini atıyoruz.
end;

procedure MoveMultipleOf16(const ASource; var ADest; ACount: NativeInt);
asm
  .noframe
  add rcx, r8
  add rdx, r8
  neg r8
@MoveLoop:
  movdqu xmm0, [rcx + r8]
  movdqu [rdx + r8], xmm0
  add r8, 16
  js @MoveLoop
end;

FastMM kütüphanesindeki fonksiyonlardan yararlanılmıştır.

StrCpy fonksiyonu kopyalanan stringin uzunluğunu vermektedir. Böylece ekstradan bir de uzunluk almakla uğraşmazsınız.

İlk parametrede yer alan pansichar'ın gösterdiği ansichar array'inizin ya da ansistringinizin uzunluğunu fonskyinou kullanmadan önce ayarlamanız gerekiyor.

Örneğin;


var
str:ansistring;
begin
SetLength(str,20);
StrCpy(pansichar(str),Pansichar('test'));


ya da

type
  TStr=  array[0..200] of AnsiChar;

var
  a: TStr ;
  b: TStr ;
  c: NativeUint;
begin
  try


     a:='fhakanzzzzddxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxaa';

     writeln('Hakan length: ' +inttostr(strlen(a)));
     c:=StrCpy(b,a);
     writeln('b=: ' +b+' len:='+inttostr( c ));
     Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Cevapla
#10
pos function için internete hızlı seçenek buldum. android de test ettim.

https://stackoverflow.com/questions/2093...t/20947429
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Delphi de Program Bir defa Çalışsın woywod 16 5.164 04-02-2022, Saat: 17:38
Son Yorum: QuAdR
  Delphi de ADOConnection kullanarak SQL Server' a Bağlanma Procedure nuheroglu 4 2.867 19-05-2021, Saat: 16:44
Son Yorum: midorun87
  utf8<-->unicode dönüşüm fonksiyonları. PROGRAMADOR35 0 855 02-01-2021, Saat: 07:00
Son Yorum: PROGRAMADOR35
Thumbs Up [Delphi] Yeni Başlayanlar İçin Güzel Kaynak Halil Han BADEM 3 4.907 27-12-2020, Saat: 23:28
Son Yorum: Hayati
  Özetleme Fonksiyonları (Hash Function) narkotik 0 1.426 06-01-2019, Saat: 21:18
Son Yorum: narkotik



Konuyu Okuyanlar: 1 Ziyaretçi