Assembly Mimarisi İşlem Kodları Mantıksal Açıklama

x86-x64 Assembly
Kurucu
Katılım
28 Kas 2015
Mesajlar
500
Çözümler
1
Tepki puanı
782
Ödüller
11
10 HİZMET YILI
Bu konuyu sürekli güncellicem.

Yeni işlem kodları ekliyecem bu konuyu açma amacım assembly mimarisini hep birlikte mantıksal bi şekilde anlamak, Yanıldığım yerler olabilir, hata yaptığım yerler olabilir, belkide bi işlem kodunun ne yaptığını tam anlamamış olabilirim.

Bu konu tamamen verdiğim işlem kodlarının memory segmentte veya registerlerde nasıl değişiklikler yaptığını açıklamak


NASM:
xchg eax,[00D60040] = eax registerindeki değeri 00D60040 adresine yazıyor ve 00D60040 deki yazmadan önceki değeri eax registerine yazıyor, Yani değerleri takas ediyor, Örnek : 00D60040 adresinde (hex(44332211) değeri var diyelim , eax registerindede (49F36360) değeri yazıyor diyelim şimdi bunlar takas oldular yani
00D60040 =  49F36360 ,  eax = 44332211


lea eax,[edx-84] = edx registerindeki adresi -84 çıkararak eax registerine adresi yaz, Not burada [] içine alından değeri okuma değil adresi okumadır

movd xmm0,[00D60040] = ((00D60040)) adresindeki değeri xmm0 registerindeki sadece 1.satırına yazar bu şekilde  XMM0: | 44332211,00000000,00000000,00000000| tek bi tanesi yazılır

movapd xmm0,[00D60040] = ((00D60040,00D60044,00D60048,00D6004C)) adreslerindeki değerleri xmm0 registerine 1.,2.,3.,4. satırlarına yazar bu şekilde  XMM0: | 44332211,88776655,0000AA99,2054BDB4 | hepsi sırasıyla yazılır , Dikkat 1 : xmm0 registerindeki değeri bu işlem kodu eax gibi registerlere yazmaz , Dikkat 2 : Bu işlem kodu kural içerir kural derki her zaman ekliceğin adress ondalık olacak yani 005B0050,005B0060,005B0070,005B0080,005B0090,005B00A0 gibi her zaman base adressden +10 olarak gidecek başka türlü işlem gerçekleşmez crash yersiniz

movaps [00D60040],xmm0 = xmm0 registerindeki 1.,2.,3.,4. satırlarında yazan değerleri 16 bytes olarak 00D60040 adresine yazar ,Bu işlem kodu yukardaki işlem kodundan daha kullanışlıdır hem registerdeki değeri adrese hemde adresteki değeri registere yazabilme özelliğine sahip, Dikkat 1 : Bu işlem kodu kural içerir kural derki her zaman ekliceğin adress ondalık olacak yani 005B0050,005B0060,005B0070,005B0080,005B0090,005B00A0 gibi her zaman base adressden +10 olarak gidecek başka türlü işlem gerçekleşmez crash yersiniz

add eax,10 =  eax registerindeki değeri 10 la toplar ve eax registerine yazar bu komut flagsları yani bayrakları etkilemez

add eax,ecx = eax registerindeki değer ecx registerindeki değerle toplanıp eax registerine yazılır dikkat etmeniz gereken şey toplama işlemi soldan sağa gider yani eax + ecx = bu şekilde bu toplama işlemlerinde fazla farketmesede çıkartma işlemlerinde çok farkeder ve sonuç flagsları yani bayrakları etkiler

sub eax,10 =  eax registerindeki değer  10 la çıkartılır ve eax registerine yazılır bu komut flagsları yani bayrakları etkilemez

sub eax,ecx = eax registerindeki değer ecx registerindeki değerle çıkartılıp eax registerine yazılır dikkat etmeniz gereken şey çıkartma işlemi soldan sağa gider yani eax - ecx = bu şekilde ve sonuç flagsları yani bayrakları etkiler

cmp eax,11 = eax registerindeki değer 11'e eşitmi diye kontrol eder bunu için eax registerindeki değeri -11 çıkartır, Gelen sonucun 0 olup olmadığına bakar, ama bu çıkartmanın sonucunu bi yere yazmaz sadece bu sonucu hesaplıyarak flags registerlerini yani bayrakları değiştirir

mov eax,0  = 0 değerini eax registerine yazar, mov işlem kodu belirtilen registere veya registerdeki adrese veya belirtilen adrese registerdeki değeri yazmak için kullanılır

mov [eax],0  = 0 değerini eax registerindeki adrese yazar, Unutmayın genellikle [] içine alınanlar bi adresteki değeri okumak için kullanılır tabi bu bütün işlem kodlarında geçerli değil

mov rcx,[rax+rbx*8] = rax topla rbx * 8 sonucuyla .[] içerdiği için içindeki değer rcx registerine yazılır

push r15w, push  r14w, push  r13w, push r12w, push r11w, push r10w, push r9w, push r8w =  Dikkat edin bunlar bu şekilde kullanılmıyor virgülle ayırdım her virgül bir registeri temsil ediyor , Bu registerleri kullandığın zaman registerdeki değeri 16 bit (2 bytes) olarak stacka yazar

mov r15b,40 = Aynı şekilde r8-r15 arası registerlerden birini tercih edebilirsiniz, r15b olarak belirtme yaptım yani 8 bit (1 bytes) r15 registerine 40(hex) değerini 8 bit olarak girmiş oluyoruz dikkat etmeniz gereken şey kompile hepsini silerek değeri girmiyor yani 1 bytes olarak girdiğimiz için eğer r15 registerinde "1C350720" değeri varsa "1C350740" olmuş oluyor. Çünkü 16 bit olarak girdik değeri

test eax,eax = eax registeri negatif veya nötr bir sayı işe "ZF" flags registerini set eder "1"

xor r14,r13 =  r14 registerindeki değerin "100" olduğunu düşünelim ve aynı şekilde r13 registerindeki değerde "100" suan iki değer aynı olduğunu için çıkış "0" oluyor ve ZF bayrağı setliyor  "1" PF bayrağı setliyor "1"  ve r14 registeriyle , r13 registeri arasında çıkarma yapıyor sonuç 100-100 = 0 oluyor. cevabı  "r14" registerine yazıyor.

xor r14,r13 = r14 registerindeki değerin "100" olduğunu r13 registerindeki değerin "99" olduğunu düşünelim ikisi farklı değer olduğu için çıkış "1" oluyor ve ZF Bayrağı setlemiyor "0" PF bayrağı setliyor "1" ve r14 registeriyle r13 registerini topluyor sonuçu r14 registerine yazıyor "199"

ret = Fonksiyonu bitirir, Stackta yer alan 32 bitte +4 / 64 bitte +8 rsp adresindeki değerden kaldığı yerden devam eder. Bazen bazı olayların hiç çalışmaması için fonksiyonun başına ret atılır.

ret 4 / ret 8 / ret 10 = Retin sonlarında yer alan bu değerler stacktaki adresi atlamanı sağlar. Örneğin stackta yer alan bir alttaki fonksiyon değilde onunda bir altındaki fonksiyondan devam etmek istiyoruz o zaman ret 4 yapacaz tabiki bu 32 bitte / 64 bit için ret 8 yapacaz

neg rax =  Bu opcode değeri negatifse pozitife , pozitifse negatife çevirir.  Örnek   raxdaki değer signed olarak "100"  bu opcode kullanıldığında -100 olur. Aynı şekilde raxdaki değer "-100" bu değer  "100" olur. Bu opcode aynı zamanda bayrakları setler . Eğer raxdaki değer 0 sa doğal olarak sonuçta "0" olacaktır. Bu "ZF" bayrağını setler.  Pozitif sayı negatif sayıya dönüştüğünde SF bayrağı setler.  Pozitif sayı negatif sayıya dönüştüğünde SF bayrağı "0" olur

vaddps ymm0,ymm1,ymm2 = VADDPS opcode'u, üç kaydedici (register) kullanarak iki kayan nokta (float) vektörünü toplar ve sonucu hedef kaydediciye yazar.   /// Bu opcodeler geriye uyumluluk konusunda sıkıntı yaratabilir.  2011 yılı önceki işlemcilerde sorun yaratır.
vsubps ymm0,ymm1,ymm2 = VSUBPS opcode'u, üç kaydedici (register) kullanarak bir kayan nokta (float) vektöründen diğerini çıkarır ve sonucu hedef kaydediciye yazar. /// Bu opcodeler geriye uyumluluk konusunda sıkıntı yaratabilir. 2011 yılı önceki işlemcilerde sorun yaratır.
vpand ymm0,ymm1,ymm2 =  VPAND opcode'u, üç kaydedici (register) kullanarak iki işlemcinin AND işlemini yapar ve sonucu hedef kaydediciye yazar. /// Bu opcodeler geriye uyumluluk konusunda sıkıntı yaratabilir. 2011 yılı önceki işlemcilerde sorun yaratır.
vmulps ymm0,ymm1,ymm2 = VMULPS opcode'u, üç YMM kaydedici (register) kullanarak iki YMM kaydedicisini çarpar ve sonucu hedef YMM kaydedicisine yazar. /// Bu opcodeler geriye uyumluluk konusunda sıkıntı yaratabilir. 2011 yılı önceki işlemcilerde sorun yaratır.
vfmadd132ps ymm0,ymm1,ymm2 = VFMADD132PS opcode'u, üç YMM kaydedici (register) kullanarak üç YMM kaydedicisinin içeriklerini kullanarak birleştirilmiş çarpma, toplama ve kaydırma işlemini yapar ve sonucu hedef YMM kaydedicisine yazar. (YMM0 = YMM1 * YMM2 + YMM0)  /// Bu opcodeler geriye uyumluluk konusunda sıkıntı yaratabilir. 2011 yılı önceki işlemcilerde sorun yaratır.
vmaxps ymm0,ymm1,ymm2 =  VMAXPS opcode'u, üç YMM kaydedici (register) kullanarak iki YMM kaydedicisinin maksimum değerini hesaplar ve sonucu hedef YMM kaydedicisine yazar.
cvtdq2pd xmm0,xmm0,xmm1 = xmm1[0],xmm1[1] registerindeki 4 bytes(integer) değerleri alır double değer olarak xmm0 registerine yazar.  cvtdq2pd opcodesinin amacı integer değeri double değere çevirmektir.
cvtdq2ps xmm0,xmm1 =  xmm1[0],xmm1[1],xmm1[2],xmm1[3] registerindeki 4 bytes(integer) değerleri alır float değer olarak xmm0 registerine yazar. cvtdq2ps opcodesinin amacı integer değeri float değere çevirmektir.
cvtpd2dq xmm0,xmm7 = xmm7 registerindeki double değeri alır xmm0[0],xmm0[1] registerine 4bytes(integer) olarak yazar.  cvtpd2dq opcodesinin amacı double değeri integer değere çevirmektir.
cvtpd2dq xmm0,[rcx+60] = rcx+60 ve rcx+68 memory bellekteki double değeri alır xmm0[0],xmm0[1] registerine 4bytes(integer) olarak yazar.  cvtpd2dq opcodesinin amacı double değeri integer değere çevirmektir.
cvtpd2ps xmm0,[rcx+60] = rcx+60 ve  rcx+68 memory bellekteki double değeri alır xmm[0],xmm0[1] registerine float olarak yazar. cvtpd2ps opcodesinin amacı double değeri float değere çevirmektir.
cvtpi2pd xmm0,[rcx+60] = rcx+60 ve rcx+64 memory bellekteki 4 bytes(integer) değerleri alır ve double değer olarak xmm0 registerine yazar. cvtpi2pd opcodesinin amacı integer değeri double değere çevirmektir.
cvtps2dq xmm0,[rcx+60] = rcx+60 , rcx+64, rcx+68 ve rcx+6C memory bellekteki float değerleri alır ve 4 bytes(integer) olarak xmm0[0],xmm0[1],xmm0[2],xmm0[3] registerine yazar. amacı float değeri integer değere çevirmektir.
cvtps2pd xmm0,[rcx+60] = rcx+60 ve rcx+64 memory bellekteki float değerleri alır ve xmm0 registerine double değer olarak yazar. cvtps2pd opcodesinin amacı float değeri double değere çevirmektir.
cvtsd2ss xmm0,[rcx+60] = sadece rcx+60 memory bellekteki double değeri alır ve xmm0[0] registerine float değer olarak yazar.  cvtsd2ss opcodesinin amacı double değeri float değere çevirmektir.
cvtsi2sd xmm0,rax = rax registerindeki değeri xmm0[0] registerine double olarak yazar.  cvtsi2sd opcodesinin amacı integer değeri double değere çevirmektir.
cvtsi2sd xmm0,[rcx+60] = sadece rcx+60 memory bellekteki integer(4bytes) değeri alır ve xmm0[0] registerine double değer olarak yazar. cvtsi2sd opcodesinin amacı integer değeri double değere çevirmektir.
cvtsi2ss xmm0,[rcx+60] = sadece rcx+60 memory bellekteki integer(4bytes) değeri alır ve xmm0[0] registerine float değer olarak yazar.  cvtsi2ss opcodesinin amacı integer değeri float değere çevirmektir.
cvtsi2ss xmm0,rax = rax registerindeki değeri xmm0[0] registerine float olarak yazar. cvtsi2ss opcodesinin amacı integer değeri float değere çevirmektir.
vcvttpd2dq xmm2,[rcx+60] = rcx+60 ve rcx+68 memory bellekteki double değeri alır ve xmm2[0] ve xmm2[1] registerine 4bytes integer olarak yazar.  vcvttpd2dq opcodesinin amacı double değeri integer değere çevirmektir.
cvttpd2dq xmm2,[rcx+60] = rcx+60 ve rcx+68 memory bellekteki double değeri alır ve xmm2[0] ve xmm2[1] registerine 4bytes integer olarak yazar.  cvttpd2dq opcodesinin amacı double değeri integer değere çevirmektir.
vpmovsxdq xmm1,xmm0,[rcx+60] = rcx+60 ve rcx+64 memory bellekteki 4 bytes hexdecimal değeri xmm1[0] ve xmm1[2] registerine 8bytes qword olarak yazar.
vandpd xmm4,xmm1,[rcx+60] = rcx+60 ve rcx+68 memory bellekteki double değeri xmm1[0] ve xmm1[2] registerindeki double değeri ile and işlemi gerçekleştirir. Sonucu xmm4[0],xmm4[2] registerine double olarak yazar.  vandpd opcodesinin amacı and işlemi gerçekleştirmektir.
vmovdqa xmm2,[rcx+60] = rcx+60 ve rcx+68 memory bellekteki 8 bytes hexdecimal değeri xmm2[0] ve xmm2[2] registerine 8 bytes qword olarak yazar.  vmovdqa opcodenin amacı 16 bytes hexdecimal değeri hedef registere yazmaktır.
vfnmadd231sd xmm2,xmm1,[rcx+60] = xmm1[0] double değeriyle rcx+60 belleğindeki double değerini çarpar çıkan sonuçla xmm2[0] double değerini toplar sonucu xmm2[0] registerine double negatif olarak yazar. Yani sonuç 200 double değeriyse -200 olarak yazılır.
vfmadd231sd xmm1,xmm3,[rcx+60] = xmm3[0] double değeriyle rcx+60 belleğindeki double değeri çarpar çıkan sonuçla xmm1[0] double değerini toplar sonucu xmm1[0] registerine double pozitif olarak yazar.
Yani sonuç 200 double değeriyse 200 olarak yazılır.
vfmadd213sd xmm1,xmm3,[rcx+60] xmm1[0] double değeriyle xmm3[0] double değerini çarpar rcx+60 belleğindeki double değeriyle toplayarak sonucu xmm1[0] double değerine pozitif olarak yazar.
vmulsd xmm3,xmm1,[rcx+60] = xmm1[0] double değeriyle rcx+60 belleğindeki double değeri çarpar çıkan sonucu xmm3[0] double değeri olarak yazar. Ayrıca xmm1[2] double değerini çarpım yapmadan doğrudan xmm3[2] double değeri olarak yazar.
mulsd xmm1,[rcx+60] =  rcx+60 belleğindeki double değer ile xmm1[0] double değerini çarpar sonucu xmm1[0] double değer olarak yazar.
vsubsd xmm0,xmm2,[rcx+60] = xmm2[0] registerindeki double değerini ile rcx+60 belleğindeki double değeri çıkarır ve sonucu xmm0[0] registerine yazar. Ayrıca xmm2[2] double değerini çıkarma yapmadan doğrudan xmm0[2] registerine double değeri olarak yazar.
subsd xmm4,[rcx+60] = xmm4[0] registerindeki double değeri ile rcx+60 memory belleğindeki double değerini çıkarır ve sonucu xmm4[0] registerine yazar.
vmovq r10,xmm4 = xmm4[0] registerindeki 8 bytes hexdecimal değeri r10 registerine yazar.

cvttsd2si eax,xmm1 = xmm1 registerindeki double veriyi eax registerine yazar.

cmovge rax,rcx = Bu opcode  rcx registerindeki değeri rax registere yazmanı sağlıyor mov gibi ama bayrakları control ederek yani kısaca flagslar yazıp yazmıcağına karar veriyor. Bu opcode bizi büyük bir iş yükünden kurtarıcak bu yüzden nasıl yaptığını iyi anlamak gerek. İnternetten araştırdığım zaman öbür bayraklarında bazı koşullara göre control edildiğini gördüm ama kendim yaptığım incelemede sadece "SF" flagsın setlenip setlenmediğini control ediyor.
Örnek : rcx registerindeki değer : 0 , rax registerindeki değer : 4654 bu opcode çalıştığı zaman SF bayrağı "0" yani setlenmemişse rax registerindeki değeri rcx registerine yazar. rcx = 4654
Eğer SF bayrağı "1" yani setlenmemişse rax registerine yazma yapmaz.


cmove rax,rax = Eğer ZF bayrağı "1" yani setlenmişse rax registerine yazma yapar yukardakinin aynısıdır sadece ZF bayrağını kontrol eder.

stc (Set Carry Flag)  = Bu opcode "CF" bayrağını setler


Set Byte on Condition

Kod:
setg cl = (ZF=0 and SF=OF) ZF "0" ve SF ile OF birbirine eşitse ecx registerine byte olarak "1" değerini yazar. Eğer ZF 1 veya SF OF ye eşit değilse ecx registerine byte olarak "0" değerini yazar.
setg byte ptr [ecx]  = (ZF=0 and SF=OF) ZF "0" ve SF ile OF birbirine eşitse ecx registerindeki adrese byte olarak "1" değerini  yazar. Eğer ZF 1 veya SF OF ye eşit değilse ecx registerindeki adrese byte olarak "0" değerini yazar.
setg byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.

setge cl = (SF=OF)  SF ve OF birbirine eşitse 1=1 , 0=0 ecx registerine byte olarak "1" değerini yazar. Eğer eşit değilse 0=1 , 1=0  ecx registerine byte olarak "0" değerini yazar.
setge byte ptr [ecx] = SF ve OF birbirine eşitse 1=1 , 0=0 ecx registerindeki adrese byte olarak "1" değerini yazar. Eğer eşit değilse 0=1 , 1=0  ecx registerindeki adrese byte olarak "0" değerini yazar.
setge byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.

setb cl = (CF=1) CF bayrağı "1" se ecx registerine byte "1" değeri yazar.  "0" sa ecx registerine byte olarak "0" değerini yazar.
setb byte ptr [ecx] = (CF=1) CF bayrağı "1" se ecx registerindeki adrese byte olarak "1" değerini yazar. "0" sa ecx registerindeki adrese byte olarak "0" değerini yazar.
setb byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.


setae cl = (CF=0) CF bayrağı "0" se ecx registerine byte "1" değeri yazar.  "1" sa ecx registerine byte olarak "0" değerini yazar.
setae byte ptr [ecx] = (CF=0) CF bayrağı "0" se ecx registerindeki adrese byte olarak "1" değerini yazar. "1" sa ecx registerindeki adrese byte olarak "0" değerini yazar.
setae byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.

seta cl = (CF=0 and ZF=0) CF ve ZF bayrağı "0" sa ecx registerine byte olarak "1" değerini yazar. Eğer aralarından biri "1" se ecx registerine byte olarak "0" değerini yazar.
seta byte ptr [ecx] = (CF=0 and ZF=0) CF ve ZF bayrağı "0" sa ecx registerindeki adrese byte olarak "1" değerini yazar. Eğer aralarından biri "1" se ecx registerindeki adrese byte olarak "0" değerini yazar.
seta byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.


setbe cl = (CF=1 or ZF=1)   CF bayrağı veya ZF bayrağı "1" se ecx registerine byte olarak "1" değerini yazar. Eğer CF ve ZF bayrağının ikiside "0" sa ecx registerine byte olarak "0" değerini yazar.
setbe byte ptr [ecx] = (CF=1 or ZF=1)   CF bayrağı veya ZF bayrağı "1" se ecx registerindeki adrese byte olarak "1" değerini yazar. Eğer CF ve ZF bayrağının ikiside "0" sa ecx registerindeki adrese byte olarak "0" değerini yazar.
setbe byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.

sete cl = (ZF=1)  ZF bayrağı "1" se ecx registerine byte olarak "1" değerini yazar.  "0" sa ecx registerine byte olarak "0" değerini yazar.
sete byte ptr [ecx] = ZF bayrağı "1" se ecx registerindeki adresi byte olarak "1" değerini yazar "0" sa ecx registerindeki adrese byte olarak "0" değerini yazar.
sete byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.

setne cl = (ZF=0)  ZF bayrağı "0" se ecx registerine byte olarak "1" değerini yazar.  "1" sa ecx registerine byte olarak "0" değerini yazar.
setne byte ptr [ecx] = ZF bayrağı "0" se ecx registerindeki adresi byte olarak "1" değerini yazar "1" sa ecx registerindeki adrese byte olarak "0" değerini yazar.
setne byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.

sets cl = (SF=1)  SF bayrağı "1" se ecx registerine byte olarak "1" değerini yazar. "0" sa ecx registerine byte olarak "0" değerini yazar.
sets byte ptr [ecx] = SF bayrağı "1" se ecx registerindeki adrese byte olarak "1" değerini yazar. "0" sa ecx registerindeki değere byte olarak "0" değerini yazar.
sets byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.

setns cl = (SF=0)  SF bayrağı "0" se ecx registerine byte olarak "1" değerini yazar. "1" sa ecx registerine byte olarak "0" değerini yazar.
setns byte ptr [ecx] = SF bayrağı "0" se ecx registerindeki adrese byte olarak "1" değerini yazar. "1" sa ecx registerindeki değere byte olarak "0" değerini yazar.
setns byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.

setp cl (PF=1) PF bayrağı "1" se ecx registerine byte olarak "1" değerini yazar. "0" sa ecx registerine byte olarak "0" değerini yazar.
setp byte ptr [ecx] = PF bayrağı "1" se ecx registerindeki adrese byte olarak "1" değerini yazar. "0" sa ecx registerindeki değere byte olarak "0" değerini yazar.
setp byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.

setnp cl (PF=0) PF bayrağı "0" se ecx registerine byte olarak "1" değerini yazar. "1" sa ecx registerine byte olarak "0" değerini yazar.
setnp byte ptr [ecx] = PF bayrağı "0" se ecx registerindeki adrese byte olarak "1" değerini yazar. "1" sa ecx registerindeki değere byte olarak "0" değerini yazar.
setnp byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.

seto cl (OF=1) OF bayrağı "1" se ecx registerine byte olarak "1" değerini yazar.  "0" sa ecx registerine byte olarak "0" değerini yazar.
seto byte ptr [ecx] = OF bayrağı "1" se ecx registerindeki adrese byte olarak "1" değerini yazar. "0" sa ecx registerindeki değere byte olarak "0" değerini yazar.
seto byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.


setno cl (OF=0) OF bayrağı "0" se ecx registerine byte olarak "1" değerini yazar.  "1" sa ecx registerine byte olarak "0" değerini yazar.
setno byte ptr [ecx] = OF bayrağı "0" se ecx registerindeki adrese byte olarak "1" değerini yazar. "1" sa ecx registerindeki değere byte olarak "0" değerini yazar.
setno byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.


setle cl = (ZF=1 or SF≠ OF) ZF bayrağı "1" se ve SF değeri OF değerine eşit değilse ecx registerine byte olarak "1" değerini yaz. Eğer ZF bayrağı "0" sa ve SF değeri OF değerine eşitse ecx registerine byte olarak "0" değerini yaz.
setle byte ptr [ecx] =  (ZF=1 or SF≠ OF)  ZF bayrağı "1" se ve SF değeri OF değerine eşit değilse ecx registerindeki adrese byte olarak "1" değerini yaz. Eğer ZF bayrağı "0" sa ve SF değeri OF değerine eşitse ecx registerindeki adrese byte olarak "0" değerini yaz.
setle byte ptr [02F7002C] = Yukardakinin aynısı geçerlidir. 02F7002C adresine sonuçları yazar.


Call types

Kod:
"call 7FF7260110D0"   =  (Subroutine call) Alt program çağrıları diye adlandırılır. Belirtilen adresteki alt programı çağırır.
"call rcx"    = (Register indirect call) Belirtilen bir kayıt üzerindeki değeri adres olarak kullanarak alt programı çağırır.
"call [7FF7260110D0]" = (Memory indirect call) Bellek adresindeki değeri alarak, bu değeri alt programın adresi olarak kullanarak alt programı çağırır.



Soru 1 : Negatif sayı veya pozitif sayı nedir ?
Cevap: Sıfırdan büyük her reel (gerçek) sayılara pozitif sayı, sıfırdan küçük her reel (gerçek) sayılara negatif sayı denir.

Soru 2 : 0 sayısı tüm negatif sayılardan büyük müdür ?
Cevap : 0 sayısı negatif ve pozitif bir sayı değildir. Nötr bir sayıdır.

Soru 3 : Nötr bir sayı nedir ?
Cevap : Negatif sayılardan büyük -1 < 0
Pozitif sayılardan küçüktür. 0 < 1

Örnek :

1 / 99 arası pozitif sayı
-1 / -99 arası negatif sayı






Registerler :



unknown.png



unnamed.gif


FVMjfuAXoAY7mN-.jpg


1680730527052.png
 
Son düzenleme:
We Love TESLA ⚡️
Kurucu
Katılım
13 Eyl 2015
Mesajlar
1,301
Çözümler
16
Tepki puanı
4,569
Ödüller
16
Yaş
95
10 HİZMET YILI
xchg eax,[00D60040]
burdaki eax değerinimi okuyor yoksa direk eaxımı okuyor ?
eax mı [eax] mı ?
 
ConfuserEX King
Banlı Üye
Katılım
15 Nis 2019
Mesajlar
118
Tepki puanı
17
Yaş
33
7 HİZMET YILI
Assembly dilini öğrenmek şart bir exe cr4ck'lerken yada vs vs kısaca çok işe yarıyor.
 
  • Konuyu başlatan
  • Moderatör
  • #4
x86-x64 Assembly
Kurucu
Katılım
28 Kas 2015
Mesajlar
500
Çözümler
1
Tepki puanı
782
Ödüller
11
10 HİZMET YILI
xchg eax,[00D60040]
burdaki eax değerinimi okuyor yoksa direk eaxımı okuyor ?
eax mı [eax] mı ?

eax sadece knk eax registerinde yazan değeri alıyor oradakini adres olarak görüp içindeki değeri değil bir nevi takas ediyolar değerleri
 
  • Konuyu başlatan
  • Moderatör
  • #8
x86-x64 Assembly
Kurucu
Katılım
28 Kas 2015
Mesajlar
500
Çözümler
1
Tepki puanı
782
Ödüller
11
10 HİZMET YILI
Yeni işlem kodları eklendi
 
Son düzenleme:
Onaylı Üye
Katılım
13 Ara 2015
Mesajlar
51
Tepki puanı
18
Ödüller
9
10 HİZMET YILI
Güzel anlatım. cmp ile "=,>,<" kontrolü ekleyip bunu je jne jl... gibi komutların nasıl kullanıldığınıda açıklayabilirsin, push ile stack'a değer yazdırmayı açıklayabilirsin.(pop'ta var tabi)

