Mikroilemciler 8086 Programlamas Ksm 1 1 erik Hafza

  • Slides: 44
Download presentation
Mikroişlemciler 8086 Programlaması – Kısım 1 1

Mikroişlemciler 8086 Programlaması – Kısım 1 1

İçerik Hafıza Erişimi MOV komutu Değişkenler, Array’ler, Sabitler Aritmetik ve Mantık Komutları 2

İçerik Hafıza Erişimi MOV komutu Değişkenler, Array’ler, Sabitler Aritmetik ve Mantık Komutları 2

Genel amaçlı Register’lar AX - the accumulator register (divided into AH / AL). BX

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 -

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

Özel amaçlı Register’lar IP - the instruction pointer. Flags register - determines the current state of the microprocessor. 5

Veri tipleri • Compiler’a veri tipinin belirtmek için bazı ön ekler kullanılır: – BYTE

Veri tipleri • 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. 10

MOV Komutu • İkinci operand’ı birinci operand’a kopyalar. • Kaynak operand’ı, ivedi bir veri,

MOV Komutu • İ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. 11

MOV komutunun operand’ları • Aşağıdaki operand tipleri desteklenmektedir: – MOV REG, hafıza – MOV

MOV komutunun operand’ları • 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, BH, CL, DH, DL, DI, SI, BP, SP. • hafıza: [BX], [BX+SI+7], değişken, ve benzeri. • ivedi: 5, -24, 3 Fh, 10001101 b, ve benzeri. 12

MOV örneği ORG 100 h ; bu komut, 1 segment’li. com programı için gereklidir.

MOV örneği ORG 100 h ; bu komut, 1 segment’li. com programı için gereklidir. MOV AX, 0 B 800 h ; AX’e B 800 h 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 (41 h) kopyala. MOV CH, 11011111 b ; CH’ye binary değeri kopyala. MOV BX, 15 Eh ; BX’e 15 Eh değerini kopyala. MOV [BX], CX ; CX’in içeriğini B 800: 015 E hafıza noktasına kopyala RET ; işletim sistemine geri dön. 14

Değişkenler • Değişken tanımlaması için: – isim DB değer – isim DW değer •

Değişkenler • 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 15

Örnek ORG 100 h MOV AL, var 1 MOV BX, var 2 RET ;

Örnek ORG 100 h MOV AL, var 1 MOV BX, var 2 RET ; programı durdur. var 1 DB 7 var 2 DW 1234 H 16

ORG komutu • ORG 100 h bir compiler komutudur. Compiler’a, kaynak • • 17

ORG komutu • ORG 100 h bir compiler komutudur. Compiler’a, kaynak • • 17 kodunu nasıl çalıştıracağını tanımlar. Compiler’a, çalıştırılabilir dosyanın (executable file) 100 h (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 100 h 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, değişken sırası olarak düşünülebilir. Bir text string’i, byte array’e bir örnektir. Her bir

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 48 h, 65 h, 6 Ch, 6 Fh, 00 h 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. 18

ASCII Code 19

ASCII Code 19

Array elemanlarına erişim Array elemanlarına köşeli parantez ile erişilebilir. Örneğin: MOV AL, a[3] Ayrıca,

Array elemanlarına erişim 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] 20

Büyük array’lerin tanımlanması Eğer büyük array’lerin tanımlanması gerekli ise, DUP komutu kullanılabilir. DUP komutu:

Büyük array’lerin tanımlanması 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 21

Büyük array’lerin tanımlanması Bir örnek daha: d DB 5 DUP(1, 2) Aşağıdaki tanımlama ile

Büyük array’lerin tanımlanması Bir örnek daha: d DB 5 DUP(1, 2) Aşağıdaki tanımlama ile aynıdır: d DB 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. 22

Bir değişkenin adresinin alınması LEA komutu ve OFFSET operatörü, bir değişkenin offset adresinin alınması

Bir değişkenin adresinin alınması 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. 23

Örnek 1 ORG 100 h MOV AL, VAR 1 ; VAR 1’in değerini AL’ye

Örnek 1 ORG 100 h MOV AL, VAR 1 ; VAR 1’in değerini AL’ye göndererek değerini kontrol et. LEA BX, VAR 1 ; VAR 1’in adresini BX’e al. MOV BYTE PTR [BX], 44 h ; VAR 1’in içeriğini değiştir. MOV AL, VAR 1 ; VAR 1’in değerini AL’ye göndererek değerini kontrol et. RET VAR 1 DB 22 h END 24

Örnek 2 ORG 100 h MOV AL, VAR 1 ; VAR 1’in değerini AL’ye

