8086 Programlama – Kısım IV Stack’ler, Makro’lar

Slides:



Advertisements
Benzer bir sunumlar
X86 Assembly Programlama Dilinde
Advertisements

Bilgisayar Programlama I
Fonksiyonlar.
Bölüm 12 ÜST DÜZEY KONULAR Dinamik Bellek Ayırma Önişlemci
Programming 8086 – Kısım II Program Akışı ve Döngüler
Neler Öğreneceksiniz ? Windows ve temel bileşenleri,
Kesmeler (Interrupts)
Siber Güvenlik Danışmanı
METODLAR Program yazarken bazı durumlarda bir işi gerçekleştiren kod yapılarını tekrar tekrar yazmak durumunda kaldığımız olur. Bu kodları yeniden yazmak.
TEKNOLOJİ FAKÜLTESİ MEKATRONİK MÜHENDİSLİĞİ BÖLÜMÜ
Değişken Bildirimleri
Numbers of Opcodes Nihal Güngör.
BTEP 203 – İnternet ProgramcIlIğI - I
Javascript Oğuz İNAL.
C++ STACK SINIFI.
MATLAB’ de Programlama
Fonksiyonlar ve Alt Programlar
KLAVYE EĞİTİMİ.
BUYRUK İşlem kodu İşlemci yazacı veri
PIC 16F84 ile ALT PROGRAMLARIN ve ÇEVRİM TABLOLARININ KULLANIMI
NESNE TABANLI PROGRAMLAMA -METOTLAR-
8051 MİKROKONTROLÖR AİLESİ
Register ve Türleri Nihal GÜNGÖR.
Temel Bilgisayar Yapısı ve Devreleri
C++ Temelleri C++ genel amaçlı, nesne tabanlı, yüksek seviye programlama dilidir.
Bilgisayar Organizasyonu
Mikroişlemciler ve Mikrobilgisayarlar
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
DERS 5 PIC 16F84 PROGRAMLAMA.
Bilgisayar Programlama
BPR152 ALGORİTMA VE PROGRAMLAMA - II Öğr. Gör. Bayram AKGÜL
Sistem Çağrıları Proses Kontrol Çağrıları Bellek Yönetim Çağrıları
C# Veri Tipleri ve Değişkenler
C PROGRAMLAMA FONKSİYONLAR Adres ile Fonksiyon Çağırma Pointer (İşaretçiler) ile Fonksiyon Çağırma Rekürsif Fonksiyonlar.
C#’TA DÖNGÜLER onbirc.com/133.
Ram’ı temsil eder. Bu veri tiplerine StackPointer yoluyla ula ş ıldı ğ ı için verinin ba ş langıç adresi, biti ş adresi ve kapladı ğ ı alan bilinmelidir.
LD/LDI LD X0 LDI X0 X0 Y0 X0 Y1 Temel Komutlar
8086 Programlama – Kısım III Prosedürler
Intel 8086 Mimarisi Adresleme Modları
Ali AKMAN Subroutine, Interrupt, LPM BİL325  C Ders - 5.
BSM447 – MOBİL UYGULAMA GELİŞTİRME Öğr. Gör. Nevzat TAŞBAŞI 3. Hafta.
ENDÜSTRİYEL GÖMÜLÜ BİLGİSAYAR SİSTEMLERİ
DERS 4 MİKROİŞLEMCİ PROGRAMLAMA. Dr. Emin Argun Oral, Atatürk Üniversitesi 2008 Ders 4, Slayt 2İÇERİK Yüksek seviyeli programlama dilleri Düşük sevyeli.
Adım Adım Algoritma.
Amaçlar Assembly dilinin genel özelliklerini tanımak
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ı.
Kesmeler (Interrupts)
Programming 8086 – Kısım II Program Akışı ve Döngüler
DERS 5 PIC 16F84 PROGRAMLAMA.
PIC 16F84 ile ALT PROGRAMLARIN ve ÇEVRİM TABLOLARININ KULLANIMI
Bilgisayar Donanım ve Sistem Yazılımı
Bilgisayar Donanım ve Sistem Yazılımı
8086 Programlama – Kısım III Prosedürler
Mikroişlemciler Temel I/O Arayüzleri.
Neler Öğreneceksiniz ? Windows ve temel bileşenleri,
Mikroişlemciler Adresleme Modları.
Bilgisayar Donanım ve Sistem Yazılımı
Cpu Nasıl Çalışır?.
Mikroişlemciler Temel I/O Arayüzleri.
Bilgisayar Donanım ve Sistem Yazılımı
Mikroişlemci Sistemleri
Bilgisayar Donanım ve Sistem Yazılımı
Mikroişlemcili Sistem Tasarımı
MİKROİŞLEMCİLER VE MİKROBİLGİSAYARLAR
MİKROİŞLEMCİLER VE MİKROBİLGİSAYARLAR
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
Sunum transkripti:

8086 Programlama – Kısım IV Stack’ler, Makro’lar Mikroişlemciler 8086 Programlama – Kısım IV Stack’ler, Makro’lar

İçerik Stack’ler Makro’lar

Stack Stack: geçici verilerin tutulduğu bir hafıza alanıdır Stack,  CALL komutu tarafından, geri dönüş adresinin saklanması için çağrılır. RET komutu, stack’ten bu adresi alır. Stack, diğer verilerin geçici olarak saklanması için de kullanılabilir. Stack ile çalışan iki adet komut bulunmaktadır: PUSH - 16 bitlik bir veriyi stack’e yazar. POP -16 bitlik veriyi stack’ten okur.

PUSH PUSH komutunun yapısı: REG: AX, BX, CX, DX, DI, SI, BP, SP PUSH REG PUSH SREG PUSH hafıza PUSH ivedi (80186 ve sonrası işlemcilerde desteklenir) REG: AX, BX, CX, DX, DI, SI, BP, SP SREG: DS, ES, SS, CS hafıza: [BX], [BX+SI+7], 16 bit değişken, vb. ivedi: 5, -24, 3Fh, 10001101b, vb.

POP POP komutunun yapısı: REG: AX, BX, CX, DX, DI, SI, BP, SP POP REG POP SREG POP hafıza REG: AX, BX, CX, DX, DI, SI, BP, SP SREG: DS, ES, SS, (CS hariç) hafıza: [BX], [BX+SI+7], 16 bit değişken, vb.

LIFO Stack, LIFO (Last In First Out – Son Giren İlk Çıkar) algoritmasını kullanır. Bunun anlamı şudur: Eğer 1, 2, 3, 4, 5 değerlerini stack’e yazar isek, ilk önce 5, sonra 4, sonra 3, sonra 2, sonra 1 çıkar.

Stack’i kullanmak Aynı sayıda push ve pop komutu kullanmak önemlidir. Aksi durumda, stack kullanılamaz duruma gelebilir ve işletim sistemine dönmek imkansız hale gelebilir. PUSH ve POP komutları, özellikle, kullanmaya hazır register sayısı az olduğu durumlarda çok işe yarar: Orijinal değer stack’e kaydedilir. Register, başka amaçlar için kullanılır. Stack’ten register’da bulunan orijinal değer geri yüklenir.

Basit bir stack örneği ORG 100h MOV AX, 1234h PUSH AX ; AX değerini stack’e yaz. MOV AX, 5678h ; AX değerini değiştir. POP AX ; AX’in orijinal değerini geri yükle. RET END

Stack kullanarak değer değiştirmek ORG 100h MOV AX, 1234h ; AX’e 1234h kaydet. MOV BX, 5678h ; BX’e 5678h kaydet. PUSH AX ; AX değerini stack’te kaydet. PUSH BX ; BX değerini stack’te kaydet. POP AX ; BX’in orijinal değerin AX’e kaydet. POP BX ; AX’in orijinal değerini BX’e kaydet. RET END

SS ve SP Stack hafıza alanı, SS (Stack Segment) ve SP(Stack Pointer) register’ları ile belirlenir. Genellikle, işletim sistem, bu register’ların ilk değerlerini, program başladığında atar. Halihazırda SS:SP ile gösterilen adrese, stack’in başlangıç adresi ismi verilir. COM dosyaları için, stack segment, kod segment’i ile aynıdır. Ayrıca, SP 0FFFEh olarak atanır. SS:SP adresinde, programın sonundaki RET komutunun döneceği adres belirtilmiştir. Stack işlemlerini, emülatör penceresinde [Stack] yazılı butona basarak görebilirsiniz. Stack’in başlangıç adresi, "<" işareti ile gösterilir.