C++:
örnek :
mov eax,0// 0 değerini eax'a yazdır
    push eax // eax değerini(0) stack'a taşı

imul ile sayıların çarpımını, div ile sayıların bölümü ,inc ile değeri artırmayı, dec ile azaltmayı; gibi daha bir çok şeyi açıklayabilirsin.
ama c dili ile yazılmış fonksiyonları inline asm ile yazıp örneklendirirsen, daha çok öğretici niteliğinde olur bence.

C:
 örnek:
char* başlık="test mh";
       char* mesaj="deneme";

    //   MessageBoxA(0,mesaj,başlık,0);

     __asm mov eax,0// 0'ı eax'a yazdır
        __asm   push eax // eax'ı stack'a taşı
        __asm   mov ecx,başlık // başlık değerini(yazısını) ecx'e yazdır
        __asm   push ecx// ecx'i stack'a taşı
        __asm   mov edx,mesaj// mesaj değerini(yazısını) edx'e yazdır
        __asm   push edx//edx'i stack'a taşı
        __asm   mov ebx,0// 0'ı ebx'e yazdır
        __asm   push ebx // ebx'i stack'a taşı
        __asm   call MessageBoxA // windows.h kütüphanesinden messageboxA fonksiyonunu çağır

son olarak kendi düşüncemi beyan etmek istiyorum: yıllarca bize asm'nin çok zor olduğunu ve bunun öğrenilmesi imkansızmış gibi lanse eden insanlar olmuştur. evet doğru zor ama abartıldığı kadar zor değil temel düzeyde(game hacking ile uğraşanlar için) bu o kadar da zor değil bana göre c dilini temel bir şekilde biliyorsa asmyide az çok kavrar.

