x86 Assembly Instructions

Instructionlara başlamadan önce kısa bilgiler vereceğim.

  • Bazı durumlarda statik veri bölgeleri bildirmemiz gerekebilir. DB, DW ve DD direktifleri sırasıyla bir, iki ve dört bayt veri konumu bildirmek için kullanılabilir.

örnek1

  • Array’leri tanımlamak için DUP kullanılır. Assembler, DUP ile verilen veriyi belirtilen sayı kadar çoğaltır.  Örneğin 4 DUP(9) verelim. Çıktı 9 9 9 9 olur. DUP, x86 sistemlerde kullanılır. x64 sistemlerde bu işlemi ‘times’ ile gerçekleştiririz.

value: db 10 DUP(13) ; Konumu ‘value’ olarak adlandırılan, 10 adet 13 değeri içeren 1 byte’lar oluştur (toplam 10 byte).

  • Adresleme modları birçok x86 instruction’ıyla kullanılabilir. Bu instruction’lardan biri olan ‘mov’ instruction’ı, veriyi registerlar ile bellek arasında taşır. İki operand alır: birincisi hedefi, ikincisi kaynağı belirtir.

mov eax, [ebx] ; Bellekteki 4 byte’ı ebx’e taşır, ebx’teki veriyi eax’e taşır. (4 byte = 32 bit)
mov [var], ebx ; ebx içeriğini bellekteki 4 byte’lık ‘var’ adresine taşır.
mov eax, [esi -4] ; Bellekteki esi + (-4) adresindeki 4 byte’ı eax’e taşır.
mov [esi+eax], cl ; cl içeriğini esi+eax’teki byte’a taşır,
mov edx, [esi+4*ebx] ; esi+4*ebx adresindeki 4 byte veriyi edx’e taşır.

NOT: Register değerleri yalnızca eklenebilirdir. ” mov eax, [ebx-ecx] ”  yapılamaz.

NOT: Adres hesaplamalarında tek seferde en fazla 2 adres kullanılabilir.                              ” mov [eax+esi+edi], ebx ” yapılamaz.

*Boyut Yönetimi

Bir verinin belirli bir hafıza adresindeki hedeflenen büyüklüğü, referans aldığı assembly kodu instruction’ından anlaşılabilir. Mesela “mov ebx, 2” instruction’ını ele alalım. Burada 2 değeri ebx ile belirtilen adresin tek byte’ına mı taşınır? Yoksa 2 değerinin ebx ile gösterilen adresin boyutuna denk gelen karşılığı mı taşınır? İkisi de kabul edilebilirdir. Ancak assembler’a hangisini yapması  gerektiğini söylememiz gerekir.

mov byte ptr [ebx], 2 ; ebx’teki adrese 2 değerinin 1 byte’lık karşılığı taşınır. byte = 1 byte

mov word ptr [ebx], 2 ; ebx’teki adrese 2 değerinin 2 byte’lık karşılığı taşınır. word = 2 byte

mov dword ptr [ebx], 2 ; ebx’teki adrese 2 değerinin 4 byte’lık karşılığı taşınır. dword = 4 byte

Instructions

*Veri taşıma için kullanılan instructionlar:

mov : İkinci operanddaki veriyi birinci operanda kopyalar.Registerlar arası kopyalama yapılabilir ama doğrudan bellekten belleğe  kopyalama yapamaz. Bellekten belleğe kopyalama yapılacağı takdirde öncelikle kaynak bellek adresindeki veri bir registera taşınır,  daha sonra bu registerdaki değer hedef bellek adresine taşınır.

push : İlk önce ESP’yi 4 düşürür, sonra operandı [ESP]’deki 4 byte’lık konuma yerleştirir. x86 sistemlerde stack yüksek adreslerden  düşük adreslere doğru büyür.

push eax ; eax’i stack’in üstüne yerleştirir.
push [var] ; ‘var’ adresindeki 4 byte’ı stack’in üstüne yerleştirir.

pop : Yığının tepesindeki 4 byte’ı belirtilen adrese koyar, ardından stack’i 4 artırır.

pop edi ; Stack’in başındaki veriyi edi’ye taşır.
pop [ebx] ; Stack’in başındaki veriyi ebx ile başlayan 4 byte bellek adresine taşır.

lea : İkinci operand ile belirtilen adresi ilk operand ile belirtilen registera taşır. Dikkat edilmesi gereken şey adresin içeriğinin değil adresin kendisinin taşınıyor olmasıdır.

*Aritmetik ve Mantıksal Instructionlar

add : Verilen iki operandı birbirine ekler ve sonucu birinci operanda kaydeder.

sub : Verilen iki işlenenin birincisinden ikinci çıkarılır, sonuç birinciye yazılır.

inc, dec : inc instruction’ı operandın değerini birer birer artırır. dec instruction’ı operandın değerini birer birer azaltır.

*Kontrol Akışı Instructionları

jmp (jump) : Operand tarafından belirtilen hafıza konumundaki instructionlara program akışını aktarır.

jmp begin ; begin isimli instructiona atla.

jcondition : Şartlı atlama. Belirtilen koşul sağlanıyorsa belirtilen instructiona atla.

je <label> ; jump when equal
jne <label> ; jump when not equal
jz ; jump when last result was zero (sonuç sıfırsa atla)
.
.
.
cmp (compare) : Verilen iki operandı karşılaştırır.

call, ret : Altişlem çağrısı ve return. call instructionı ilk önce mevcut konumu stack’e push eder. Daha sonra operand ile belirtilen konuma atlar. jmp instructionından farklı
olarak alt işlemi tamamladıktan sonra döneceği konumu kaydeder.

Reklam

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s