PUSH ve POP "PUSH kaynak" komutu aşağıdaki işlemleri gerçekleştirir: SP register’ının değerini 2 azalt. Kaynak‘ta belirtilen değeri, SS:SP adresine yaz. "POP hedef" komutu aşağıdaki işlemleri gerçekleştirir: SS:SP’de bulunan değeri, hedef’e yaz. SP register’ının değerini 2 arttır.

Stack’in ilk durumu (Stack’in başlangıç adresi) SP FFFF AX 1234H FFFE BX 5678H FFFD FFFC FFFB FFFA … SS 0000

PUSH AX komutundan sonra FFFF AX 1234H FFFE BX 5678H (Stack’in başlangıç adresi) SP 12 FFFD 34 FFFC FFFB FFFA … SS 0000

PUSH BX komutundan sonra FFFF AX 1234H FFFE BX 5678H 12 FFFD 34 FFFC (Stack’in başlangıç adresi) SP 56 FFFB 78 FFFA … SS 0000

POP AX komutundan sonra FFFF AX 5678H FFFE BX 5678H (Stack’in başlangıç adresi) SP 12 FFFD 34 FFFC 56 FFFB 78 FFFA … SS 0000

POP BX komutundan sonra (Stack’in başlangıç adresi) SP FFFF AX 5678H FFFE BX 1234H 12 FFFD 34 FFFC 56 FFFB 78 FFFA … SS 0000

Makro’lar Makro’lar prosedürler gibidir. Aslında tam olarak aynı değillerdir. Makro’lar, prosedürler ile aynı görünürler, ancak sadece kodunuz compile edilene kadar bulunurlar. Compile edildikten sonra, tüm makro’lar, gerçek komutlar ile değiştilirler. Eğer bir makro tanımlanmış fakat kodunuzda hiç kullanılmamış ise, compiler o makro’yu ihmal edecektir.

Macro Tanımı isim MACRO [parametreler,...] <komutlar> ENDM

Prosedürlerin aksine, makro’lar, kodun üst kısmında tanımlanırlar. MyMacro MACRO p1, p2, p3 MOV AX, p1 MOV BX, p2 MOV CX, p3 ENDM ORG 100h MyMacro 1, 2, 3 MyMacro 4, 5, DX RET Soldaki kod, aşağıdaki şekle dönüşür: MOV AX, 00001h MOV BX, 00002h MOV CX, 00003h MOV AX, 00004h MOV BX, 00005h MOV CX, DX

Makro’lar ve Prosedürler Prosedürü çağırmak gerektiğinde, CALL komutu kullanılmalıdır, örneğin: CALL MyProc Makro kullanılacağı zaman, sadece ismini yazmak yeterlidir. Örneğin: MyMacro Prosedürlere parametre göndermek için, stack veya genel amaçlı register’lar kullanılmalıdır. Makrolara parametre göndermek için, makro isminden sonra yazılmaları gereklidir. Örneğin: MyMacro 1, 2, 3

Makro’lar ve Prosedürler Makro’lar ENDM ile Prosedürler ise ENDP ile bitirilirler. Prosedürler, belirli bir hafıza adresinde bulunurlar, ancak makro’lar ise, program içerisinde bir koda dönüştürülürler.

Makro’lardaki etiketler Makro’lar, kod içerisinde aynen dönüştürülürler. Bu yüzden, eğer makro tanımı içerisinde etiket bulunur ve makro birden fazla kullanılır ise, "Duplicate declaration" (Çoklu tanımlama) hatası alınabilir. Bu problemin önüne geçmek için, LOCAL komutundan sonra, değişkenler, etiketler veya prosedür isimleri kullanılabilir.

Örnek MyMacro2 MACRO LOCAL label1, label2 CMP AX, 2 JE label1 CMP AX, 3 JE label2 label1: INC AX label2: ADD AX, 2 ENDM ORG 100h MyMacro2 RET