(yazıyı biraz dikkatsizce yazdım ufak hatalar olabilir veya bir şeyi yanlışta açıklamış olabilirim emin değilim.)
 
  • Konuyu başlatan
  • Moderatör
  • #10
x86-x64 Assembly
Kurucu
Katılım
28 Kas 2015
Mesajlar
500
Çözümler
1
Tepki puanı
782
Ödüller
11
10 HİZMET YILI
Güzel anlatım. cmp ile "=,>,<" kontrolü ekleyip bunu je jne jl... gibi komutların nasıl kullanıldığınıda açıklayabilirsin, push ile stack'a değer yazdırmayı açıklayabilirsin.(pop'ta var tabi)

C++:
örnek :
mov eax,0// 0 değerini eax'a yazdır
    push eax // eax değerini(0) stack'a taşı

imul ile sayıların çarpımını, div ile sayıların bölümü ,inc ile değeri artırmayı, dec ile azaltmayı; gibi daha bir çok şeyi açıklayabilirsin.
ama c dili ile yazılmış fonksiyonları inline asm ile yazıp örneklendirirsen, daha çok öğretici niteliğinde olur bence.

C:
 örnek:
char* başlık="test mh";
       char* mesaj="deneme";

    //   MessageBoxA(0,mesaj,başlık,0);

     __asm mov eax,0// 0'ı eax'a yazdır
        __asm   push eax // eax'ı stack'a taşı
        __asm   mov ecx,başlık // başlık değerini(yazısını) ecx'e yazdır
        __asm   push ecx// ecx'i stack'a taşı
        __asm   mov edx,mesaj// mesaj değerini(yazısını) edx'e yazdır
        __asm   push edx//edx'i stack'a taşı
        __asm   mov ebx,0// 0'ı ebx'e yazdır
        __asm   push ebx // ebx'i stack'a taşı
        __asm   call MessageBoxA // windows.h kütüphanesinden messageboxA fonksiyonunu çağır