Örnek 2 ORG 100 h MOV AL, VAR 1 ; VAR 1’in değerini AL’ye göndererek kontrol et. MOV BX, OFFSET VAR 1 ; VAR’in adresini BX’e al. MOV BYTE PTR [BX], 44 h ; VAR 1’in içeriğini değiştir. MOV AL, VAR 1 ; VAR 1’in değerini AL’ye göndererek kontrol et. RET VAR 1 DB 22 h END 25

Örnekler hakkında… Her iki örnek de aynı fonksiyonu yerine getirir. Aşağıdaki satırlar: LEA BX,

Örnekler hakkında… Her iki örnek de aynı fonksiyonu yerine getirir. Aşağıdaki satırlar: LEA BX, VAR 1 MOV BX, OFFSET VAR 1 aynı makine koduna compile edilir: MOV BX, num : 16 bit değişebilir offset değeri. 26

Sabitler, değişkenler gibidir. Ancak sabitler, sadece programınız compile edilene kadar bulunurlar. Bir sabit tanımlandıktan

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 < bir tanımlama > Örnek: k EQU 5 MOV AX, k Yukarıdaki örnek, aşağıdaki kod ile fonksiyonel olarak aynıdır: MOV AX, 5 27

Aritmetik ve Mantık komutları Çoğu aritmetik komut, FLAGS register’ını etkiler. Carry Flag (C) :

Aritmetik ve Mantık komutları Çoğu aritmetik komut, FLAGS register’ını etkiler. Carry Flag (C) : Bu bayrak, yönsüz overflow olduğunda 1 28 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ç -128 … 127 aralığında olmadığı için 1 olur.

Aritmetik ve Mantık komutları Parity Flag (P) : Bu bayrak, sonuçta çift sayıda 1

Aritmetik ve Mantık komutları 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. 29

1. grup: ADD, SUB, CMP, AND, TEST, OR, XOR Bu komutlar, aşağıdaki operand’ları destekler:

1. grup: ADD, SUB, CMP, AND, TEST, OR, XOR Bu komutlar, aşağıdaki operand’ları destekler: REG, hafıza, REG, REG hafıza, ivedi REG, ivedi REG: AX, BX, CX, DX, AH, AL, BH, CL, DH, DL, DI, SI, BP, SP. hafıza: [BX], [BX+SI+7], değişken, ve benzeri. ivedi: 5, -24, 3 Fh, 10001101 b, ve benzeri. 30

ADD, SUB, CMP, AND, TEST, OR, XOR (devam) Operasyonlardan sonra, sonuç ilk operand’da saklanır.

ADD, SUB, CMP, AND, TEST, OR, XOR (devam) 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. 31

ADD, SUB, CMP, AND, TEST, OR, XOR (devam) ADD - ikinci operand’ı birinci ile

ADD, SUB, CMP, AND, TEST, OR, XOR (devam) 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. 32

AND, OR, XOR hakkında AND operatörü eğer iki operand da 1 ise 1 sonucunu

AND, OR, XOR hakkında 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. 33

 MOV AL, , 10101110 b AND AL, , 11110110 b ; resullt iin

MOV AL, , 10101110 b AND AL, , 11110110 b ; resullt iin AL=10100110 b _______________________ MOV AL, , 11100111 b OR AL, , 00000100 b ; resullt iin AL=11100111 b _______________________ MOV AL, , 54 H ; AL=01010100 b XOR AL, , 87 H ; resullt iin AL=00101100 b _______________________ MOV AL, , 54 H ; AL=01010100 b XOR AL, , AL ; resullt iin AL=0000 b 34

 MOV AL, 10110001 b ; 4 bits = even parity XOR AL, 0

MOV AL, 10110001 b ; 4 bits = even parity XOR AL, 0 ; Parity flag is set (PE) MOV AX, 64 C 1 H ; AX= 0110 01001100 0001 XOR AH, AL ___________________ MOV AL, , 55 H ; AL=0101 b AND AL, 1 FH ; AL=15 H=00010101 b, cllear bit 7 OR AL, 0 C 0 H ; AL=D 5 H=11010101 b, , set bits 1, , 3, , 5, , 7, , 8 XOR AL, 0 FH ; AL=DAH=11011010 b, , iinvert biits 1, , 2, , 3, , 4 NOT AL ; AL=25 H=00100101 b, , togglles (invert) all bits 35

2. Grup: MUL, IMUL, DIV, IDIV Bu tip komutlar, aşağıdaki tipleri desteklerler: REG Hafıza

