Assembly Nedir ? Assembly ' in İşleyişi

Assembly dili hakkında bilgiler, kaynaklar, dokümanlar ve örneklerin bulunduğu bölümümüz.
Cevapla
Kullanıcı avatarı
admin
Sistem Geliştiricisi
Sistem Geliştiricisi
Mesajlar: 832
Kayıt: 28 Ağu 2022 04:38
Konum: Database
Meslek: Teknisyen
Teşekkür etti: 456 kez
Teşekkür edildi: 308 kez
İletişim:

Assembly Nedir ? Assembly ' in İşleyişi

Mesaj gönderen admin »

Assembly Nedir ? Assembly ' in İşleyişi

Resim
örnek assembly kodu
Konu Dışı
Not: Konu sonunda eklenti olarak paylaşılmış Assembly ve Assembler ile ilgili 2 adet dosya vardır. İndirip inceleyebilirsiniz.
Çevirme dili ya da assembly dili (İngilizce: assembly language), bir bilgisayarda tüm işlemleri işlemci gerçekleştirir ve işlemcinin de, makine dili denen kendine has bir dili vardır. İşlemci yalnızca bu dili anlar ve bu dili kullanarak anlaşırsınız. Fakat bu dili öğrenmek ve kullanmak çok zordur. Bu nedenle insanların anlayabileceğimiz bir dilde konuşup ardından işlemcinin diline çeviren yazılımlar geliştirilmiştir. Bunlara derleyici denir. Derleyiciler de bir dile sahiptir fakat işlemcinin diline göre çok daha kolaydır. İşte bu derleyici dillerinden biri de Assembly' dir. Çevirici dil, bilgisayar programlarının yazılmasında kullanılan alt seviyeli bir dildir.

Resim
örnek assembler düzenleyici editör

1.BÖLÜM - Tipik Bilgisayar Mimarisi ve Assembly' in işleyişi

Bir bilgisayar her saniye başına makine kodu üretir. Siz işlem yapmasanız da, arka planda çalışan
işlemler bunu yapmaya zorlar. Hatta kapalı iken bile bilgisayar aslında çalışıyordur.

İşte Çalışan Birimler:

1-SAAT ; Sistem tamamen saate bağımlı çalışır! Bilgisayarın saati yoksa o PC'den hiç birşey olmaz
2-BIOS ; Temel giriş çıkış sistemi sistem saatini ayarladığından çalışır
3-CMOS ; Ha bu neden çalışıyor derseniz, buda verileri BIOS çipine yazar.

Peki bunları nasıl yapar?

Makine Dili birçok amaçla kullanılır. Yani bir 1 ve 0 farklı yerlerde kullanılır şöyle bakalım


Bir makine nasıl toplama yapar(Makine: Bilgisayar):

SEMBOLİK MAKİNE KODU ---- HEX KODU ---- BINARY KODU ---------- AÇIKLAMA
ADD(TOPLAMA)------0x00----- 0000 0000----- : bu toplama için kullanılır.
SUB(ÇIKARMA)----- 0x01----- 0000 0001----- ; bu çıkarma için kullanılır.
MUL(ÇARPMA)----- 0x0A----- 0000 1010---- ; bu çarpma için kullanılır.
DIV(BÖLME)----- 0XFF----- 1111 1111------; bu bölme için kullanılır.



Şimdi Kısaca Assembly nedir(x86)?

Assembly Intel'in geliştirdiği bil dildir. İşlemci komutlarının kısaltmasıdır.
ÖRNEK : ADD -> ADDITION gibi...

Merhaba Dünya, yazmayacağım çünkü merhaba dünya yazmak için 10 satır kod gerekiyor ve temel assembly bilgiside gerekiyor!

KISACA KOMUTLAR

AL(ACCUMULATOR LOCATI ON) = 8 BİTLİK AKÜMÜLATÖRDÜR
ÖRNEK:
xchg al, 4ch ; fonksiyonu taşır(FAKAT GEÇİCİDİR)

Özet:
AL fonksiyon taşımak veya küçük çapta
verileri taşımak için kullanılan bir
akümülatördür.

AX(ACCUMULATOR REGISTER=(X)) = 16 BİTLİK AKÜMÜLATÖRDÜR
ÖRNEK
mov ax, 62 ; sayı akümülatöre taşındı.

Özet:
AX veri taşımak için kullanılır. Sayı ve
diğer işlemler içinde kullanılabilir.