son olarak kendi düşüncemi beyan etmek istiyorum: yıllarca bize asm'nin çok zor olduğunu ve bunun öğrenilmesi imkansızmış gibi lanse eden insanlar olmuştur. evet doğru zor ama abartıldığı kadar zor değil temel düzeyde(game hacking ile uğraşanlar için) bu o kadar da zor değil bana göre c dilini temel bir şekilde biliyorsa asmyide az çok kavrar.

(yazıyı biraz dikkatsizce yazdım ufak hatalar olabilir veya bir şeyi yanlışta açıklamış olabilirim emin değilim.)

Yorum için teşekkürler ben bu kaynağı yazarken bi yandan bildiklerimi bi yandanda yeni işlem kodları keşfetmeye çalışıyorum, Bu konuyu yazarken bi yandan size öğretmeye bi yandanda kendim öğrenmeye çalışıyorum o yüzden basit olan " mov " gibi işlem kodlarını eklememiş olabilirim
 
  • Konuyu başlatan
  • Moderatör
  • #11
x86-x64 Assembly
Kurucu
Katılım
28 Kas 2015
Mesajlar
500
Çözümler
1
Tepki puanı
782
Ödüller
11
10 HİZMET YILI
Yeni işlem kodları eklendi

24.05.2019
 
Üye
Katılım
20 Nis 2019
Mesajlar
36
Tepki puanı
12
Yaş
26
7 HİZMET YILI
Birkaç şey eksik onlarıda yazayım :D
JE (Jump Equal) -- Eşitse atlar ;