2. Grup: MUL, IMUL, DIV, IDIV Bu tip komutlar, aşağıdaki tipleri desteklerler: REG Hafıza REG: AX, BX, CX, DX, AH, AL, BH, 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. 36

MUL ve IMUL - Yönsüz çarpım Operand’lar byte ise: AX = AL * operand.

MUL ve IMUL - 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. 37

 8 -Biit Mulltiiplliicatiion MOV AL, , 5 H ; a byte iis moved

8 -Biit Mulltiiplliicatiion MOV AL, , 5 H ; a byte iis moved to AL MOV BL, , 10 H ; iimmediiate data must be iin BL regiister MUL BL ; AX = 0050 h, , CF = 0, OF=0 16 -Biit Mulltiiplliicatiion MOV AX, , 2000 H ; a word iis moved to AX MOV BX, , 0100 H ; iimmediiate data must be iin BX regiister MUL BX ; DX: AX = 00200000 H, , CF = 1, OF=1 38

Öğrnek: MOV CX, 2378 H ; a word iis moved to CX MOV BX,

Öğrnek: MOV CX, 2378 H ; a word iis moved to CX MOV BX, 2 F 79 H ; iimmediiate data must be iin MOV AX, CX ; posiitiion data MUL BX ; mulltiiplly MOV DI, 0100 h ; offset address MOV [DI], AX ; store AX iin DI memory llocatiion MOV [DI+2], DX Before 39 After

DIV ve IDIV - Yönsüz bölüm Operand byte ise: AL = AX / operand

DIV ve IDIV - 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 40

 8 -Bit Division MOV AX, , 0083 H ; diiviidend MOV BL, ,

8 -Bit Division MOV AX, , 0083 H ; diiviidend MOV BL, , 02 H ; diiviisor DIV BL ; AL=41 H, , AH=01 H 16 -Bit Division MOV DX, 00 ; cllear diiviidend, , hiigh MOV AX, 125 ; diiviidend MOV BX, 06 ; diiviisor DIV BX ; AX=0014 H, , DX=0005 H 41

 org 100 h ; set location counter to 100 h MOV AX, 26

org 100 h ; set location counter to 100 h MOV AX, 26 ; diiviidend MOV BL, 5 ; diiviisor DIV BL; ; IF BL =0 what a happen? ? ____________________ org 100 h ; set location counter to 100 h MOV AX, , 83 H ; diiviidend MOV BL, , 0102 H ; diiviisor ; error DIV BL ; AL=41 H, , AH=01 H ____________________ 42

3. Grup: INC, DEC, NOT, NEG Bu komutlar, aşağıdaki tipleri destekler: REG Hafıza REG:

3. Grup: INC, DEC, NOT, NEG Bu komutlar, aşağıdaki tipleri destekler: REG Hafıza REG: AX, BX, CX, DX, AH, AL, BH, CL, DH, DL, DI, SI, BP, SP. hafıza: [BX], [BX+SI+7], değişken, ve benzeri. 43

INC ve DEC INC: Operand’ı 1 arttırır. DEC: Operand’ı 1 azaltır. INC, DEC komutları

INC ve DEC 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 44

NOT ve NEG NOT - Operand’ın tüm bitlerini değil’ler. NEG - Operand’ı (-) yapar

NOT ve NEG 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 45

Negatif Sayılar Bir sayıyı negatif yapmak için üç metot vardır. 1. Yön ve büyüklük

Negatif Sayılar Bir sayıyı negatif yapmak için üç metot vardır. 1. Yön ve büyüklük 2. 1’s complement 3. Her bit’i değil’le 2’s complement 46 Birinci bit’i 1 yap Her bit’i değil’le ve 1 arttır Bu metot 8086’da kullanılır.

2’s complement 8 bit, 256 farklı sayı oluşturabilir (sıfır dahil). İlk 128 (0 …

2’s complement 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. 47

2’s complement 5 için: 5: 00000101 Her bit’i değil’le: 11111010 1 ilave eder: 11111011

2’s complement 5 için: 5: 00000101 Her bit’i değil’le: 11111010 1 ilave eder: 11111011 -5 : 11111011 (2’s complement gösterim). 48

İki 2’s complement sayının toplaması 5 ile -5 nasıl toplanır? 5 = 0000 0101

İki 2’s complement sayının toplaması 5 ile -5 nasıl toplanır? 5 = 0000 0101 -5 = 1111 1011 5 + (-5) = 1 0000 Son 8 bit dikkate alınırsa, sonuç beklendiği gibi 0 bulunur. 49