EAX(EXTENTED ACCUMULATOR REGISTER=(X)) = 32 BİTLİK AKÜMÜLATÖRDÜR
ÖRNEK
mov eax, ebx ; bölgedeki veriyi akümülatöre taşıdı.

Özet:
EAX 32 bitlik veri yazmacıdır. Verileri taşır,
isterseniz genişletebilirsiniz


NOT** = 16 veya 8 bitlik bir veriyi taşırken
devreye başka komutlar girer


CWD(CONVERT WORD TO DOUBLE) = VERİLERİ DUBLE CİNSE ÇEVİR
MOVSX(MOVE WORD WITH SIGN EXTENTION) = VERİLERİ DUBLE CİNSE GENİŞLET
MOVZX(MOVE WORD WITH ZERO EXTENTION) = VERİLERİ GENİŞLETMEDEN TAŞI

Aynı işlevi görür ama MOVZX veriyi genişletmez!

ÖRNEK
;-------------------------------
MOV [AX], 10 ; akümülatöre değer atadık
CWD [EAX], AX ; veriyi 16 bitten 32 bite çevirdik
ÇIKTISI
AX = 10 idi
EAX = 000010 olur
O halde, AL+AX = EAX
yani EAX = 0000 idi
EAX+AL = 000010 oldu.
;------------------------------
MOVSX EAX, AX ; Aynı işlem yapıldı
;------------------------------
EDI = EXTENTED DESTANATION INDEX, ESI = EXTENTED SOURCE INDEX
MOVZX EDI, ESI ; kaynak veri hedefe taşındı
NOT** = Burda genişleme olamaz ve korumalı kip olması için intel movzx komutu ile kaynak indisin değerinin bozulmaması için
bu komutu geliştirmiştir.


BL = (BASE LOCATI ON)
Örnek
mov al, bl ; bölgedeki veri al'ye taşındı
NOT** = Bir veri eğer akümülatör kapasitesinden büyükse o veri taşınmaz

Örnek Hatalı kod
mov al, eax ; 32 bitlik veri 16 bit'e doğal olarak taşınamaz!
Özet:
BL bir base yani alan tutucudur. Verilerinizi bekletmek için buralara koyabilirsiniz!
UNUTMAYIN ** AL'DEKİ gibi GEÇİCİ OLARAK BEKLETİR!.

İŞTE KORUMALI, KORUMASIZ KİP BURDAN GELİR!16 BİT VE 32BİT KORUMALI KİPTİR.!!!


BX = (BASE REGISTER)
Örnek
mov ax, bx ; bölgedeki veri ax'e taşındı

Aynı notlar bunun içinde geçerlidir!!!

Özet:
BX bir base alan tutucudur. 16 bittir verilerini bölgeye
"KAYDEDEBİLİRSİNİZ!"(KORUMALI KİPİN FAYDALARI)

----------------------------

EBX=(EXTENTED BASE REGISTER=(X))
Örnek
MOV EBX, EAX ; eax'taki veri ebx'e taşındı
Özet
Ebx bölge yazmacıdır. Verileri taşır ve kaydersiniz ebx vs..
genişletilmiş yazmaçlar. Linux i386 Kernellerinde ve çeşitli
tcp/ip soket programlamada kullanılır. KORUMALI KİPTİR.

;===== (SAYI YAZMAÇLARI ) =====


CL = (COUNTER LOCATI ON)


Örnek
MOV CL, 62 ; 62 fonksiyonunu CL'ye taşıdık.
MOV AL, CL ; CL mutlaka kendi başına kalamaz al ile tamamlanır.
Özet
CL sayı yazmacıdır. Genelde içine fonksiyon alır. Ama asıl görevi sayılarla ilgilidir.
"KORUMASIZ" KİPTİR!!!


CX = (COUNTER REGISTER=(X))

Örnek
NOP ; işlem yok nop= no operation
MOV CX, BX ; bölgedeki veriyi sayı yazmacına ata

Özet
CX ile büyük sayılar işlemi yapabilirsiniz. KORUMALI KİPTEDİR.!!


ECX = (EXTENTED COUNTER REGISTER=(X))

Örnek
MOVSX ECX, CX ; cx'teki veri büyüyerek ecx'e alındı. UNUTMA** = 0000=EAX -> CWD*,MOVSX* için.

Özet
ECX sayı yazmacıdır. Bölgelerin yerini bulmak veya
büyük işlemler için kullanılır.


;===== ( VERİ YAZMAÇLARI ) =====


DL = (DATA LOCATI ON)