cmp eax,1
je 0042952
push eax

yukarıdaki örnekte eax değeri 1'e eşit ise direk 0042952 addresine gider değilse zaten bir alta yani push eax'a kayar.

JNE - JNZ (Jump Not Equal) -- Eşit değilse atlar ;

cmp eax,1
jne 0042952
push eax

yukarıdaki örnekte eax değeri 1'e eşit değil ise direk 0042952 addresine gider değilse zaten bir alta yani push eax'a kayar.

JMP (Jump) -- Koşulsuz direk atlar ;

cmp eax,1
jmp 0042952
push eax

son örnekte ise karşılaştırmaya bakılmaksızın direk atlar ve atladığı adresteki kaynaktan devam eder.
 
  • Konuyu başlatan
  • Moderatör
  • #13
x86-x64 Assembly
Kurucu
Katılım
28 Kas 2015
Mesajlar
500
Çözümler
1
Tepki puanı
782
Ödüller
11
10 HİZMET YILI
Birkaç şey eksik onlarıda yazayım :D
JE (Jump Equal) -- Eşitse atlar ;

cmp eax,1
je 0042952
push eax

yukarıdaki örnekte eax değeri 1'e eşit ise direk 0042952 addresine gider değilse zaten bir alta yani push eax'a kayar.

