8086 Programlaması – Kısım 1 1 Mikroişlemciler
İçerik 2 Hafıza Eri ş imi MOV komutu De ğ i ş kenler, Array’ler, Sabitler Aritmetik ve Mantık Komutları
Genel amaçlı Register’lar AX - the accumulator register (divided into AH / AL). BX - the base address register (divided into BH / BL). CX - the count register (divided into CH / CL). DX - the data register (divided into DH / DL). SI - source index register. DI - destination index register. BP - base pointer. SP - stack pointer. 3
Segment Register’lar CS - points at the segment containing the current program. DS - generally points at segment where variables are defined. ES - extra segment register, it's up to a coder to define its usage. SS - points at the segment containing the stack. 4
Özel amaçlı Register’lar IP - the instruction pointer. Flags register - determines the current state of the microprocessor. 5
Hafıza Erişimi 6 Hafızaya eri ş im için, ş u register’lar kullanılır: BX, SI, DI, BP. Bu register’ları [] sembollerinin içerisinde kullanarak, farklı hafıza adreslerine ula ş ılabilir. [BX+SI] [BX+DI] [BP+SI] [BP+DI] [SI] [DI] d16 [BX] [BX+SI+d8] [BX+DI+d8] [BP+SI+d8] [BP+DI+d8] [SI + d8] [DI + d8] [BP + d8] [BX + d8] [BX + SI + d16] [BX + DI + d16] [BP + SI + d16] [BP + DI + d16] [SI + d16] [DI + d16] [BP + d16] [BX + d16]
Yerdeğişim 7 d8 - 8 bit yönlü yakın (immediate) yerde ğ i ş im (Örne ğ in: 22, 55h, -1, ve benzeri...) d bit yönlü yakın (immediate) yerde ğ i ş im (Örne ğ in: 300, 5517h, -259, ve benzeri...). Yerde ğ i ş im, bir ivedi de ğ er olabilece ğ i gibi, bir de ğ i ş kenden offset de ğ eri de olabilir. Yerde ğ i ş im, [] sembollerinin içerisinde olabilece ğ i gibi, dı ş arısında da olabilir. Assembler, iki kullanım için de aynı makine kodunu üretir. Yerde ğ i ş im, yönlü bir de ğ erdir. (+) veya (-) olabilir. D8 veya d18 arasındaki farkı, genellikle compiler anlar ve gerekli olan makine kodunu üretir.
Örnek 8 DS = 100, BX = 30, SI = 70 olsun. [BX + SI] + 25 i ş lemi, i ş lemci tarafından a ş a ğ ıdaki biçimde fiziksel bir adres de ğ erine dönü ş türülür: 100 * = Not: Tüm de ğ erler desimal (onluk) de ğ erler oldu ğ u için DS, 16 = 10H ile çarpılmı ş tır.
Hatırlamanın kolay yolu 9 DS segment register’ı, BP register’ını kullanan modlar haricinde kullanılır. Bu durumda, SS segment register’ı kullanılır. Mümkün olan farklı kombinasyonlar için sa ğ daki tablo kullanılabilir. Uygun bir kombinasyon için: her sütundan sadece bir adet eleman kullanılabilir. BX ve BP birlikte kullanılmaz. SI ve DI birlikte kullanılmaz. BX BP SI DI + disp
Veri tipleri 10 Compiler’a veri tipinin belirtmek için bazı ön ekler kullanılır: – BYTE PTR - byte için. – WORD PTR - word için Örnekler: – MOV AL, BYTE PTR [BX] ; byte eri ş imi – MOV CX, WORD PTR [BX] ; word eri ş imi Assembler, kısa ön eklerin de kullanılmasına olanak tanır: – B. - BYTE PTR için – W. - WORD PTR için Bazı durumlarda, assembler veri tipini otomatik olarak hesaplar.
MOV Komutu 11 İ kinci operand’ı birinci operand’a kopyalar. Kaynak operand’ı, ivedi bir veri, veya genel amaçlı bir register veya bir hafıza bölgesi olabilir. Hedef, genel amaçlı bir register veya bir hafıza bölgesi olabilir. Her iki operand da aynı böüyüklükte olmalıdır. Byte veya word olabilir. MOV komutu ile CS ve IP register’larının içeri ğ i de ğ i ş tirilemez.
MOV komutunun operand’ları 12 A ş a ğ ıdaki operand tipleri desteklenmektedir: – MOV REG, hafıza – MOV hafıza, REG – MOV REG, REG – MOV hafıza, ivedi – MOV REG, ivedi REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP. hafıza: [BX], [BX+SI+7], de ğ i ş ken, ve benzeri. ivedi: 5, -24, 3Fh, b, ve benzeri.
Segment Register Operand’ları 13 Segment register’ları için sadece a ş a ğ ıdaki MOV tipleri desteklenmektedir: – MOV SREG, hafıza – MOV hafıza, SREG – MOV REG, SREG – MOV SREG, REG SREG: DS, ES, SS, ve sadece ikinci operand olarak: CS. REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP. hafıza: [BX], [BX+SI+7], de ğ i ş kenler, ve benzeri.
MOV örneği 14 ORG 100h ; bu komut, 1 segment’li.com programı için gereklidir. MOV AX, 0B800h ; AX’e B800h heksadesimal de ğ erini ver. MOV DS, AX ; AX’in de ğ erini DS’e kopyala. MOV CL, 'A' ; CL’e ‘A’ nın ASCII de ğ erini (41h) kopyala. MOV CH, b ; CH’ye binary de ğ eri kopyala. MOV BX, 15Eh ; BX’e 15Eh de ğ erini kopyala. MOV [BX], CX ; CX’in içeri ğ ini B800:015E hafıza noktasına kopyala RET ; i ş letim sistemine geri dön.
Değişkenler 15 De ğ i ş ken tanımlaması için: – isim DB de ğ er – isim DW de ğ er DB : Define Byte. DW: Define Word. isim : harf ile ba ş layıp harf/rakam ile devam eder. İ simsiz de ğ i ş kenler de tanımlamak mümkündür. Bu durumda de ğ i ş kenin adresi olur fakat ismi olmaz. de ğ er : desteklenen formatlardaki sayısal bir de ğ er (heksadesimal, binary, desimal) veya ilk de ğ er verilmek istenmeyen durumlarda ? i ş areti
Örnek 16 ORG 100h MOV AL, var1 MOV BX, var2 RET ; programı durdur. var1 DB 7 var2 DW 1234H
ORG komutu 17 ORG 100h bir compiler komutudur. Compiler’a, kaynak kodunu nasıl çalı ş tıraca ğ ını tanımlar. Compiler’a, çalı ş tırılabilir dosyanın (executable file) 100h (256 byte) offset de ğ erinden yüklenmesi gerekti ğ ini anlatır. Bu durumda, compiler, tüm de ğ i ş kenlerin adreslerini hesaplarken, offset de ğ erini dikkate alır. Compiler komutları, hiçbir zaman gerçek makine koduna dönü ş türülmez. Executable file neden 100h offset de ğ erinden yüklenir? Çünkü CS (Kod segmenti)’nden itibaren ilk 256 byte’ta, program ile ilgili i ş letim sisteminin gerektirdi ğ i bazı bilgiler (komut satırı parametreleri ve benzeri) tutulur.
Array’ler 18 Array’ler, de ğ i ş ken sırası olarak dü ş ünülebilir. Bir text string’i, byte array’e bir örnektir. Her bir karakter, bir byte ile gösterilen ASCII kod de ğ erini (0 … 255) gösterir. Örnekler: a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h b DB 'Hello', 0 b array’ı, a array’inin tam olarak bir kopyasıdır. Compiler bir string gördü ğ ünde otomatik olarak byte setine dönü ş türülür.
ASCII Code 19
Array elemanlarına erişim 20 Array elemanlarına kö ş eli parantez ile eri ş ilebilir. Örne ğ in: MOV AL, a[3] Ayrıca, hafıza index register’larından herhangi biri (BX, SI, DI, BP) kullanılabilir. MOV SI, 3 MOV AL, a[SI]
Büyük array’lerin tanımlanması 21 E ğ er büyük array’lerin tanımlanması gerekli ise, DUP komutu kullanılabilir. DUP komutu: adet DUP ( de ğ er(ler) ) adet : kaç tane eleman olaca ğ ı (sabit bir sayı). de ğ er : DUP’un kopyalaca ğ ı de ğ er. Örnek: c DB 5 DUP(9) A ş a ğ ıdaki tanımlama ile aynıdır: c DB 9, 9, 9, 9, 9
Büyük array’lerin tanımlanması 22 Bir örnek daha: d DB 5 DUP(1, 2) A ş a ğ ıdaki tanımlama ile aynıdır: d DB 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 E ğ er büyük de ğ erlerin kullanılması gerekli ise, DB yerine DW kullanılabilir. DW, string’lerin tanımlanmasında kullanılmaz.
Bir değişkenin adresinin alınması 23 LEA komutu ve OFFSET operatörü, bir de ğ i ş kenin offset adresinin alınması için kullanılabilir. LEA indislenmi ş olan de ğ i ş kenlerin adreslerinin alınması için de kullanılabildi ğ i için daha kuvvetlidir. Bir de ğ i ş kenin adresinin alınması, bir fonksiyona parametre ula ş tırmak gibi bazı i ş lemler için oldukça kullanı ş lıdır.
Örnek 1 24 ORG 100h MOV AL, VAR1 ; VAR1’in de ğ erini AL’ye göndererek de ğ erini kontrol et. LEA BX, VAR1 ; VAR1’in adresini BX’e al. MOV BYTE PTR [BX], 44h ; VAR1’in içeri ğ ini de ğ i ş tir. MOV AL, VAR1 ; VAR1’in de ğ erini AL’ye göndererek de ğ erini kontrol et. RET VAR1 DB 22h END
Örnek 2 25 ORG 100h MOV AL, VAR1 ; VAR1’in de ğ erini AL’ye göndererek kontrol et. MOV BX, OFFSET VAR1 ; VAR’in adresini BX’e al. MOV BYTE PTR [BX], 44h ; VAR1’in içeri ğ ini de ğ i ş tir. MOV AL, VAR1 ; VAR1’in de ğ erini AL’ye göndererek kontrol et. RET VAR1 DB 22h END
Öğrnek 3 org 100h jmp start vec1 db 1, 2, 5, 6 vec2 db 3, 5, 6, 1 vec3 db ?, ?, ?, ? start: lea si, vec1 lea bx, vec2 lea di, vec3 mov cx, 4 sum: 26 mov al, [si] add al, [bx] mov [di], al inc si inc bx inc di loop sum ret
Örnekler hakkında… 27 Her iki örnek de aynı fonksiyonu yerine getirir. A ş a ğ ıdaki satırlar: LEA BX, VAR1 MOV BX, OFFSET VAR1 aynı makine koduna compile edilir: MOV BX, num num : 16 bit de ğ i ş ebilir offset de ğ eri.
Sabitler 28 Sabitler, de ğ i ş kenler gibidir. Ancak sabitler, sadece programınız compile edilene kadar bulunurlar. Bir sabit tanımlandıktan sonra de ğ i ş tirilemez. Sabitlerin tanımlanması için EQU komutu kullanılır: isim EQU Örnek: k EQU 5 MOV AX, k Yukarıdaki örnek, a ş a ğ ıdaki kod ile fonksiyonel olarak aynıdır: MOV AX, 5
Aritmetik ve Mantık komutları 29 Ço ğ u aritmetik komut, FLAGS register’ını etkiler. Carry Flag (C) : Bu bayrak, yönsüz overflow oldu ğ unda 1 olur. Aksi durumda 0 olur. Örne ğ in: byte 255 ile 1 toplandı ğ ında, sonuç 0 … 255 aralı ğ ında olmadı ğ ı için 1 olur. Zero Flag (Z) : Sonuç sıfır oldu ğ unda 1 olur. Aksi durumda 0 olur. Sign Flag (S) : Sonuç (-) oldu ğ unda 1 olur. Aksi durumda 0 olur. Bu bayrak, aynı zamanda, en büyük bit’in de ğ eridir. Overflow Flag (O) : Yönlü overflow oldu ğ unda 1 olur. Aksi durumda 0 olur. Örne ğ in: byte 100 ile 50 toplandı ğ ında sonuç … 127 aralı ğ ında olmadı ğ ı için 1 olur.
Aritmetik ve Mantık komutları 30 Parity Flag (P) : Bu bayrak, sonuçta çift sayıda 1 biti var ise 1 olur. Aksi durumda 0 olur. E ğ er sonuç word ise, sadece dü ş ük olan 8 bit dikkate alınır. Auxiliary Flag (A) : dü ş ük olan nibble’da (4 bit) yönsüz overflow var ise 1 olur. Aksi durumda 0 olur. Interrupt enable Flag (I) : Bu bayrak 1 oldu ğ unda, CPU harici cihazlardan gelen interrupt’lara cevap verir. Direction Flag (D) : Bu bayrak 0 oldu ğ unda, veri i ş lemesi ileri yönlü olur. 1 oldu ğ unda ise geri yönlü olur.
1. grup: ADD, SUB,CMP, AND, TEST, OR, XOR 31 Bu komutlar, a ş a ğ ıdaki operand’ları destekler: REG, hafıza hafıza, REG REG, REG hafıza, ivedi REG, ivedi REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP. hafıza: [BX], [BX+SI+7], de ğ i ş ken, ve benzeri. ivedi: 5, -24, 3Fh, b, ve benzeri.
ADD, SUB,CMP, AND, TEST, OR, XOR (devam) 32 Operasyonlardan sonra, sonuç ilk operand’da saklanır. CMP ve TEST komutları sadece bayrakları etkiler, fakat herhangi bir sonuç depolamaz. Bu komutlar, sadece programın çalı ş ması sırasında kararlar vermek için kullanılır. Bu komutlar, sadece a ş a ğ ıdaki bayrakları etkiler: C, Z, S, O, P, A.
ADD, SUB,CMP, AND, TEST, OR, XOR (devam) 33 ADD - ikinci operand’ı birinci ile topla SUB - İ kinci operand’ı birinciden çıkart. CMP - İ kinci operand’ı birinciden çıkart (sadece bayraklar için). AND - İ ki operand’ın tüm bitleri için mantıksal AND. TEST - AND komutu gibi (sadece bayraklar için). OR - İ ki operand’ın tüm bitleri için mantıksal OR. XOR - İ ki operand’ın tüm bitleri için mantıksal XOR.
AND, OR, XOR hakkında 34 AND operatörü e ğ er iki operand da 1 ise 1 sonucunu verir. OR operatörü, e ğ er iki operand’dan en az biri 1 ise 1 sonucunu verir. XOR operatörü, e ğ er iki operand farklı ise 1 sonucunu verir.
MOV AL,, b AND AL,, b ; resullt iin AL= b _____________________________________________ MOV AL,, b OR AL,, b ; resullt iin AL= b ______________________________________________ MOV AL,, 54H ; AL= b XOR AL,, 87H ; resullt iin AL= b ______________________________________________ MOV AL,, 54H ; AL= b XOR AL,, AL ; resullt iin AL= b 35
MOV AL, b ; 4 biits = even pariity XOR AL, 0 ; Pariity fllag iis set (PE) MOV AX, 64C1H ; AX= XOR AH, AL ______________________________________ MOV AL,, 55H ; AL= b AND AL, 1FH ; AL=15H= b,cllear biit 7 OR AL, 0C0H ; AL=D5H= b,, set biits 1,, 3,, 5,, 7,, 8 XOR AL, 0FH ; AL=DAH= b,,iinvert biits 1,, 2,, 3,, 4 NOT AL ; AL=25H= b,,togglles (iinvert) allll biits 36
2. Grup: MUL, IMUL, DIV, IDIV 37 Bu tip komutlar, a ş a ğ ıdaki tipleri desteklerler: REG Hafıza REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP. hafıza: [BX], [BX+SI+7], de ğ i ş ken, ve benzeri. MUL ve IMUL komutları, sadece a ş a ğ ıdaki bayrakları etkilerler: C, O E ğ er sonuç operand büyüklü ğ ünden daha büyük ise, bu bayraklar 1 olur. E ğ er sonuç operand büyüklü ğ üne sı ğ ıyor ise, bu bayraklar 0 olur. DIV ve IDIV bayrakları tanımlı de ğ ildir.
MUL ve IMUL 38 MUL - Yönsüz çarpım Operand’lar byte ise: AX = AL * operand. Operand’lar word ise: (DX AX) = AX * operand. IMUL - Yönlü çarpım Operand’lar byte ise: AX = AL * operand. Operand’lar word ise: (DX AX) = AX * operand.
8-Biit Mulltiiplliicatiion MOV AL,, 5H ; a byte iis moved to AL MOV BL,, 10H ; iimmediiate data must be iin BL regiister MUL BL ; AX = 0050h,, CF = 0, OF=0 16-Biit Mulltiiplliicatiion MOV AX,, 2000H ; a word iis moved to AX MOV BX,, 0100H ; iimmediiate data must be iin BX regiister MUL BX ; DX:AX = H,, CF = 1, OF=1 39
Öğrnek: MOV CX, 2378H ; a word iis moved to CX MOV BX, 2F79H ; iimmediiate data must be iin MOV AX, CX ; posiitiion data MUL BX ; mulltiiplly MOV DI, 0100h ; offset address MOV [DI], AX ; store AX iin DI memory llocatiion MOV [DI+2], DX 40 Before After
DIV ve IDIV 41 DIV - Yönsüz bölüm Operand byte ise: AL = AX / operand ve AH = kalan. Operand word ise: AX = (DX AX) / operand ve DX = kalan IDIV - Yönlü bölüm Operand byte ise: AL = AX / operand ve AH = kalan Operand word ise: AX = (DX AX) / operand ve DX = kalan
8-Bit Division MOV AX,, 0083H ; diiviidend MOV BL,, 02H ; diiviisor DIV BL ; AL=41H,, AH=01H 16-Bit Division MOV DX, 00 ; cllear diiviidend,, hiigh MOV AX, 125 ; diiviidend MOV BX, 06 ; diiviisor DIV BX ; AX=0014H,, DX=0005H 42
org 100h; set location counter to 100h MOV AX, 26 ; diiviidend MOV BL, 5 ; diiviisor DIV BL; ; IF BL =0 what a happen???? _______________________________________ org 100h; set location counter to 100h MOV AX,, 83H ; diiviidend MOV BL,, 0102H ; diiviisor ; error DIV BL ; AL=41H,, AH=01H ________________________________________ 43
3. Grup: INC, DEC, NOT, NEG 44 Bu komutlar, a ş a ğ ıdaki tipleri destekler: REG Hafıza REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP. hafıza: [BX], [BX+SI+7], de ğ i ş ken, ve benzeri.
INC ve DEC 45 INC: Operand’ı 1 arttırır. DEC: Operand’ı 1 azaltır. INC, DEC komutları sadece a ş a ğ ıdaki bayrakları etkiler: Z, S, O, P, A
NOT ve NEG 46 NOT - Operand’ın tüm bitlerini de ğ il’ler. NEG - Operand’ı (-) yapar (2’s complement). Yani, tüm bitleri ters çevirir, sonuca 1 ilave eder. Örne ğ in 5, -5 olur. -2 ise 2 olur. NOT komutu hiçbir bayra ğ ı etkilemez. NEG komutu sadece a ş a ğ ıdaki bayrakları etkiler: C, Z, S, O, P, A
Negatif Sayılar 47 Bir sayıyı negatif yapmak için üç metot vardır. 1. Yön ve büyüklük Birinci bit’i 1 yap 2. 1’s complement Her bit’i de ğ il’le 3. 2’s complement Her bit’i de ğ il’le ve 1 arttır Bu metot 8086’da kullanılır.
2’s complement 48 8 bit, 256 farklı sayı olu ş turabilir (sıfır dahil). İ lk 128 (0 … 127) (+) sayıları gösterir. İ kinci 128 (128 … 256) (-) sayıları gösterir. -5 için 256’dan 5 çıkartılır: 256 – 5 = 251.
2’s complement 49 5 için: 5: Her bit’i de ğ il’le: ilave eder: : (2’s complement gösterim).
İki 2’s complement sayının toplaması 50 5 ile -5 nasıl toplanır? 5 = = (-5) = Son 8 bit dikkate alınırsa, sonuç beklendi ğ i gibi 0 bulunur.