Örnek
MOV DL, CL ; veriyi alıp veri yazmacına kaydetti

NOT** = DL önemli bir yazmaçtır. Segment Yazmaçları ile önemli derecede bağlantıları vardır!!



BAŞLICA SEGMENTLER

DSEG = (DATA SEGMENT)
SSEG = (STACK SEGMENT)
CSEG = (CODE SEGMENT)
IP = (INSTRUCTION POINTER)


Bunlar genel verileri listelemek için kullanılır.

DSEG = Verileri bir yerde toplar ve erişim sağlar
ÖRNEK:
DSEG DB $1,$2 ; veri segment global bir segmenttir.

** Global Segmentler nedir?

1-Her yerden erişilir.
2-Fonksiyon veya makro çağırabilirsiniz
3-Olmazsa olmazdır!

SSEG = Yığını belirler ve aynı zamanda boş alanın ne kadar 0 ile doldurulacağını belirler
ÖRNEK
SSEG DUP(?)13

DUP** = Duplacation Factor.Bu hiçbir zaman bilinmez nedeni bilgisayarın nereleri 0 ile dolduracağını
kimse hesaplayamaz ve olasıklarda buna el vermez.

CSEG = Kod burada geçer. PROC yani içinde proccesure barındırır. PROC FAR gibi...
Örnek
CSEG START
MAIN PROC FAR
LDS WORD PTR[AAAA], ESP
.
.
.
VS..
IP = Genelde bunu elleyemezsiniz bunu bilgisayar kendi belleğine göre yapar.
ÖRNEK
?

HEPSİNİ BİTİŞİNDE

[SEGMENTADI] ENDS yazılır
Örnek
CSEG ENDS ; gibi


* Veri yazmaçlarına devam...

DX = (DATA REGISTER=(X))
Örnek
MOV DS, DX ; veriyi veri segmentine taşı
Özet
16 bitlik taşıyıcıdır.Veriyi kaydeder!!! Korumalı Kiptedir!!!

EDX = (EXTENTED DATA REGISTER=(X))
Örnek
MOV EDX, ECX ; sayıyı veri yazmacına kaydettik
Özet
32 bit kayıt eder(KORUMALI KİPTE). Genellikle TCP/IP soket
programlamada gelen verileri, veri yazmacına yazdırır.

8 bitlik korumalı yazmaç - 2 tanedir ve bunlar hepsini tamamlar örnek

AH+AL=AX (8+8=16)
AX+AL+AH=EAX (16+8+8=32)


;======= ( STACK POINTER ) ======


SP=(STACK POINTER)
Örnek
NOP ; işlem yok
POP BP ; yığından çek
POP SP ; yığından çek
MOV BP, SP ; yığındaki veriler bölgeye gönderildi

Özet:
Stack pointer önemli bir parametredir. Yığındaki verileri
istenilen veriye taşır ve kodun akışını sağlar, global veya
içsel makrolarda veya yordamlarda kullanılabilir.

NOT** = POP(POP WORD) - Bu parametreyi her zaman kullanmalısınız,
veriler bellekte otamatik olarak yığılır ve bu yazmaçlar
sayesinde bu işlem gerçekleşir. İlk önce noktalayıcıları
yığından yani işinden alıp kendi işiniz için çalıştırmanız
gerekir.



ESP = (EXTENTED STACK POINTER)
Örnek
MOV EBP, 7C00 ; sistem önyükleyicisini hedef belirledir (NOT=7C00(MASTER BOOT RECORD))
MOV ESP, 62 ; yığına 62 ekledik
MOV EBP, ESP ; yığından veriyi mbr'nin üstüne yazdık.(TABİ BU ÖRNEK BÖYLE BİRŞEYE SİSTEM NAH İZİN VERİR )
Özet:
Esp'de bir yığın noktalayıcıdır.İkiside yani; sp, esp yığınları
kontrol edebilir ve dl,dx,edx ile yığın segmentine bağlanabilir.


;====== ( BASE POINTER ) =======
BP=(BASE POINTER)
Örnek
POP BP ; yığından al
POP SP ; yığından al
SUB BP, SP ; bölgeden yığını çıkardık

Özet:
BP bölge noktalayıcıdır. Sistemde belirli bir aygıt üzerinde çalışırken
mesela sabit diskinizin mbr'sini programlarken kullanabilirsiniz. Bunun
yanında BP gene yığından çağırılmalı nedeni ise gene bilgisayardan onu
ayırmanız gerekir. Kendi emrinize sokmanız için...