JNE - JNZ (Jump Not Equal) -- Eşit değilse atlar ;

cmp eax,1
jne 0042952
push eax

yukarıdaki örnekte eax değeri 1'e eşit değil ise direk 0042952 addresine gider değilse zaten bir alta yani push eax'a kayar.

JMP (Jump) -- Koşulsuz direk atlar ;

cmp eax,1
jmp 0042952
push eax

son örnekte ise karşılaştırmaya bakılmaksızın direk atlar ve atladığı adresteki kaynaktan devam eder.


İyi yazmışın ben bunlar için ayrı konu düşünüyom çünkü bunların hangi bayraklar tarafından etkilenip işlem gördüğünüde belirtecem :D
 
  • Konuyu başlatan
  • Moderatör
  • #14
x86-x64 Assembly
Kurucu
Katılım
28 Kas 2015
Mesajlar
500
Çözümler
1
Tepki puanı
782
Ödüller
11
10 HİZMET YILI
amına koydugum kaç yıl oldu türkçeyi öğrenemedin ne yapacaksın asm falan


Kusura bakma ya zamanında ensar diye bi çocuk var, annesini sikecem diye türkçe derslerini hep kaçırdım biliyonmu ?
Hiçte unutmuyorum kuşların bi yandan cik cik diye ötüşü, annesinin ahlaması ohlaması
O yüzden idare etmeye çalış , bişey kapmaya bak benden
 
