ÖNEMLİ AÇIKLAMA: Bu derslerdeki sunumların kısa bir özetini

Transkript

ÖNEMLİ AÇIKLAMA: Bu derslerdeki sunumların kısa bir özetini
ÖNEMLİ AÇIKLAMA: Bu derslerdeki sunumların kısa bir özetini göstermek için
hazırlanmıştır. Burada türkçeleştirilmemiş olan kısımlar sorulmayacak manası asla
taşınmamalıdır. 1 nolu ders notu da dahil olmak üzere bazı bilgiler sorulabilir.
Buradaki amaç, öğrenciye az bir katkı sağlamaktır. Bu nedenle notların hem
ingilizcesine, hemde türkçesine birlikte bakılmalı, öyle çalışılmalıdır. Her ders notunun
türkçeleştirilen kısmı hangi ders notuna aitse o başlığı taşıyacaktır.
LECTURE 2
8086 Mikroişlemcisinin registerları
CPU‟da registerlar bilgiyi geçici saklamak amaçlı kullanılır. Bu bilgi 1 veya 2 bytelik veri
veya verinin adresi olabilir. 8088/8086‟da genel amaçlı registerlar 16 bitlik yada 8 bitlik
olarak kullanılabilirler. Diğer bütün registerlar 16 bit olarak kullanılır.
8-bitlik registerın diziliş sırası:
D7 D6 D5 D4 D3 D2 D1 D0
16-bitlik registerın diziliş sırası:
D15 D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
Genel amaçlı registerlar16 bit olarak AX, BX, CX, DX şeklinde, 8 bitlik gösterimde ise AH,
AL, BH, BL, CH, CL, DH, DL şeklinde ifade edilebilirler.
Pointerlar 16 SP (stack pointer), BP(base pointer)
Indexler 16 SI (source index), DI(destination index)
Segmentler 16 CS (code segment), DS(data segment) SS (stack segment), ES(extra segment)
Instruction 16 IP (instruction pointer)
Flag 16 FR (flag register)
Daha öncede belirttiğimiz gibi genel amaçlı registerlar ya yüksek değerlikli byte AH, yada
düşük değerlikli byte AL şeklinde 8 bitlik durumlara ayrılabilir ama diğerleri 16 bitle
gösterilmek zorundadır.
ASSEMBLY PROGRAMLAMAYA GİRİŞ
MAKİNE DİLİ:
�0 ve 1leri içeren programa makine dili denir.
�Assembly Dilleri, makine kodu komutları için (mnemonics)hatırlatıcı kodlar sağlar.
�Mnemonics: Kodların yerini tutan kullanıcının kolay hatırlamasını sağlayan kısaltmalardır.
Assembly Dili Programlama:
�Assembly Dili program, assebly diliyle yazılmış komutların bulunduğu satırlardan oluşur.
�Komut hatırlatıcı kod ve 2 adet işlemciden (üzerinde işlem yapılan değerler) oluşur
MOV komutu
MOV hedef, kaynak; kaynaktaki işlenen değeri hedefe kopyala.
Example: (8-bit )
MOV CL,55H ;55H‟ı CL registerına kopyala/taşı.
MOV DL,CL ;CL registerının içeriğini DL‟ye taşı (şimdi DL=CL=55H)
Veri flag registerları hariç bütün registerlar arasında taşınabilir.
�Kaynak ve hedef registerlarının boyutları uyumlu olmalıdır.
�Veri sadece segment olmayan registerlar arasında direk taşınabilir. Veriyi segment
registerlarına direk taşıyamayız.
Örnekler:
MOV BX,14AFH ; move 14AFH into BX (legal)
MOV SI,2345H ; move 2345H into SI (legal)
MOV DI,2233H ; move 2233H into DI (legal)
MOV CS,2A3FH ; move 2A3FH into CS (illegal) (Kod segmente direk 2A3FH bilgisini
yazmaya kalkmış, bunu önce normal bir registera yazmalı, oradan segment registerına
aktarmalıydı)
MOV DS,CS ;move the content of CS into DS (legal)
1
MOV FR,BX ;move the content of BX into FR (illegal) (Flag registerlarına asla veri
taşınamaz)
MOV DS,14AFH ;move 14AFH into DS (illegal)
LECTURE 3
ADD Komutu
ADD hedef, kaynak ; Kaynaktaki veriyle hedefteki veriy topla.
Örnek:
MOV AL,24H ; 24H‟ı AL registerına taşı
MOV DL,11H ; 11H‟ı DL registerına taşı
ADD AL,DL ;AL=AL+DL (AL=35H) (DL =11H) toplama işlemi sonucunda hedefteki değer
değişirken, kaynak hala aynı değeri muhafaza etmektedir.
Toplama işlemi direk bir registerdaki veriyle direk anlık veri arasında da yapılabilir.
MOV CH,24H
ADD CH,11H
Program segmentleri
Segment:
�Segment 64Kbyte kadar hafıza alanına sahip 16 ile bölünebilen adreslere sahip kısımlardır
(16ya bölünebilmesi demek son bitin 0H olması demektir)
�Assembly Dili Programı 3 segment içerir:
• code segment : Program kodlarını (komutlarını) içeren kod segment
• data segment : program tarafından kullanılan veriyi saklamada kullanılan veri segmenti
• stack segment: Bilgiyi geçici olarak saklamakta kullanılan yığın segmenti.
Lojiksel ve Fiziksel Adres:
�Fiziksel Adres 20 bitlik adrestir ve adres busla taşınır. 8086 için 00000H – FFFFFH
aralığına sahiptir.
�Offset Address ofset adresi 64 Kbytelik segment içindeki yeri gösterir. Sahip olduğu aralık
0000H – FFFFH‟tır.
�Logical Address, Lojik Adresi, Segment adresi ve ofset adresini içerir.
Kod segmentteki Adresleme
� Komutun lojik adresi CS (Code Segment) ve IP(instruction pointer) içerir
CS IP (2500:95F3)
Logical Address: Lojik Adresi: CS:IP (Burada IP ofset adresidir)
• Fiziksel adres CS‟in 1 hexadecimal basamak sola kaydırılması ve bunun IP ile
toplanmasıyla bulunur.
Örnek: CS:IP => 2500:95F3H
1. CS ile başla
2500
2. CS’i sola kaydır 25000 (Sola kaydırmak demek sonuna bir sıfır eklemek demektir)
3. IP ile topla
2E5F3 (25000+95F3)
Data segment Veri Segmenti
Veri segmenti DS ve ofset değer kullanır. 8086‟da BX, SI ve DI ofset adresini tutmada
kullanılırlar.
Little endian convention
2 bytelik veri taşınırken düşük değerlikli byte, düşük adres gözüne, yüksek değerlikli byte
yüksek adres gözüne yazılır. Aşağıdaki örnekte 35FH verisi AX registerina taşınıyor. AX
registerı ise veri segmentin 1500 nolu ofset adresine taşınacak, AX 2 byte olduğu için 1500
ve 1501 nolu adres gözlerini kullanır. 35F3H verisinin düşük değerlikli byteı F3‟tür ve 1500
nolu yere bu değer, yüksek değerlikli byte olan 35 ise 1501 nolu veri segmentindeki hafıza
gözüne kopyalanır.
Ex: MOV AX,35F3H :load 35F3H into AX
MOV [1500],AX : copy contents of AX to offset 1500H
2
DS:1500 = F3 DS:1501 = 35
Intel bu yapıyı kullanırken motorola bunun tersini kullanır ve adına Big endian convention
denmektedir.
LECTURE 4
IBM PC’LERİN HAFIZA HARİTASI
PC‟de bir programın yürütülebilmesi için, ilk olarak DOS bunu RAM‟e yazmalıdır.
8086/8088‟de 20 bitlik adres var bu da toplamda 1 megabyte hafıza yapıyor.
RAM: DOS işletim sistemi, Pcdeki RAMi öncelikle kendine tahsis eder, kalan başka
uygulamalar için kullanılır. DOS‟un versiyonlarına göre farklı miktarda RAM hafızasına
ihtiyaç duyulur. Bu nedenle CS, DS ve SS registerlarına herhangi bir değer atayamayız.
Böylece bunların sabit bir fiziksel adresi olmaz. Diğer bir neden ise fiziksel adres atama
verilen Pcde çalışırken başka bir DOS versiyonu ve RAM boyutu olan Pcde çalışmayabilir.
Bu nedenle hafıza yönetimi, DOS işletim sisteminin en önemli fonksiyonlarından birisidir.
Video RAM: A0000H‟dan BFFFFH (128 K)‟a kadar olan hafıza yerleşimi video için tahsis
edilmiştir. Pcde yüklü olan ekran kartına bağlı olarak değişebilir.
ROM: C0000H‟dan FFFFFH(256 K) adresine kadar olan kısım ROM için tahsis edilmiştir.
Bunun 64 K‟lık (F0000H-FFFFFH arası) kısmı BIOS ROM içindir. Diğer kalan kısım,
değişik adaptör kartları için kullanılır (harddisk gibi) Geri kalanı boştur. DOS‟ta 640 Kbytelik
hafıza yeri 00000Hdan 9FFFFH‟a kadar geleneksel hafıza diğer 384 Kblık kısım ise yüksek
hafıza bloğu diye adlandırılır.
BIOS ROM’un fonksiyonları:
CPU hafızadaki programları yürütür, güç verildiği zaman CPUya ne yapması gerektiğini
söyleyen programların tutulduğu kalıcı bir hafıza vardır. Bu programların tutulduğu ROMdaki
yer BIOS olarak adlandırılır. BIOS, RAMi ve CPUya bağlı diğer elemanları test eden
programları içerir. Ayrıca DOS ile çevresel cihazların (keyboard, monitor, printer vs)
haberleşmesini sağlayan programlarda BIOStadır. Test yaptıktan ve çevresel ürünlerle
bağlantı kurulduktan sonra BIOS DOS‟u diskten RAMe yükler ve PC‟nin kontrolünü DOS‟a
devreder.
STACK: PUSHING AND POPPING OPERATIONS
Stack (Yığın)
Stack, CPU‟nun bilgileri geçici sakladığı okunur/yazılır (RAM) hafızanın bir kısmıdır. CPU,
sınırlı sayıda register olduğu için bu alana ihtiyaç duyar. Stackin dezavantajı, erişim
zamanıdır. Stack RAMin içindedir ve buraya erişmek registerlarla karşılaştırıldığında çok
zaman alır. Register CPUnun içinde iken RAMler dışındadır
Stacklere nasıl erişilir?
�SS (stack segment) ve SP (stack pointer) registerları stacke erişmek için kullanılır. Bu
registerlar stacke ulaşmak için herhangi bir komut uygulanmadan önce stacke yüklenmiş
olmalıdır. 80x86daki her register (segment registerları ve SP hariç) stackte saklanabilir ve
stackten CPUya geri getirilebilir. CPU registerini stackte saklamaya PUSH, stackteki içeriği
CPU registerına yüklemeye POP denir.
SP‟nin işi push ve pop işlemi yerine getirilirken çok önemlidir. 80x86da SP, o anki hafıza
yerleşiminde stackin tepesinden itibareb veri sakladıkça azaltma yapar. Veri CPUya geri
yüklenince de artırır. Stack LIFO (Last in First out, Son giren ilk çıkar) prensibiyle çalışır.
Genel amaçlı bir register saklanırken veya geri yüklenirken tüm 16 bitlik register olmalıdır
“PUSH AX” şeklinde olmalıdır, PUSH AL veya PUSH AH şeklinde asla yazılamaz.
Programın kod kısmının ve stack kısmının birbirinin üzerine yazmamasını sağlamak için,
RAM hafızasında farklı uçlarda bulunurlar. Birbirine doğru artar ama asla kesişmemelir aksi
takdirde program göçer.
3
Tek bir fiziklsel adres birçok farklı lojik adresine ait olabilir.
ÖNEMLİİİ: Eğer kaydırılmıl segment registerina eklenen offset adresi FFFFFH‟ın dışına
çıkıyorsa, etrafını dolanır (overlapping) yani çıkan kısım 00000Hdan devam ediyor gibi olur.
THE FLAG REGISTER (FR) AND BIT FIELDS
16 bitlik registerdır, bazı bitleri kullanılmaz. 6 bayrak durum bayrağıdır, herhangi bir komut
uygulandıktan sonra durumu değişebilir. Bunlar: CF, PF, AF, ZF, OF ve SF‟tir. Diğer 3
bayrak ise kontrol bayraklardır.
CF: Bir aritmetik işlemde, toplamadan sonraki eldeyi veya çıkarmadan sonraki ödüncü
belirtir.
PF: Bazı işlemlerden sonra düşük değerlikli bytetaki parity kontrolü yapılır. Çift sayıda 1 var
ise PF 1 diğer durumlarda 0‟dır. Hiç 1 bulunmaması da çift sayıda 1 bulunması demektir.
AF: Yapılan bir işlem sonucunda bit pozisyonları 3 ve 4 arasında olan (en sağdaki bitin
pozisyonu 0‟dır. Yani ...D4 D3D2D1D0 gibi düşüneceğiz.) toplamadan sonraki eldeyi veya
çıkarmadan sonraki ödüncü belirtir.
ZF:B ir aritmetik veya lojik işlem sonucunun sıfır olduğunu belirtir. Eğer ZF 1 ise sonuç
sıfırdır.
SF: ir toplama veya çıkarma işleminden sonra, sonucun aritmetik işaretini belirtir. Eğer SF 1
ise negatif 0 ise pozitiftir. Bayrakları etkileyen bir komuttan sonra en değerli bit pozisyonu SF
bitine yerleştirilir.
OF: Taşma, işaretli sayıların toplandığında veya çıkartıldığında oluşan bir durumdur. Taşma
işlem sonucunun hedef saklayıcıya sığmadığını gösterir.
TF: Eğer trap bayrağı 1 ise tüm devre hata takip işlemi devreye girer, bu zmaan içinde sadece
bir komut yerine getirilir.
IF: 1 olduğu durumda mikroişlemci dışarıdan gelen kesme isteğine cevap verir.
DF: String komutları yürütülürken DI ve/veya SI saklayıcılarının artırılması veya azaltılması
işlemlerinin seçimini kontrol eder. Eğer D 1 ise saklayıcılar otomatik olarak azaltılır ve eğer
D 0 ise saklayıcılar otomatik olarak artırılır.
LECTURE 5
Zero Flagin Döngüler için Kullanılması
ZF döngülerde kullanılmaktadır. Döngü sayısı registera girerek her bir döngüde azaltma
yapılır ve ZF 0 olduğu zaman döngü biter aşağıdaki örnekte görülebilir:
Ex: MOV CX,05 ; CX holds the loop count
MOV BX,0200H ; BX holds the offset data address
MOV AL,00 ; initialize AL
ADD_LP: ADD AL,[BX] ; add the next byte to AL
INC BX ; increment the data pointer
DEC CX ; decrement the loop counter
JNZ ADD_LP ; jump to the next iteration if the counter not
zero
80X86 ADRESLEME MODLARI
CPU verilere değişik yollardan ulaşabilir bu adresleme modu diye adlandırılır. 80x86da 7 tane
adresleme modu vardır
1. register
2. immediate
3. direct
4. register indirect
5. based relative
6. indexed relative
7. based indexed relative
1. Register adresleme modu:
4
Registerlar arası veri aktarılır. Registerların boyutları eşit olmalıdır.
2. Immediate addressing mode:
Kaynak verisi sabittir. Segment registerları ve flag registerları hariç hepsine direk veri
yazılabilir.
3. Direct addressing mode:
4. Register indirect addressing mode:
Verinin hafızadaki adresi register tarafından tutulmaktadır. SI, DI ve BX registerları ofset
adreslerini tutan pointerlar olarak kullanılır. DS ile birleştirilerek 20 bitlik fiziksel adresler
elde edilir.
5. Based relative addressing mode:
�BX ved BP base registerları olarak kullanılır. Bu modda yerdeğiştirme yapıldıktan sonra
efektif adres bulunur.
Fiziksel adresi hesaplamak için DS‟te BX, SS‟te BP kullanılır.
6. Indexed relative addressing mode:
Indeksli relative adresleme modu da based relative adresleme gibi çalışır, sadece burada ofset
adreslerini tutan registerlar SI ve DI‟dir.
7. Based Indexed addressing mode:
5 ve 6 nolu adresleme modlarının birleşimidir, bir base register ve bir index register birlikte
kullanılır.
LECTURE 6
DIRECTIVES AND SAMPLE PROGRAMS
Direktifler assemblera, assembly dilindeki komutları makine diline nasıl çevireceği hususunda
yön gösterir. Assembly dili komutları 4 alan içerir
[label:](etiket) mnemonic (hatırlayıcı kod) [operands] (işlem yapılanlar) [;comments]
(açıklamalar)
Direktifleri kullanan bir programda öncelikle segmentler tanımlanır ve yazılan program
parçası hangi segmenti ilgilendiriyorsa onun altında yazılır, verileri tanımlarken data segmenti
içinde programla ilgili kodlar var ise kod segment altında bunlar yazılır. Sizden direk bir
şekilde direktifli program yazmanız sınavda istenmeyecektir. Belki direktifli bir programın
analizini yapmanız istenebilir.
DB 64 DUP (?) diye segmentin altında tanımlanan bu direktif stack‟e, 64 bytelik hafıza tahsis
eder.
�Data segment definition
Burada üç veri tanımlanmıştır. DATA1, DATA2 ve SUM. Her biri byte boyutunda
tanımlanmıştı (DB byte tanımla demektir). DW: word uzunluğunda tanımlar. DATA1 ve
DATA2 ilk değerlerine sahipten SUM için sadece yer tahsisi yapılmıştır.
�Code segment definition
Kod segmentte Segment direktifinden sonra hemen PROC direktifi gelir. Prosedürün
kısaltmasıdır. PROC ve ENDP direktifleri ay nı etikete sahip olmalıdır.
DOS CS ve SS registerlarına otomatik karar verir ama veri registerları elle tanımlanmalıdır.
LECTURE 7
FAR and NEAR : (given CS:IP)
NEAR‟da kontrol, o anki kod segment içindedir, sadece IP değişir.değişir.
Conditional Jumps
Şartlı atlamada, gerekli iart yerine getirilince kontrol yeni yere taşınır. JC (jump if carry- eğer
CF 1 ise atla) [CF kontrol edilir], JNZ (jump if not zero- Eğer ZF 0 değil ise atla) [ZF kontrol
edilir]. Tablodan genel jumplara göz atmakta fayda var!!!
NOT: above- yukarısında ve below-aşağısında 2 işaretsiz sayı arasındaki ilişkiyi gösterirken,
greater-büyüktür ve less-küçüktür ise iki işaretli sayı arasındaki ilişkiyi gösterirken kullanılır
ve bunlar atlama komutlarında ortaya çıkar.
5
Kısa Atlamalar
Bütün şartlı atlamalar kısa atlamadır, atlanacak hedef adres o anki hafızanın -128 ile +127
bytelik sınırları arasında olmalıdır.
Şartsız Atlamalar
“JMP label” şartsız atlamanın komutudur, verilen etiketteki hedefe direl geçer, burada da
şartlı atlamadaki gibi kısa atlama olursa -128 ile +127 byte arasında biryere, NEAR JUMP
olursa aynı kod segment içinde herhangi bir yere, FAR JUMP olur ise bulunduğu kod
segment dışındaki bir adrese atlar.
CALL STATEMENTS
Başka bir kontrol transfer komutu da CALL‟dır. Bir procedure çağırmak için kullanılır. Yine
aynı şekilde aynı segment içinde veya dışından çağırmasına göre NEAR veya FAR ile
gösterirlir.
Çağrılan altprogram yerine getirildikten sonra mikroişlemci nereey geri döneceğini bilir,
çünkü sıradaki adresi mikroişlemci otomatik olarak stacke kaydeder. Çağrılan alt programın
son komutu RET olmalıdır ki CPU direk buradan stackteki adresi alıp oraya geçiş yapabilsin.
DATA TYPES AND DATA DEFINITION
�Assembler Data Directives
• ORG (Origin) : ORG ofset adresinin başlangıcı göstermek için kullanılır. ORGtan sonra
hexadecimal yada onluk formda sayı yazılabilir, daha çok veri segmentinde kullanılır.
• DB (define byte) : DB, hafıza byte uzunluğunda yerleri onluk, ikilik, ASCII, Hexadecimal
sayılar için tahsis eder.Eğer aşağıdaki örnekteki gibi sayının sonuna hiçbirşey yazılmamışsa
bu direk onluk olur, sayının sonuna onluk olduğunu göstermek için D yazma zorunluluğu
yoktur. Diğerlerini belirtmek zorundasınız!!!
• DUP (duplicate) : DUP verilen sayıda karakteri çoğaltmaya yarar, mesela 4 tane OFFH
tanımlayana kadar bunu aşağıdaki örnekte görüldüğü üzere DUP ile kolayca yapabiliriz
Örnek: DATA1 DB 0FFH,0FFH,0FFH,0FFH ;FILL 4 BYTES WITH FF
DATA2 DB 4 DUP(0FFH) ;FILL 4 BYTES WITH FF
Ex: DATA3 DB 32 DUP (?) ;32 bytelik alan tahsis ediyor
DATA4 DB 5 DUP (2 DUP (99)) ;10 byte‟ı 99 sayısıyla doldur.
• DW(define word) : DW 2 byte (1 word uzunluğu) uzunluğundaki verileri tanımlamada
kullanılır, DUP burada da aynı şekilde kullanılabilir.
• EQU(equate) : EQU hafızada herhangi bir yeri işgal etmeden sabit bir sayı tanımalamayı
sağlar. Burada daha sonra sayıda değişiklik yapılmak istenirse sadece EQUdan sonraki
değişince otomatik olarak bütün COUNT değerlerimiz yeni sayımız olacaktır. Program içinde
tek tek gerekli yeri bulup sayıyı değiştirmeye gerek kalmamış olacaktır.
Örnek: COUNT EQU 25
MOV CX,COUNT
• DD(define doubleword) : Buda ikili word uzunluğunda yani 4 bytelik alan tahsisi yapar.
Diğer tanımlamalara da bakılabilir.
LECTURE 8
İŞARETSİZ TOPLAMA
� İşaretsiz sayılarda bütün bitler veriyi tanımlamada kullanılır, pozitiflik negatifliği gösteren
bir işaret biti bulunmaz.
8 bit için 00H‟dan FFHa kadar yani 0-255 arası onluk sayılr şeklinde gösterilebilir.
16 bit için ise 0000Hdan FFFFHa kadar hexadecimal sayılar gösterilebilir.
�ADD: İşaretsiz sayıların toplanması
Format: ADD hedef,kaynak ; hedef yeri = hedefteki sayı + kaynaktaki sayı.
Toplama işlemi ardında flaglerin bazılarında değişim olur. Aşağıdaki örnekte bu açıkça
görülebilir:
6
Örnek:
MOV AL,0F5H
ADD AL,0BH
Solution: F5 1111 0101
+ 0B + 0000 1011
100H 0000 0000
After the addition AL will contain 00 and the flags are as follows.
CF = 1 since there is a carry out from d7
SF = 0 the status of d7 of the result
PF = 1
AF = 1
ZF = 1
�ADC: Add with carry- Elde ile Topla
Format: ADC hedef,kaynak ; hedef yeri = hedefteki sayı + kaynaktaki sayı + CF
Kaynak hedefi 1 ile toplar, 0 ise 0 ekler. Çoklu byte ve çoklu word toplamalarında kullanılır.
LECTURE 9
İŞARETSİZ SAYILARDA ÇIKARMA
Format: SUB hedef,kaynak ; hedef yeri = hedefteki sayı - kaynaktaki sayı
Çıkarma işleminde 2ye tümleyen yöntemi kullanılır.
SUB komutunun yerine getirilmesi süreci:
1. Çıkan sayının 2ye tümleyenini al (çıkan sayı kaynaktaki sayı oluyor)
2.Bunu çıkartılan sayı ile topla (hedefteki sayı)
3. Eldeyi ters çevir, yani 0 ise 1, 1 ise 0 yap.
Ex: MOV AL,3FH ; load AL=3FH
MOV BH,23H ; load BH=23H
SUB AL,BH ; subtract BH from AL. Place result in AL
Execution steps:
AL
3F 0011 1111
0011 1111
BH
– 23 – 0010 0011
+ 1100 0001 (2‟ye tümleyen)
1C
0001 1100 1 0001 1100 (CF=0) Step 3
CF=0, ZF=0, PF=0, SF=0.
• Eğer CF=0 ise sonuç pozitiftir ve hedefteki sayı sonuçtur.
• Eğer CF=1 ise sonuç negatiftir ve hedefteki sayının 2ye tümleyeni sonuçtur. NOT ve INC
komutları bunu değiştirmede (tümleyen almada) kullanılabilir. Burada NOT komutu 0ları 1,
1leri 0 yapmaktadır, buda 1e göre tümleyendir bu sonucu 1 artırmak için INC kullanılır bu
durumda ikiye göre tümleyen alınmış olur. Bununla ilgili örneğe notlardan bakılabilir.
• SBB (subtract with borrow)- Ödünç ile Çıkarma
SBB hedef,kaynak ; hedef yeri = hedefteki sayı - kaynaktaki sayı – CF
Çoklu byte veya çoklu word sayılarında kullanılır.
�Eğer CF=0 ise SBB aynı SUB gibi çalışır
�Eğer CF=1 ise, SBB sonuçtan 1 çıkartır.
İŞARETSİZ SAYILARIN ÇARPIMI VE BÖLMESİ
�işaretsiz sayılarda çarpma
�byte x byte :
• Burada çarpım yapılan terimlerden birisi AL (AL registerı) olmak zorundadır.Diğer çarpılan
register yada hafızadaki bir değer olabilir.
• Çarpım sonucu AX registerina yazılır. Unutulmamalıdır kı bytexbyte boyutundaki çarpımın
sonucu word uzunluğunda çıkabilir.
�word x word :
7
• Çarpılan sayılardan biri AX registerında bulunmak zorundadır. Diğer çarpılan sayı
registerda veya hafıza gözünde bulunabilir.
• Çarpım sonucunun düşük wordü AX registerına yüksek değerlikli wordü ise DX registerına
kaydedilir.
�word x byte :
• word ile byte çarpımı word word çarpımına benzerdir, sadece AL registeri byte olan terim
olur ve AH registeri 0 olmalıdır. Diğer sayı yukarıdaki gibi olur. Sonuçlarda aynı şekilde
kaydedilir.
işaretsiz sayıların Bölmesi
1. Byte / byte
• Pay AL registerında bulunmalı ve AH registerı 0 olmalıdır.
• Payda asla direk sayı olamaz, hafıza gözündeki veya bir registerdaki bir değer olabilir.
• Bölme işleminden sonra bölüm AL registerına yazılır, AH registerina ise kalan yazılır.
Bölme işleminde DIV BL yazdığımızda direk AX’teki sayıyı Bldeki sayıya böler, komut
otomatikten Axteki sayıya bölmektedir.
2. word / word
• Pay AX registerında bulunmalı ve DX registerı 0 olmalıdır
•Payda, hafıza gözündeki veya bir registerdaki bir değer olabilir.
• Bölme işleminden sonra bölüm AX registerına yazılır, DX registerina ise kalan yazılır.
3. word / byte
• Pay AX registerında bulunmalı
• Payda hafıza gözondeki yada registerdaki bir sayı olabilir.
• Bölme işleminden sonra bölüm AL registerına yazılır, AH registerina ise kalan yazılır.
4. doubleword / word
• Pay AX ve DX registerı olmalı, düşük değerlikli word AX, yüksek değerlikli word ise DX‟e
yazılır.
• Payda hafıza gözündeki yada registerdaki bir sayı olabilir
• Bölme işleminden sonra bölüm AX registerına yazılır, DX registerina ise kalan yazılır.
5. “Divide Error”: Eğer payda 0 sayısına bölünmeye kalkarsa bu hatayı verir, aynı şekilde
bölüm tahsis edilen registera sığmazsa da bu hata mesajı çıkar.
LOGIC INSTRUCTIONSLOJIK KOMUTLARI
AND
AND hedef,kaynak ; hedef = hedef & kaynak,
Hedef ile kaynaktaki sayılar AND işlemine tabi tutulur ve sonuç hedefe yazılır.
Aşağıdaki örnekte AND işlemi sonucu sonuç sıfır olunca başka bir etikete atlamasını sağlıyor
Ex: AND DH,DH
JZ NEXT
….
NEXT: ….
This operation will AND DH with itself and if the result is zero set ZF=1
jumping to NEXT.
OR
OR hedef,kaynak ; hedef = hedef & kaynak,
LECTURE 10
ARITHMETIC AND LOGIC INSTRUCTIONS AND PROGRAMS
XOR
XOR hedef,kaynak ; hedef = hedef & kaynak,
�XOR komutu registerların içeriğini kendisiyle XORlayarak temizlemede kullanılabilir.
XOR ile iki registerin aynı değerde olup olmadığını da anlayabiliriz.
8
�XOR işlemi yapıldığında terimlerden birisini 0‟lardan oluşan bitlerden seçerek diğer
terimde hangi bitin değerinin tersinin olmasını istiyorsak orayı 1 yaparak değişiklik
yapabiliriz. The XOR instruction can be used to toggle bits of an operand.
Ex:
XOR BL,04H ; XOR BL with 000 0100
Çözüm: Burada sadece 1 bitinin olduğu D2 biti BL‟de değişir, diğer değerleri aynı kalır.
• SHIFT
SHR hedef,kaynak ;sağa kaydır
Bu lojiksel olarak sağa kaydırır. Terim sağa doğru her işlemde bir bit kayar, her kayma
sonrasında en düşük değerlikli bitin değeri CF‟e yazılır ve en yüksek değerlikli bite 0 yazılır.
Örnek: MOV AL,9AH
MOV CL,3 ;set number of times to shift
SHR AL,CL
Solution: 9AH 10011010
01001101 CF=0 (shifted once)
00100110 CF=1 (shifted twice)
00010011 CF=0 (shifted three times)
3 defa kaydırıldıktan sonra, AL=13H and CF=0
�kaydırma yapılacak hedef terimi register yada hafıza gözündeki bir değer olmalıdır. Direk
sayı kaydırılamaz.
�Eğer sadece 1 defa kaydırılacaksa direk SHR AL,1 yazabiliriz ama 1den fazla
kaydırılacaksa bu kaydırma sayısının CL registerına yazılması gerekir ve işlemi SHR AL, CL
şeklinde yapmalıyız.
SHL hedef,kaynak ;sola kaydır
Bu lojiksel olarak sola kaydırır. Terim sola doğru her işlemde bir bit kayar, her kayma
sonrasında en düşük değerlikli bitin değerine 0 yazılır ve en yüksek değerlikli bitte bulunan
değer CF‟e aktarılır.
Örnek: MOV DH,6
MOV CL,4 ;kaydırma sayısı belirleniyor
SHL DH,CL
Solution: 00000110
CF=0 00001100 (shifted left once)
CF=0 00011000
CF=0 00110000
CF=0 01100000 (shifted left 4 times)
After the 4 shifts DH=60H and CF=0.
kaydırma yapılacak hedef terimi register yada hafıza gözündeki bir değer olmalıdır. Direk
sayı kaydırılamaz.
�Eğer sadece 1 defa kaydırılacaksa direk SHL AL,1 yazabiliriz ama 1den fazla
kaydırılacaksa bu kaydırma sayısının CL registerına yazılması gerekir ve işlemi SHL AL, CL
şeklinde yapmalıyız.
İŞARETSİZ SAYILARIN KARŞILAŞTIRILMASI
CMP hedef, kaynak ;kaynak ile hedefi karşılaştır.
�Terimler değişmeden kalır.
�hedef terimi register yada hafıza gözündeki bir değer olmalıdır, kaynak terimi ise
registerdaki, hafıza gözündeki sayı olabileceği gibi direk bir değerde olabilir
�CMP komutu 2 terimi karşılaştırır ve duruma göre bayraklar değişir: Burada bizi
ilgilendiren bayraklar CF ve ZF‟tir.
CMP komutunun bayraklara etkisi
9
Terimleri karşılaştır.
HEDEF>KAYNAK
HEDEF=KAYNAK
HEDEF<KAYNAK
CF
0
0
1
ZF
0
1
0
•BCD VE ASCII KARAKTERLERİ ÖNEMLİ BUNLARA NOTLARDAN BAKIN.
• ASCII’den BCD’ye Çevirme
ASCII’den paketsiz BCD’ye Çevirme
0’dan 9’a kadar olan sayıların ikilik gösterimine BCD denir. 2 tip BCD vardır:
�2 tip BCD sayısı vardır,
(1) paketsiz BCD (2) paketli BCD
Paketsiz BCD: 4 bitlik BCD kodu için 1 byte kullanılırÖrneğin 9 sayısı paketsiz BCD
gösteriminde 0000 1001 şeklinde ifade edillir.
Paketli BCD: 2 tane 4 bitlik BCD kodu için 1 byte kullanılır. Mesela 59 sayısı paketli BCD
olarak 0101 1001 şeklinde gösterilir.
ASCII koduyla gösterilen rakamları BCD‟ye çevirmek için yüksek değerlikli 4 bitin
bulunduğu yerdeki 0011 atılmalıdır.
�Bunu yapmak için ASCII sayısı 0000 1111 (0FH) ile AND işlemine sokulur.
ASCII’den paketli BCDye çevirme
ASCIIyi paketli BCDye çevirmek için ilk olarak başındaki 011 atılarak paketsiz BCD‟ye
çevrilir. Sonra birleştirilip paketli BCD yapılır.
Paketli BCD’yi ASCIIye Çevirme
Paketli BCDyi ASCIIye çevirmek için önce paketsiz BCDye çevrilmeli sonra da 011 0000
(30H) eklenmelidir.
NOT: BCD‟DEN ASCIIYE, ASCIIDEN BCDYE ÇEVİRME KONUSUNU İYİ
ÇALIŞINNNN DERİM, SORU FALAN SORABİLİRİM)
LECTURE 11
BCD TOPLAMA VE DÜZELTME
•Bazen iki BCD sayısının toplamı BCD sayısı olmaz, bu problemi çözmek için BCD sayısı
olmayan kısımdaki nibble‟a onluk 6 sayısı (0110) ekleriz. Bunun örneklerine bakınız!!
•Ayrıca bu düzeltmeyi yapan özel bir komutta vardır
DAA ;Toplama için ondalık ayarlama
DAA eğer gerekli ise, 6 sayısını düşük veya yüksek değerlikli nibble‟a ekleme işini yapar.
• DAA sadece ADD ve ADC komutlarından sonra çalışır.
• Ek olarak DAA‟nın çalışabilmesi için hedef terimi AL registerı olmak zorundadır.
• BCD toplamada herhangi bir basamak 9‟dan büyük değer alamaz.
Summary of DAA action
1. Eğer ADD ve ADC komutu sonrası düşük değerlikli bit 9dan büyük, veya AF=1 ise düşük
değerlikli 4 bite 0110 ekler.
2. Eğer yüksek değüerlikli nibble 9dan büyük veya CF=1 ise yüksek değerlikli nibble‟a 0110
ekler.
AF (Auxiliary carry Flag) sadece BCD toplama ve düzeltmede kullanılır.
�BCD Çıkarma ve Düzeltme
DAS ; Çıkarma için Onluk Düzeltme
• Paketli BCD sayılarının toplanmasında karşımıza çıkan bu problem çıkarma işleminde de
olmaktadır.DAS bu problemi düzeltmek için kullanılır.
• DAS, SUB veya SBB komutlarından sonra gelmelidir.
10
• Ek olarak DAS‟nın çalışabilmesi için hedef terimi AL registerı olmak zorundadır.
Summary of DAS action
1. Eğer SUB veya SBB komutu sonrası düşük değerlikli bit 9dan büyük, veya AF=1 ise düşük
değerlikli 4 bitten 0110 çıkarılır.
2. Eğer yüksek değerlikli nibble 9dan büyük veya CF=1 ise yüksek değerlikli nibble‟dan 0110
çıkarılır.
DÖNDÜRME KOMUTLARI
• ROR rotate right Sağa döndür
�Burada en düşük değerlikli bit hem en yüksek değerliklikli bite gelir hem de CF‟e
kopyalanır.
�CL döndürme sayısını tutar. Sadece 1 defa döndürülecekse CL‟ye gerek yoktur.
Bunlarla ilgili örneklere iyi bakın arkadaşlar!!!!
• ROL rotate left Sola döndür
�MSB En yükske değerlikli bit en düşük değerlikli bite geçer ve aynı zamanda CF‟e
kopyalanır. CL döndürme sayısını tutar. Sadece 1 defa döndürülecekse CL‟ye gerek yoktur.
Bunlarla ilgili örneklere iyi bakın arkadaşlar!!!!
• RCR rotate right through carry Sağ tarafa carry (elde) üzerinde döndürme
�En düşük değerlikli bit CF‟ye geçer, CF‟deki değerde En yüksek değerlikli bite geçer.
�CL döndürme sayısını tutar. Sadece 1 defa döndürülecekse CL‟ye gerek yoktur.
• RCL rotate left through carry
�En yüksek değerlikli bit CF‟e geçer, CF‟deki değerde en düşük değerlikli bite yazılır.
Burada dikkat edilecek iki komut var bilginiz olması açısından, CLC komutu CF‟i temizler bu
komut sonrası 0 olur. STC komutu ise CF‟i 1 yapar. Bunlar bazı program yazma konusunda
başlangıç değerleri verme adına gerekebilir.
�CL döndürme sayısını tutar. Sadece 1 defa döndürülecekse CL‟ye gerek yoktur.
LECTURE 13
İŞARETLİ SAYILARDAKİ ARİTMETİK İŞLEMLER
İşaretli sayılarda en yüksek değerlikli bit sayının pozitif veya negatif olduğunu gösterir. En
yüksek değerlikli bit 1 ise sayı negatif 0 ise pozitiftir.
Pozitif Sayılar:
8 bitle gösterilen pozitif sayılar 0dan 127ye kadardır. Eğer pozitif sayı 127den büyükse word
boyutunda terimler kullanılmalıdır.
Negatif Sayılar:
8 bitlik negatif sayıda en yüksek değerlikli bit 1dir ve sayının büyüklüğü 2ye tümleyeni ile
bulunur. Bunu assembler kendi yapmasına karşı nasıl yapıldığını bilmekte fayda var.
Negatif sayı gösterimini bulmak için
1.sayının büyüklüğünü 8 bit olarak işaretsiz yaz.
2. Her bir bitin tersini al, yani 1leri 0 sıfırları 1 yap.
3. bunu 1 ile topla
-5 sayısının nasıl yapıldığını görmek için bu örneğe bakabiliriz.
1. 0000 0101 5 in 8-bit binary
2. 1111 1010 invert each bit
3. 1111 1011 add 1 (hex = FBH)
Word-sized byte operands:
Word boyutunda işaretli sayılarda temsil ettiği aralıkta genişleyecektir
–32768 „ten +32767‟e kadar.Daha büyük sayılar için çoklu word terimleri seçilmelidir.
İşaretli sayı işlemlerindeki Taşma (overflow) problemi
11
İşaretli sayılarla işlem yaparken taşma problemi oplabilir. Bu problem, eğer sonuç işlemden
sonra register için çok büyükse olur.Bu durumda CPU, OF bayrağını bir yapar ve programcı
buradaki mesajı anlamalıdır. Aşağıdaki örnekte görülebilir.
Ex: DATA1 DB +96
DATA2 DB +70
……
MOV AL,DATA1 ;AL=0110 0000 (60H)
MOV BL,DATA2 ;BL=0100 0110 (46H)
ADD AL,BL ;AL=1010 0110 (AL=A6H=-90 invalid!)
+ 96 0110 0000
+ 70 0100 0110
+166 1010 0110 According to the CPU this is –90, which is wrong.(OF=1, SF=1, CF=0)
3
Daha önce de söyledipimiz gibi 8 bitle gösterilen en büyük pozitif sayı 127 oldugundan 166
sayısı gosterilemez. Programcı Ofdeki durumdan bunu anlar.
When the OF is set in 8-bit operations 8-bitlik işlemlerde OF’nin 1 olduğu durumlar
İki durumdan biri olursa OF=1 olur
1. D6 bitinden D7 bitine geçerken (unutmayın en yüksek değerlikli bit D7 en düşük D0 idi)
elde oluşuyor ama D7den elde oluşmuyorsa yani CF=0 ise.
2. D7‟den elde oluşuyorsa yani CF=1, fakat D6‟dan D7‟ye elde geçmiyorsa.
OF in 16-bit operations 16-bitlik işlemlerde OF’nin 1 olduğu durumlar
İki durumdan biri olursa OF=1 olur
1. D14 bitinden D15 bitine geçerken (unutmayın en yüksek değerlikli bit D15 en düşük D0
idi) elde oluşuyor ama D7den elde oluşmuyorsa yani CF=0 ise.
2. D15‟ten elde oluşuyorsa yani CF=1, fakat D14‟ten D15‟e elde geçmiyorsa.
İşaretli sayılarda hatalı sonuçlardan kaçınma
�Problemden kaçınmak için terimi genişletebiliriz. Ya uzattığımız terimin tamamı işaret
bitlerini bulundurur yani en düşük değerlikli byte dediğimiz D7yi yüksek değerlikli yeni
uzatma sonucu oluşan yüksek değerlikli bytetaki bütün bitlere yazarız. 16 bitlik register içinse
işaret bitini başka bir registara kopyalabiliriz.
� İşaret uzatma için iki komut kullanılır:
CBW ; Convert signed Byte to signed Word işaretli byte‟ı işaretli worde çevir
CBW, AL registerindaki D7deki değeri, AH registerının bütün bitlerine kopyalar. Notice that
the operand is assumed to be
AL and the contents of AH is destroyed.
Ex: MOV AL,+96 ;AL = 0110 0000
CBW ;now AH= 0000 0000 and AL=0110 0000
Ex: MOV AL,–2 ;AL = 1111 1110
CBW ;now AH= 1111 1111 and AL=1111 1110
CWD ; Convert signed Word to signed Doubleword işaretli wordü işaretli double worde çevir
CWD, AX registerındaki D15deki değeri (the sign flag) DX‟in bütün bitlerine kopyalar.
Bunlarla ilgili örnekleri incelersiniz.
BU NOTLARA ÇALIŞMAK TEK BAŞINA SINAVDAN İYİ BİR NOT ALMAYA
YETMEYEBİLİR, İNGİLİZCE NOTLARDAKİ ÖRNEKLERİ ANLAMANIZ
GEREKEBİLİR. BAŞARILAR...
12