NOT** = Bir virüs yazarı bu parametre ile mbr'nin üstüne virüsü yazabilir.
Not kendiniz denemeye kalkmayın yapamazsınız nedeni ileriki derslerde
bir sistemin nasıl sistem moduna alınacağını yazmadığım.
Kısaca şimdi bahsedeceğim

Win95'in IFSMgr'leri ile sistem yazma/silme işlemleri yapılır.

IFSMgr_Ring0_FileIO = Çekirdek modu yani herşey serbesttir. Örneğin BIOS'u silip yazabilirsiniz
IFSMgr_Ring1_FileIO = Aygıt ve kabuk modu
IFSMgr_Ring2_FileIO = Aygıt modu
IFSMgr_Ring3_FileIO = Uygulama modu

Daha fazlası ileriki derslerde yazacağım


EBP=(EXTENTED BASE POINTER)
Örnek
POP EBP ; yığından al
MOV ESI, EBP ; yığına taşı
Özet
Aynı işlemleri 32 bitte yapar yanlız, sistem modu içinde kullanılabilir.

;===== ( TEMEL ASSEMBLY TAŞIMA KOMUTLARI ) =====

MOV = VERİLERİ TAŞIR
|
+ AX (AH, AL, EAX)
|
+ BX (BH, BL, EBX)
|
+ CX (CH, CL, ECX)
|
+ DX (DH, DL, EDX)

Özelliği:
Her veri rahatlıkla taşınabilir.

XHCG = VERİLERİ DAHA VERİMLİ TAŞIR
|
+ AX (AH, AL, EAX)
|
+ BX (BH, BL, EBX)
|
+ CX (CH, CL, ECX)
|
+ DX (DH, DL, EDX)

Özelliği:
Her veri rahatlıkla takas edilir.

MOVSX = VERİLERİ GENİŞLETEREK TAŞIR
|
+ AX (AH, AL, EAX)
|
+ BX (BH, BL, EBX)
|
+ CX (CH, CL, ECX)
|
+ DX (DH, DL, EDX)

Özelliği:
Her veriyi 32 bit'e çevirir

MOVZX = VERİLERİ GENİŞLETMEDEN HEDEFE TAŞIR
|
+ SI (ESI) = SOURCE INDEX, EXTENTED SOURCE INDEX
|
+ DI (EDI) = DESTANATION INDEX, EXTENDED DESTANATION INDEX

LEA = AKTİF VERİLERİ KAYNAKTAN ALIR HEDEFE TAŞIR VEYA VERİYİ TAŞIR
|
+ DS,CS,SS,IP
|
+ SI(ESI)
|
+ DI(EDI)

Özelliği:
Hızlı ve verimlidir.
LDS = VERİYİ SEGMENTLERE YÜKLER
|
+ DS,SS,CS,IP
|
+ DI,EDI,SI,ESI
|
+ AX, BX, CX, DX
|
+ EAX, EBX, EDX, ECX
|
+ ESP, EBP, SP, BP

Özelliği:
Segmente yükleme yapar

;===== ( WORD PTR, BYTE PTR )======

Bu yukarıdaki şeyler bunun anlaşılması için yazdım çünkü komutları kullanacağız

BAŞLAMADAN ÖNCE ÇOK ÇOK ÖNEMLİ BİR NOT;
ASSEMBLY SAĞDAN SOLA OKUNUR!!!


WORD PTR = (WORD POINTER)
Örnek
mov ax, word ptr[aaaa] ; aaaa adlı word'ü ax'e taşıdık
Özet:
Genel olarak word ptr'lar içerik almak ve kontrol
olarak kullanılır.
Buna örnek
LEA ESI, WORD PTR[INT21H+80] ; diski ve bios word noktalayıcı olarak ayarladık ve kaynak ilan ettik

BYTE PTR = (BYTE POINTER)
Örnek
lds ds, byte ptr[21] ; disk verilerini aldık
Özet:
İçerik almak ve bellek yönetimi için kullanılır.
Virüs yazımında kullanılma amacı hedef şeçer ve
bellekteki dosya dizilimlerini bulur *.com
*.exe gibi...

Ekte Assembly ve Assembler ile ilgili iki doküman bulunmaktadır.
Dosya ekleri
assembly.zip
(3.39 KiB) 16 kere indirildi
ASSEMBLER.zip
(17.94 KiB) 17 kere indirildi
Daha zeki olmanın tek yolu, daha zeki bir rakiple oynamaktır.

Etiketler:
Cevapla

“Assembly” sayfasına dön