Üye
Katılım
5 Kas 2019
Mesajlar
2
Tepki puanı
2
Ödüller
4
Yaş
33
6 HİZMET YILI
Esenlikler Ve Merhabalar size bir sorum var da sorum Assembly Hakkında Assembly İle Oyunlara nasıl hack yapıp hile programlayabiliriz yardımcı olursanız sevinirim
 
Süper Üye
Katılım
13 Şub 2018
Mesajlar
801
Çözümler
1
Tepki puanı
155
Yaş
28
8 HİZMET YILI
Kusura bakma ya zamanında ensar diye bi çocuk var, annesini sikecem diye türkçe derslerini hep kaçırdım biliyonmu ?
Hiçte unutmuyorum kuşların bi yandan cik cik diye ötüşü, annesinin ahlaması ohlaması
O yüzden idare etmeye çalış , bişey kapmaya bak benden
Adam susturmus bildigin konu icin tesekkürler asm önemli dil bypass ve gsme hacking icin ögrenmek lazim bi ara
 
Sc@Mp*
Süper Üye
Katılım
16 Nis 2016
Mesajlar
706
Çözümler
6
Tepki puanı
97
Ödüller
10
Yaş
27
10 HİZMET YILI
Eline sağlık kral eyw işe yarar
 
Üst