Tengri
Moderatör
- Register boyutları;
- AL,AH,BL,BH = 8 bitAX,BX,CX vb. = 16 bitEAX,EBX,ECX,EDX,ESI,EDI.. = 32 bitRAX,RBX,RCX .. = 64 bit
Kod:
; KALIP 1 - ATAMA İŞLEMLERİ
; ASSEMBLY KODU ; C++ karşılığı
mov eax, ebx ; eax = ebx; // register'den registere aktarım
mov ecx, 3 ; ecx = 3; // register'a doğrudan değer atama
mov eax, 'j' ; eax = 'j' // 000000a6h = 0,0,0,'j'
mov edx, offset c3 ; edx = &c3; // edx, c3'e işaret eder. bir nevi char*edx = &c3;
mov ebx, [d]; ; ebx = (*d); // EBX'e d tarafından işaret edilen değeri aktar.
mov [edx], al ; *edx = al;
; offsetleme
mov ah, [edx] ; ah = *edx; // eax = 0,0,"jj"
mov ah, [edx+1] ; ah = edx[1] // eax = 0,0,"ej"
mov al, [ecx+edx] ; al = *(ecx+edx); // eax = 0,0,"el"
mov al, [edx+ecx*8] ; al = *(edx+ecx*8); katsayı 1, veya 2'nin katları olmalı (*1, *2, *4, *8)
mov al, [edx+ecx*4+1] ; al = *(edx+ecx*4+1)herhangi iki register, birisi katsayılı olabilir + sabit sayı
mov [edx+ecx*4+1], al ; *(edx+ecx*4+1) = al; offset olarak hedef
Kod:
; KALIP 2 - Aritmetik operasyonlar
;ASSEMBLY ; C++
add eax, ebx ; eax += ebx; // 32, 16 veya 8 bit toplama (register boyutuna göre değişir)
add ax, [w] ; ax += (*w); // toplama, ax değerine w değeri tarafından işaret edilen sayı eklenir
add [c1], al ; (*c1) += al; // toplama, pointer tarafından işaret edilen değere eklenir
sub eax, [d] ; eax -= (*d); // çıkartma, d değerinin işaret ettiği sayı eax'tan çıkartılır
inc eax ; ++eax; // eax'ın değeri 1 arttırılır
inc byte ptr [edx] ; ++*(char*)edx; // değişkenin boyutu özellikle belirtilmiş, pointerin işaret ettiği 8 bit değeri arttır.
inc word ptr [edx] ; ++*(short*)edx;
inc dword ptr [edx] ; ++*(long*)edx;
mov BYTE PTR [ESI], 5 ; ESI'nin işaret ettiği değere byte olarak 5 değerini yaz.
mov WORD PTR [ESI], 5 ; ESI'nin işaret ettiği değere unsigned short olarak 5 değerini yaz.
mov DWORD PTR [ESI], 5 ; ESI'nin işaret ettiği değere unsigned int olarak 5 değerini yaz.
dec eax ; --eax;
neg eax ; eax = -eax; // işaret değişimi
not eax ; eax = ~eax; // eax'ın tüm bitleri tersine çevrilir
and eax, ebx ; eax &= ebx; // bitwise and
or eax, ebx ; eax |= ebx; // bitwise or
xor eax, ebx ; eax ^= ebx; // bitwise xor
sal eax, cl ; eax sar eax, cl ; (long) eax >>= cl; // sağa doğru kaydır(işaretli), eax'ın bitleri cl kadar sağa kaydırılır. taşan bitler kaybolur. işaret biti korunur.
shr eax, cl ; (unsigned long) eax >>= cl; // sağa doğru kaydır (işaretsiz),eax'ın bitleri cl kadar sağa kaydırılır. taşan bitler kaybolur. işaret korunmaz.
imul bl ; ax = al * bl; // 8 bit işaretli çarpma işlemi
imul bx ; dx:ax = ax * bx; // 16 bit işaretli çarpma işlemi
imul ebx ; edx:eax = eax * ebx; // 32 bit işaretli çarpma işlemi
mul ebx ; edx:eax = eax * ebx; // 32 bit işaretsiz çarpma işlemi
idiv ebx ; edx = eax % ebx; eax /= ebx; // 8,16,32 bit işaretli bölme işlemi
div ebx ; edx = eax % ebx; eax /= ebx; // ...işaretsiz bölme işlemi
Kod:
; KALIP 3 - CAST (dönüştürme)
cbw ; ax = (short) al; // al, ax, sadece EAX için kullanılabilir
cwd ; eax = (long) ax; // ax'teki değeri long olarak eax'a aktar
cdq ; edx = -(eax movsx bx, al; ; bx = (short) al; // AL'deki değeri işaretli short olarak BX'e aktarır
movzx bx, al; ; bx = (unsigned short) al; // AL'deki değeri işaretsiz short olarak BX'e aktarır
movsx ebx, ax; ; ebx = (long) ax; // AX'teki değeri işaretli int olarak ebx'e aktarır
movzx ebx, ax; ; ebx = (unsigned long) ax; // AX'teki değeri işaretsiz int olarak ebx'e aktarır
Kod:
; KALIP 4 - Dallandırma ve döngü (if, for, while..)
; Compare (operands as in MOV)
cmp eax, ebx ; CF, OF, SF, ZF bitlerini karşılaştırır
ja l1 ; if (eax > ebx) goto l1; // işaretsiz karşılaştırma
jb l1 ; jae l1 ; >=
jbe l1 ; je l1 ; ==
jne l1 ; !=
jg l1 ; if (eax > ebx) goto l1; // işaretli karşılaştırma
jl l1 ; jge l1 ; >=
jle l1 ; jmp l1 ; goto l1;
l1: ; l1: // etiket