
Genel Kavramlar
CPU Tasarımı, Talimat yürütme döngüsü
IA-32 İşlemci Mimarisi
İşlem modları, CPU Kayıtları ve Bayrakları, Intel CPU Geçmişi
IA-32 Bellek Yönetimi
Gerçek adres modu, bölümlere ayrılmış bellek, sayfalama
Giriş-Çıkış Sistemi
Giriş / çıkış sistemi seviyeleri
Anahat
Programları Birleştirme, Bağlama ve Çalıştırma
Assembly Dilinin Temel Öğeleri
Örnek: Tamsayı Toplama ve Çıkarma
Verileri Tanımlama
Sembolik Sabitler
Gerçek Adres Modu Programlama
Anahat
Programları Birleştirme, Bağlama ve Çalıştırma
Assembly Dilinin Temel Öğeleri
Örnek: Tamsayı Toplama ve Çıkarma
Verileri Tanımlama
Sembolik Sabitler
Gerçek Adres Modu Programlama
Assemble-Link Yürütme Döngüsü
Aşağıdaki şema, bir kaynak oluşturmanın adımlarını açıklamaktadır.program derlenmiş programı çalıştırarak.
Kaynak kodu değiştirilirse, 2’den 4’e kadar olan Adımlar tekrarlanmalıdır.
Liste Dosyası
Programınızın nasıl derlendiğini görmek için kullanın
Projeden sonra adlandırılır, örneğin proje.lst
Baskıya uygun
Şunları içerir;
kaynak kodu
adresler
nesne kodu (makine dili)
segment adları
semboller (değişkenler, prosedürler ve sabitler)
Ayrıntılı açıklamalı 72-74. Sayfalardaki örnek- LÜTFEN OKUYUN!
Anahat
Programları Birleştirme, Bağlama ve Çalıştırma
Assembly Dilinin Temel Öğeleri
Örnek : Tamsayı Toplama ve Çıkarma
Verileri Tanımlama
Sembolik Sabitler
Gerçek Adres Modu Programlama
Basit elementler
Tamsayı sabitleri ve ifadeleri
Karakter ve dize sabitleri
Ayrılmış kelimeler ve tanımlayıcılar
Yönergeler ve talimatlar
Etiketler
Anımsatıcılar ve İşlemciler
Yorumlar
Tamsayı Sabitleri
[{+ | -} basamak [taban] |
İsteğe bağlı önde gelen + veya - işareti
İkili, ondalık, onaltılık
Yaygın taban karakterleri:
Örnekler: 30d, 6Ah, 42, 1101b
Onaltılık bir harfle başlayamaz: 0A5h
Tamsayı İfadeler
Montaj zamanında değerlendirildi
Örnekler:
Karakterler ve Dizeler
Karakteri tek veya çift tırnak içine alın
'A', "x"
ASCII karakteri = 1 bayt
Dizeleri tek veya çift tırnak içine alın
"ABC"
'xyz'
Her karakter tek bir bayt kaplar
Gömülü alıntılara izin verilir:
"" İyi geceler "deyin Gracie '
"Bu bir test değil"
Ayrılmış Kelimeler ve Tanımlayıcılar
Ayrılmış sözcükler tanımlayıcı olarak kullanılamaz
Talimat anımsatıcıları, yönergeleri, tür öznitelikleri, operatörler,önceden tanımlanmış semboller
Ek A'daki MASM referansına bakın
Tanımlayıcılar
1-247 karakter, rakamlar dahil
büyük / küçük harfe duyarlı değil
ilk karakter bir harf, _, @,? Veya $ olmalıdır
etiketler (prosedür isimleri, değişkenler), sabitler için kullanılır
Direktifler
Montajın nasıl yapılacağına ilişkin talimatlar (@ runtime değil)
Montajcı tarafından tanınan ve uygulanan komutlar
Intel talimat setinin parçası değil
kodu, veri alanlarını bildirmek, bellek modelini seçmek, bildirmek için kullanılırprosedürler, değişkenler vb.
büyük / küçük harfe duyarlı değildir (.data, .DATA ve .Data)
Farklı montajcıların farklı direktifleri vardır
GNU assembler, netwide assembler, MASM ile aynı değil
Yönergeler: Segmentleri Tanımlama
assembler direktiflerinin önemli bir işlevi,program bölümlerini veya segmentlerini tanımlayın
- data
- code
- stack 100h
Intel Talimatları
assembler tarafından makine koduna monte edilir
CPU tarafından çalışma zamanında yürütülür
Bir talimat şunları içerir:
Etiket
(isteğe bağlı)
Anımsatıcı
(gereklidir)
Operand (lar)
(talimatlara göre değişir)
Yorum
(isteğe bağlı) - ';' ile başlar
[etiket:] anımsatıcı [işlenenler] [; yorum]
loop1: moveax, 32; dizi öğelerinin sayısı
Etiketler
Yer işaretçisi olarak hareket edin
kod ve verilerin adresini (ofset) işaretler
Tanımlayıcı kurallara uyun
Veri etiketi (Değişken adları)
benzersiz olmalıdır
örnek: DWORD 100'ü sayın
(ardından iki nokta üst üste gelmez)
Kod etiketi
atlama ve döngü talimatlarının hedefi
örnek: L1:
(ardından iki nokta üst üste)
No operands
stc ; Carry bayrağını ayarla
One operand
inc eax ; Kayıt ol
inc myByte ; hafıza
Two operands
add ebx,ecx ; kayıt ol
sub myByte,25 ; hafıza, sabit
add eax,36 * 25 ; reg, const-expr
NOP Talimatı
İşlem Yok
En güvenli ve en yararsız talimat
1 baytlık depolama kullanır
CPU: Okur, Kodunu Çözer, Yok Sayar
Genellikle kodu çift adres sınırlarına hizalamak için kullanılır(4’ün katı):
00000000668BC3movax,bx
0000000390nop;alignnextinstruction
000000048BD1movedx,ecx
x86 işlemciler kodu ve verileri daha fazla yüklemek için tasarlanmıştırçift kelime adreslerinden bile hızlı bir şekilde.
Anahat
Programları Birleştirme, Bağlama ve Çalıştırma
Assembly Dilinin Temel Öğeleri
Örnek: Tamsayı Toplama ve Çıkarma
Verileri Tanımlama
Sembolik Sabitler
Gerçek Adres Modu Programlama (!!!)
TITLE Program Template (Template.asm)
.data
(değişkenleri buraya girin)
.code
main PROC
; (çalıştırılabilir talimatları buraya ekleyin)
main ENDP
; (ek prosedürleri buraya ekleyin)
END main
Örnek: Tamsayı Toplama ve Çıkarma
TITLE Add and Subtract (AddSub.asm)
; Bu program 32 bitlik tam sayıları ekler ve çıkarır.
INCLUDE Irvine32.inc
.code
main PROC
moveax,10000h ; EAX = 10000h
add eax,40000h ; EAX = 50000h
sub eax,20000h ; EAX = 50000h
call DumpRegs ; display registers
exit
main ENDP
main ENDP
Örnek Çıktı
Kayıtları ve bayrakları gösteren program çıktısı:
EAX=00030000 EBX=7FFDF000 ECX=00000101 EDX=FFFFFFFF
ESI=00000000 EDI=00000000 EBP=0012FFF0 ESP=0012FFC4
EIP=00401024 EFL=00000206 CF=0 SF=0 ZF=0 OF=0
Olası Kodlama Standartları
Büyük harf kullanımı Anımsatıcılar ve kayıt adları dahil olmak üzere, ayrılmış sözcükleri büyük harfle yazın
Hiçbir şeyi büyük harfle yazmayın
İlk harfleri büyük yap
Açıklayıcı tanımlayıcı adları kullanın
Girinti ve boşluk
kod ve veri etiketleri - girinti yok
çalıştırılabilir talimatlar - 4-5 boşluk girintisi (1 sekme)
yorumlar: sayfanın sağ tarafı, dikey olarak hizalanmış
Komut ve işlenenleri arasında 1-3 boşluk (1 sekme)
Prosedürler arasında 1-2 boş satır
Örnek: Tamsayı Toplama ve Çıkarma 2 nd versiyonu
TITLE Add and Subtract (AddSub2.asm)
; Bu program 32 bitlik tam sayıları ekler ve çıkarır.
; Dahil olmadan
.386
.model flat, stdcall
.stack 4096
ExitProcessPROTO, dwExitCode:DWORD
DumpRegsPROTO
.code
main PROC
moveax,10000h ; EAX = 10000h
add eax,40000h ; EAX = 50000h
sub eax,20000h ; EAX = 30000h
call DumpRegs ; ekran kayıtları
INVOKE ExitProcess, 0
main ENDP
END main
Anahat
Programları Birleştirme, Bağlama ve Çalıştırma
Assembly Dilinin Temel Öğeleri
Örnek: Tamsayı Toplama ve Çıkarma
Verileri Tanımlama
Sembolik Sabitler
Gerçek Adres Modu Programlama
Temel Veri Türleri
BYTE, SBYTE: 8-bit işaretsiz ve işaretli tamsayılar
KELİME, KILIÇ: 16 bit işaretsiz ve işaretli tamsayılar
DWORD, SDWORD: 32-bit işaretsiz ve imzalı tamsayılar
QWORD: 64 bit tam sayı
Not: İmzalanmamış / imzalanmamış
TBYTE: 80 bit (on bayt) tam sayı
REAL4, REAL8: 4 bayt kısa ve 8 bayt uzun gerçekler
REAL10: 10 baytlık IEEE genişletilmiş gerçek
Eski Veri Direktifleri
Netwide Assembler (NASM) tarafından da desteklenir
ve Turbo Assembler (TASM)
Veri Tanımlama Beyanı
Bir veri tanımlama ifadesi, bir değişken için bellekte depolamayı bir kenara koyar.
İsteğe bağlı olarak verilere bir ad (etiket) atayabilir
Sözdizimi:
kullanın ? Tanımlanmamış değişkenler için sembol
Tüm başlatıcılar bellekte ikili veri haline gelir
00110010b, 32h ve 50d'nin tümü aynı ikili değere sahip olur
BYTE, SBYTE Verilerinin Tanımlanması
Aşağıdakilerin her biri tek bir depolama baytını tanımlar:
value1 BYTE 'A' ; karakter sabiti
value2 BYTE 0 ; en küçük işaretsiz bayt
value3 BYTE 255 ; en büyük işaretsiz bayt
value4 SBYTE -128 ; en küçük işaretli bayt
value5 SBYTE +127 ; en büyük işaretli bayt
value6 BYTE ? ; başlatılmamış bayt
İsteğe bağlı ad, değişkenin başlangıçtan itibaren ofsetini işaretleyen bir etikettironu çevreleyen segmentte.
değer1, veri segmentinde 0000 ofsetinde bulunuyorsa ve 1 baytdepolama, değer2 otomatik olarak 0001 ofsetinde bulunur
MASM, bir BYTE’yi negatif bir değerle (zayıf stil) başlatmanıza izin verir
Bir SBYTE değişkeni bildirirseniz, Microsoft hata ayıklayıcı otomatik olarakdeğerini önde gelen bir işaretle ondalık olarak görüntüler.
Bayt Dizilerini Tanımlama
Birden çok başlatıcı kullanan örnekler:
list1 BYTE 10,20,30,40
list2 BYTE 10,20,30,40
BYTE 50,60,70,80
BYTE 81,82,83,84
list3 BYTE ?, 32,41h, 00100010b
list4 BYTE 0Ah, 20h, 'A', 22h

Bir dizi basitçe bir dizi sıralı bellek konumudur
yönergesi (BYTE) almak için gerekli ofset gösterirsonraki dizi öğesi
Uzunluk yok, sonlandırma bayrağı yok, özel özellik yok
Dizeleri Tanımlama
Bir dizi, bir karakter dizisi olarak uygulanır
Kolaylık sağlamak için, genellikle tırnak işaretleri içine alınır
Genellikle boş sonlandırılır
Karakterler bayttır
0Dh (CR) ve 0Ah (LF) hex karakterleri kullanışlıdır
Örnekler:
str1 BYTE "Adınızı girin:", 0
str2 BYTE 'HATASI!', 0Dh, 0Ah, 'Durma programı', 0Dh, 0Ah, 0
str3 BYTE 'A', 'E', 'I', 'O', 'U'
newLine BYTE 0Dh, 0Ah, 0
greet BYTE "Bir dize"
BYTE "iki bölüm.", 0
menu BYTE "1. Yeni bir hesap oluştur", 0dh, 0ah,
"2. Mevcut bir hesabı açın", 0dh, 0ah,
"3. Çıkış", 0ah, 0ah,
"Seçim>", 0
DUP Operatörü
Veriler için alan ayırmak için DUP’ı kullanın
Sözdizimi: DUP’yi tekrarlar (bağımsız değişken)
Tekrarlar ve argüman sabitler veya sabit ifadeler olmalıdır
var1 BYTE 20 DUP(0) ; 20 bayt, hepsi sıfıra eşit
var2 BYTE 20 DUP(?) ; 20 bayt, başlatılmamış
var3 BYTE 4 DUP("STACK") ; 20 bayt: "STACKSTACKSTACKSTACK"
var4 BYTE 10,3 DUP(0),20 ; 5 bayt
Diğer Türleri Tanımlama
val1 WORD 65535 ; en büyük işaretsiz değer
val2 SWORD –32768 ; en küçük işaretli değer
word3 WORD ? ; başlatılmamış, imzalanmamış
word4 DWORD "ABCD" ; dört karakter
myListWORD 1,2,3,4,5 ; kelime dizisi
array WORD 5 DUP(?) ; başlatılmamış dizi
val5 DWORD 0FFFF0000h ; imzasız
val6 SDWORD –2147483648 ; imzalı
dwd7 SDWORD –2,–1,0,1,2 ; işaretli dizi
qwd8 QWORD 1234567812345678h
rVal1 REAL4 -2.1
rVal2 REAL8 3.2E-260
Küçük Endian Düzeni
Bir bayttan daha büyük tüm veri türleri, kendi baytlarınıTers sipariş. En az önemli bayt ilk anda gerçekleşir(en düşük) hafıza adresi.
Örnek:
val1DWORD 12345678h
Örnek: Değişkenleri Kullanma
TITLE Add and Subtract, Version 3 (AddSub3.asm)
; Bu program 32 bit işaretsiz ekler ve çıkarır
; tamsayılar ve toplamı bir değişkende depolar.
INCLUDE Irvine32.inc
.data
val1 DWORD 10000h
val2 DWORD 40000h
val3 DWORD 20000h
finalValDWORD ?
.code
main PROC
mov eax,val1 ; 10000 saat ile başla
add eax,val2 ; 40000h ekle
sub eax,val3 ; 20000h çıkar
movfinalVal,eax ; sonucu sakla (30000h)
call DumpRegs ; kayıtları göster
exit
ana ENDP
END ana
Segment Kontrolü
.code
Aşağıdakilerin tümü kod segmentine gider
.data
Aşağıdakilerin tümü veri segmentine gider
.data?
başlatılmamış veri segmenti
verileri depolamak için çalışma zamanında ayrılır
depolanan .exe'de yer gerekmez (saklanacak değer olmadığı için)
Eğer birbirine karıştırılırsa, montajcı tarafından ayrılırlar
Başlatılmamış Verileri Bildirme
.data kullanılsın mı? başlatılmamış bir veri kesimi bildirme yönergesi
.DATA? yönerge, derlenmiş bir programın boyutunu azaltır.
.data?
array1 DWORD 5000 DUP (?)
Program için yüklenene kadar dizi1’e yer ayrılmamıştır.yürütme (.exe 20KB daha küçüktür)
.data
array2 DWORD5000 DUP (?)
dizi2, boş olmasına rağmen, dizini depolamak için .exe’de 20KB’ye sahiptir.var olmayan değerler
Anahat
Programları Birleştirme, Bağlama ve Çalıştırma
Assembly Dilinin Temel Öğeleri
Örnek: Tamsayı Toplama ve Çıkarma
Verileri Tanımlama
Sembolik Sabitler
Gerçek Adres Modu Programlama
Tamsayı Sembolik Sabitler
isim = ifade
ifade 32 bitlik bir tam sayıdır (ifade veya sabit)
yeniden tanımlanabilir (ancak bunu yapmak için iyi bir biçim değil!)
isim sembolik sabit olarak adlandırılır
Direktifler: Çalışma zamanı etkisi yoktur, .exe'nin parçası değildir
sembolleri kullanmak için iyi programlama stili
COUNT = 500
…
mov balta, COUNT
EQU Direktifi
Bir tamsayı veya metin ifadesi olarak bir sembol tanımlayın
= yönerge sadece izin verilen tam sayılar
Yeniden tanımlanamaz
Örnek:
PI EQU<3.1416>
pressKeyEQU<"Press any key to continue...",0>
.data
prompt BYTE pressKey
TEXTEQU Direktifi
Bir metin sembolünü tam sayı veya metin ifadesi olarak tanımlayın
Bir metin makrosu çağırdı
Yeniden tanımlanabilir
% bir tamsayıyı metne dönüştürür
;macros
msgTEXTEQU <"Do you wish to continue (Y/N)?">
rowSize= 5
count TEXTEQU %(rowSize* 2) ; değerlendir ve metin olarak sakla
setupALTEXTEQU <moval,count> ; mov için makro
.data
prompt1 BYTE msg
.code
setupAL ; "mov al, 10" u oluşturur
Dizi Boyutu
Mevcut konum sayacı: $
listenin adresini çıkar
fark bayt sayısıdır
Örnek:
liste BYTE 10,20,30,40
listSize = ($ - liste)
Bayttan büyükse öğe boyutuna bölün (ör.WORD, DWORD için 4, QWORD için 8)
Örnek:
DWORD 1,2,3,4 listesi
listSize = ($ - liste) / 4
Gerçek Adres Programlama
Bilgisayarınızın 80’lerde yapılmış gibi görünmesini, hareket etmesini ve hissetmesini sağlayın
16 bit MS-DOS Programları Oluşturun (Neden?)
“Avantajlar”
MS-DOS ve BIOS işlevlerinin çağrılmasını sağlar
hafıza erişim kısıtlaması yok
Dezavantajlar
hem segmentlerin hem de ofsetlerin farkında olmalıdır
Win32 işlevleri çağıramaz
Gereksinimler
Irvine16.inc DAHİL
DS'yi veri segmentine başlatın:
movax,@data
movds,ax
Anahat
Programları Birleştirme, Bağlama ve Çalıştırma
Assembly Dilinin Temel Öğeleri
Örnek: Tamsayı Toplama ve Çıkarma
Verileri Tanımlama
Sembolik Sabitler
Gerçek Adres Modu Programlama
Özet
Tamsayı ifadesi, karakter sabiti
yönerge - montajcı tarafından yorumlanır
talimat - çalışma zamanında yürütülür
kod, veri ve yığın segmentleri
kaynak, liste, nesne, harita, çalıştırılabilir dosyalar
Veri tanımlama direktifleri:
BYTE, SBYTE, WORD, SWORD, DWORD, SDWORD, QWORD, REAL4, REAL8
TBYTE, REAL10 - Belirsiz ve nadiren kullanılan talimatlar (eski)
DUP operatörü, konum sayacı ($)
Sembolik sabitler
=, EQU ve TEXTEQU