Assembly dilinin temel bileşenleri ve komut yapısı. Montaj dili komutlarının veri formatı ve yapısı. "Sistem programlama" disiplininde

Giriiş.

Kaynak programın yazıldığı dile denir giriş dil ve işlemci tarafından yürütülmek üzere çevrildiği dil izin günlerinde dil. Giriş dilini çıkış diline dönüştürme işlemine ne ad verilir? yayın.İşlemciler, programlama için kullanılmayan ikili makine dilinde programları yürütme yeteneğine sahip olduğundan, tüm kaynak programların çevirisi gereklidir. Bilinen iki yol yayınlar: derleme ve yorumlama.

Şu tarihte: derleme kaynak program ilk olarak çıkış dilindeki eşdeğer bir programa tamamen çevrilir. nesne programlanır ve daha sonra çalıştırılır. Bu işlem özel bir cihaz kullanılarak gerçekleştirilir. programlar, isminde derleyici. Giriş dilinin, ikili kodların makine (çıkış) dilini temsil eden sembolik bir form olduğu bir derleyiciye denir. montajcı.

Şu tarihte: yorumlar Kaynak programdaki metnin her satırı analiz edilir (yorumlanır) ve içinde belirtilen komut anında yürütülür. Bu yöntemin uygulanmasına görev verilmiştir. tercüman programı. Yorumlama uzun zaman alır. Verimliliğini artırmak için, her satırı işlemek yerine, yorumlayıcı ilk olarak tüm satırları dönüştürür. takım karakter dizileri (

). Oluşturulan sembol dizisi, orijinal programa atanan işlevleri gerçekleştirmek için kullanılır.

Aşağıda tartışılan montaj dili derleme kullanılarak uygulanır.

Dilin özellikleri.

Montajcının ana özellikleri:

● dil, ikili kodlar yerine sembolik adlar kullanır - anımsatıcılar.Örneğin, toplama komutu için (

) anımsatıcılar kullanılır

Çıkarmalar (

çarpma işlemi (

Bölümler (

vb. Sembolik adlar aynı zamanda hafıza hücrelerini adreslemek için de kullanılır. Assembly dilinde programlamak için ikili kodlar ve adresler yerine yalnızca çeviricinin ikili kodlara çevirdiği sembolik adları bilmeniz gerekir;

her ifade karşılık gelir bir makine komutu(kod), yani bir montaj dili programındaki makine komutları ve operatörler arasında bire bir yazışma vardır;

● dil erişim sağlar tüm nesnelere ve takımlar. Yüksek seviyeli diller bu yeteneğe sahip değildir. Örneğin, montaj dili bayrak kaydının bitlerini ve üst düzey dili (örneğin,

) bu yeteneğe sahip değildir. Sistem programlama dillerinin (örneğin C) genellikle ara bir konumda yer aldığını unutmayın. Erişilebilirlik açısından, montaj diline daha yakındırlar ancak üst düzey bir dilin sözdizimine sahiptirler;

● derleme dili evrensel bir dil değildir. Her spesifik mikroişlemci grubunun kendi birleştiricisi vardır. Yüksek seviyeli dillerde bu dezavantaj yoktur.

Üst düzey dillerin aksine, montaj dilinde bir program yazmak ve hata ayıklamak çok zaman alır. Buna rağmen montaj dili, geniş kullanım aşağıdaki durumlardan dolayı:

● Assembly dilinde yazılmış bir programın boyutu önemli ölçüde daha küçüktür ve üst düzey bir dilde yazılmış bir programdan çok daha hızlı çalışır. Bazı uygulamalar için bu göstergeler birincil rol oynar; örneğin birçok sistem programı (derleyiciler dahil), kredi kartı programları, cep telefonları, aygıt sürücüleri vb.;

● bazı prosedürler gerektirir tam erişim yüksek seviyeli bir dilde yapılması genellikle imkansız olan donanıma. Bu durum, işletim sistemlerindeki kesintileri ve kesinti işleyicilerinin yanı sıra yerleşik gerçek zamanlı sistemlerdeki aygıt denetleyicilerini de içerir.

Çoğu programda, toplam kodun yalnızca küçük bir yüzdesi, programın yürütme süresinin büyük bir yüzdesinden sorumludur. Tipik olarak programın %1'i yürütme süresinin %50'sinden ve programın %10'u yürütme süresinin %90'ından sorumludur. Bu nedenle, gerçek koşullarda belirli bir program yazmak için hem assembler hem de üst düzey dillerden biri kullanılır.

Montaj dilinde operatör formatı.

Bir montaj dili programı, her biri ayrı bir satırda yer alan ve dört alan içeren komutların (ifadeler, cümleler) bir listesidir: bir etiket alanı, bir işlem alanı, bir işlenen alanı ve bir yorum alanı. Her alanın ayrı bir sütunu vardır.

Etiket alanı.

Sütun 1, etiket alanı için ayrılmıştır. Etiket, sembolik bir ad veya tanımlayıcıdır. adresler hafıza. Aşağıdakileri yapabilmeniz için gereklidir:

● komuta koşullu veya koşulsuz geçiş yapmak;

● verilerin saklandığı konuma erişim kazanın.

Bu tür ifadeler bir etiketle sağlanır. Bir adı belirtmek için İngilizce alfabenin (büyük) harfleri ve sayıları kullanılır. Adın başında bir harf ve sonunda iki nokta ayırıcı bulunmalıdır. İki nokta üst üste etiketi ayrı bir satıra yazılabilir ve işlem kodu 2. sütunda bir sonraki satıra yazılabilir, bu da derleyicinin işini kolaylaştırır. İki nokta üst üste işaretinin olmaması, ayrı satırlarda yer almaları durumunda bir etiketin işlem kodundan ayırt edilmesine izin vermez.

Montaj dilinin bazı versiyonlarında, iki nokta üst üste veri etiketlerinden sonra değil, yalnızca talimat etiketlerinden sonra yerleştirilir ve etiketin uzunluğu 6 veya 8 karakterle sınırlı olabilir.

Etiket komut adresleriyle ilişkili olduğundan etiket alanında aynı adlar olmamalıdır. Programın yürütülmesi sırasında bellekten bir komut veya veri çağırmaya gerek yoksa, etiket alanı boş kalır.

İşlem kodu alanı.

Bu alan bir komut veya sözde komut için anımsatıcı kodu içerir (aşağıya bakın). Komutun anımsatıcı kodu dil geliştiricileri tarafından seçilir. Montaj dilinde

bellekten bir kayıt yüklemek için anımsatıcı seçildi

) ve kaydın içeriğini belleğe kaydetmek için - bir anımsatıcı

). Montaj dillerinde

her iki işlem için sırasıyla aynı adı kullanabilirsiniz

Anımsatıcı adların seçimi keyfi olabiliyorsa, iki makine talimatı kullanma ihtiyacı işlemci mimarisi tarafından belirlenir.

Kayıtların anımsatıcıları aynı zamanda çevirici sürümüne de bağlıdır (Tablo 5.2.1).

İşlenen alanı.

Burada bulunan Ek Bilgiler işlemi gerçekleştirmek için gereklidir. Atlama komutlarının işlenen alanında, atlamanın yapılması gereken adresin yanı sıra makine komutunun işlenenleri olan adresler ve kayıtlar da gösterilir. Örnek olarak 8 bitlik işlemciler için kullanılabilecek işlenenleri veriyoruz.

● sayısal veriler,

farklı sayı sistemlerinde sunulmaktadır. Kullanılan sayı sistemini belirtmek için sabitin ardından Latin harflerinden biri gelir: B,

Buna göre ikili, sekizli, onaltılık, ondalık sayı sistemleri (

Yazmanıza gerek yok). Onaltılı sayının ilk basamağı A, B, C ise,

Daha sonra önüne önemsiz bir 0 (sıfır) eklenir;

● dahili mikroişlemci kayıtlarının ve bellek hücrelerinin kodları

A, B, C harfleri biçiminde M (bilgi kaynakları veya alıcıları),

M veya herhangi bir sayı sistemindeki adresleri (örneğin, 10B - kayıt adresi

ikili sistemde);

● tanımlayıcılar,

uçakların kayıt çiftleri için,

İlk harfler B,

N; bir çift akümülatör ve özellik kaydı için -

; program sayacı için -

;yığın işaretçisi için -

● işlenenlerin adreslerini veya koşullu komuttaki sonraki talimatları gösteren etiketler

(koşul yerine getirilirse) ve koşulsuz geçişlerÖrneğin, komuttaki M1 işleneni

adresi etiket alanında M1 tanımlayıcısıyla işaretlenmiş olan komuta koşulsuz geçiş ihtiyacı anlamına gelir;

● ifadeler,

aritmetik ve mantıksal operatörler kullanılarak yukarıda tartışılan verilerin bağlanmasıyla oluşturulur. Veri alanı ayırma yönteminin dil sürümüne bağlı olduğunu unutmayın. Assembly dili geliştiricileri

Kelimeyi tanımlayın) ve daha sonra girildi Alternatif seçenek.

bu en başından beri işlemcilerin dilindeydi

Dil sürümünde

kullanılmış

Bir sabit tanımlayın).

İşlemciler farklı uzunluktaki işlenenleri işler. Bunu tanımlamak için montajcı geliştiriciler farklı kararlar aldılar, örneğin:

Farklı uzunluklardaki II kayıtları farklı adlara sahiptir: EAX - 32 bitlik işlenenleri yerleştirmek için (tip

); AX - 16 bit için (tip

ve AN - 8 bit için (tip

● işlemciler için

Her işlem koduna son ekler eklenir: sonek

Tip için

; tür için ".B" son eki

farklı uzunluklardaki işlenenler için farklı işlem kodları kullanılır; örneğin bir bayt, yarım kelime (

) ve kelimeleri işlem kodlarını kullanarak 64 bitlik bir kayıt defterine aktarın

sırasıyla.

Yorumlar alanı.

Bu alan programın eylemleri hakkında açıklamalar sağlar. Yorumlar programın çalışmasını etkilemez ve insanlara yöneliktir. Bir programı değiştirmek gerekebilir, bu tür yorumlar olmadan deneyimli programcılar için bile tamamen anlaşılmaz olabilir. Yorum bir sembolle başlar ve programları açıklamak ve belgelemek için kullanılır. Bir yorumun başlangıç ​​karakteri şöyle olabilir:

● şirketin işlemcilerine yönelik dillerde noktalı virgül (;)

Ünlem işareti(!) için dillerde

Her ayrı yorum satırının önünde bir baş karakter bulunur.

Sözde komutlar (yönergeler).

Montaj dilinde iki ana komut türü vardır:

temel işlemci makine koduna eşdeğer olan talimatlar. Bu komutlar programın amaçladığı tüm işlemleri gerçekleştirir;

sözde komutlar veya direktifler, Bir programın kod birleşimi diline çevrilme sürecine hizmet etmek için tasarlanmıştır. Örnek olarak tabloda. 5.2.2 birleştiriciden gelen bazı sözde komutları gösteriyor

aile için

.

Programlama sırasında algoritmaya göre aynı komut zincirinin birçok kez tekrarlanması gereken durumlar vardır. Bu durumdan kurtulmak için şunları yapabilirsiniz:

● meydana geldiğinde gerekli komut dizisini yazın. Bu yaklaşım programın hacminin artmasına yol açar;

● bu sırayı bir prosedür (alt program) halinde düzenleyin ve gerekirse onu çağırın. Bu çıktının dezavantajları vardır: her seferinde özel bir prosedür çağırma komutunu ve bir geri dönüş komutunu yürütmek zorunda kalırsınız; bu, eğer dizi kısaysa ve sık kullanılıyorsa, programın hızını büyük ölçüde azaltabilir.

En basit ve etkili yöntem bir komut zincirinin tekrar tekrar tekrarlanması, makro, bir programda sıklıkla bulunan bir grup komutu yeniden çevirmek için tasarlanmış sözde komut olarak temsil edilebilir.

Bir makro veya makro komut üç açıdan karakterize edilir: makro tanım, makro ters çevirme ve makro uzantı.

Makro tanımı

Bu, program metninde referans olarak kullanılan, tekrar tekrar tekrarlanan program komutları dizisinin bir tanımıdır.

Makro tanımı aşağıdaki yapıya sahiptir:

İfadelerin listesi; Makro tanımı

Verilen makro tanım yapısında üç bölüm ayırt edilebilir:

● başlık

adı da içeren makro

Sözde komut

ve bir dizi parametre;

● noktalarla işaretlenmiştir vücut makro;

● ekip

mezuniyet

makro tanımlar.

Makro tanımı parametre seti, seçilen talimat grubu için işlenen alanında verilen tüm parametrelerin bir listesini içerir. Bu parametreler programda daha önce verilmişse, makro tanımı başlığında belirtilmelerine gerek yoktur.

Seçilen komut grubunu yeniden birleştirmek için addan oluşan bir itiraz kullanılır

makro komutları ve diğer değerlerle birlikte parametrelerin listesi.

Derleyici, derleme işlemi sırasında bir makro tanımıyla karşılaştığında, bunu makro tanım tablosunda saklar. İsmin programdaki sonraki görünümlerinde (

) bir makronun, birleştirici onu makronun gövdesiyle değiştirir.

Bir makro adının işlem kodu olarak kullanılmasına denir makro-tersine çevirme(makro çağrısı) ve onu makronun gövdesiyle değiştirmek - makro genişleme.

Bir program bir karakter dizisi (harfler, sayılar, boşluklar, noktalama işaretleri ve yeni bir satıra geçmek için satırbaşları) olarak temsil ediliyorsa, makro genişletme, bu dizideki bazı zincirlerin diğer zincirlerle değiştirilmesinden oluşur.

Makro genişletme, programın yürütülmesi sırasında değil, derleme işlemi sırasında gerçekleşir. Karakter dizilerini işlemeye yönelik yöntemler şuralara atanır: makro anlamına gelir.

Montaj işlemi gerçekleştirilir iki geçişte:

● İlk geçişte tüm makro tanımları korunur ve makro çağrıları genişletilir. Bu durumda orijinal program okunur ve tüm makro tanımlarının kaldırıldığı ve her makro çağrısının yerine makro gövdesinin yerleştirildiği bir programa dönüştürülür;

● ikinci geçiş, ortaya çıkan programı makrolar olmadan işler.

Parametreli makrolar.

Parametreleri farklı değerler alabilen tekrarlanan komut dizileriyle çalışmak için makro tanımları sağlanmıştır:

● ile gerçek makro çağrısının işlenen alanına yerleştirilen parametreler;

● ile resmi parametreler. Makro genişletme sırasında, makronun gövdesinde görünen her resmi parametre, karşılık gelen gerçek parametreyle değiştirilir.

parametrelerle makrolar kullanma.

Program 1 iki benzer komut dizisini içerir, ancak ilkinin P ve P'yi değiştirmesi bakımından farklılık gösterir.

Ve ikinci

Program 2, iki resmi parametre P1 ve P2'ye sahip bir makro içerir. Makro genişletme sırasında, makro gövdesindeki her P1 karakteri, ilk gerçek parametreyle (P,

) ve P2 simgesinin yerini ikinci gerçek parametre (

) 1 numaralı programdan. Makro çağrısında

program 2 işaretlenmiştir: P,

İlk gerçek parametre,

İkinci gerçek parametre.

Program 1

Program 2

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P,EBX MOV P2,EAX

Genişletilmiş yetenekler

Bazı gelişmiş dil özelliklerine bakalım

Koşullu atlama komutu ve atlanacak etiketi içeren bir makro iki veya daha fazla kez çağrılırsa, etiket kopyalanacaktır (yinelenen etiket sorunu), bu da hataya neden olacaktır. Bu nedenle her çağrıya parametre olarak (programcı tarafından) ayrı bir etiket atanır. dilde

etiket yerel olarak bildirildi (

) ve gelişmiş yetenekler sayesinde, birleştirici, makro her genişletildiğinde otomatik olarak farklı bir etiket oluşturur.

diğer makroların içindeki makroları tanımlamanıza olanak tanır. Bu gelişmiş özellik, bir programın koşullu bağlanmasıyla birlikte çok kullanışlıdır. Hadi düşünelim

IF WORDSSIZE GT 16 M2 MAKRO

M2 makrosu bildirimin her iki bölümünde de tanımlanabilir

Ancak tanım, programın hangi işlemciye monte edildiğine bağlıdır: 16 bit veya 32 bit. M1 çağrılmazsa, M2 makrosu hiçbir şekilde tanımlanmayacaktır.

Bir diğer gelişmiş özellik ise makroların kendileri de dahil olmak üzere diğer makroları çağırabilmesidir. özyinelemeli Arama. İkinci durumda, sonsuz bir döngüden kaçınmak için makronun kendisine her genişlemede değişen bir parametre iletmesi gerekir ve ayrıca kontrol etmek Bu parametreyi kullanın ve parametre belirli bir değere ulaştığında özyinelemeyi sonlandırın.

Montajcıda makro araçların kullanımı üzerine.

Makroları kullanırken, derleyicinin iki işlevi gerçekleştirebilmesi gerekir: makro tanımlarını kaydet Ve Makro zorlukları genişletin.

Makro tanımlarını kaydetme.

Tüm makro adları bir tabloda saklanır. Her ismin yanında, gerektiğinde çağrılabilmesi için karşılık gelen makroyu gösteren bir işaretçi bulunur. Bazı montajcıların makro adları için ayrı bir tablosu vardır, diğerlerinin ise makro adlarıyla birlikte tüm makine talimatlarının ve direktiflerinin yer aldığı genel bir tablosu vardır.

Montaj sırasında bir makroyla karşılaşıldığında yaratıldı:

yeni tablo öğesi makronun adı, parametre sayısı ve makro gövdesinin saklanacağı başka bir makro tanım tablosuna işaret eden bir işaretçi;

● liste resmi parametreler.

Basitçe bir karakter dizisinden oluşan makronun gövdesi daha sonra okunur ve makro tanım tablosunda saklanır. Döngünün gövdesinde meydana gelen biçimsel parametreler işaretlenmiştir özel karakter.

Bir makronun dahili temsili

program 2 için yukarıdaki örnekten (s. 244):

MOV EAX, MOV EBX, MOV MOV &

noktalı virgül satırbaşı karakteri olarak kullanılır ve ve işareti & resmi parametre karakteri olarak kullanılır.

Makro çağrılarını genişletme.

Montaj sırasında bir makro tanımıyla karşılaşıldığında, bu makro tablosunda saklanır. Bir makro çağrıldığında, birleştirici geçici olarak giriş cihazından giriş verilerini okumayı durdurur ve saklanan makro gövdesini okumaya başlar. Makro gövdeden çıkarılan resmi parametreler, gerçek parametrelerle değiştirilir ve çağrı tarafından sağlanır. Ve işareti & öncesi parametreleri, montajcının bunları tanımasını sağlar.

Montajcının birçok versiyonu olmasına rağmen montaj süreçleri ortak özelliklere sahiptir ve birçok yönden benzerdir. İki geçişli bir montajcının çalışması aşağıda tartışılmaktadır.

İki geçişli birleştirici.

Bir program bir dizi ifadeden oluşur. Bu nedenle, montaj sırasında aşağıdaki eylem sırasını kullanabileceğiniz anlaşılıyor:

● bunu makine diline çevirmek;

● elde edilen makine kodunu bir dosyaya ve listenin karşılık gelen kısmını başka bir dosyaya aktarın;

● programın tamamı tercüme edilene kadar listelenen prosedürleri tekrarlayın.

Ancak bu yaklaşım etkili değildir. Bir örnek sözde sorundur ileri bağlantı. Eğer ilk ifade programın en sonunda yer alan P ifadesine bir geçiş ise, o zaman çevirici bunu tercüme edemez. Öncelikle P operatörünün adresini belirlemeli ve bunu yapmak için programın tamamını okumalıdır. Kaynak programın her tam okunmasına denir. geçit.İki geçiş kullanarak ileri bağlantı sorununu nasıl çözebileceğinizi gösterelim:

ilk geçişte yapmalısın TOPLAMAK ve tüm sembol tanımlarını (etiketler dahil) tabloda saklayın ve ikinci geçişte her operatörü okuyup birleştirin. Bu yöntem nispeten basittir ancak orijinal programdan ikinci geçiş, G/Ç işlemlerine harcanan ek süreyi gerektirir;

● ilk geçişte şunları yapmalısınız: dönüştürmek programı ara forma dönüştürüp bir tabloya kaydedin ve ikinci geçişi orijinal programa göre değil tabloya göre yapın. Bu birleştirme yöntemi, ikinci geçişte G/Ç işlemlerini gerçekleştirmediğinden zaman tasarrufu sağlar.

İlk geçiş.

İlk pas golü- bir sembol tablosu oluşturun. Yukarıda belirtildiği gibi, ilk geçişin diğer bir amacı da tüm makro tanımlarını korumak ve çağrıları göründükleri gibi genişletmektir. Sonuç olarak, hem sembol tanımı hem de makro genişletme tek geçişte gerçekleşir. Sembol şunlardan biri olabilir: etiket, veya Anlam,-you yönergesi kullanılarak belirli bir adın atandığı:

;Değer - arabellek boyutu

Birleştirici, komut etiketi alanındaki sembolik adlara anlam atayarak, esas olarak programın yürütülmesi sırasında her komutun sahip olacağı adresleri belirtir. Bu amaçla montajcı, montaj işlemi sırasında depolar talimat adres sayacı(

) özel bir değişken olarak. İlk geçişin başlangıcında, özel değişkenin değeri 0'a ayarlanır ve işlenen her komuttan sonra o komutun uzunluğu kadar artırılır. Örnek olarak tabloda. 5.2.3, komutların uzunluğunu ve sayaç değerlerini gösteren bir program parçasını gösterir. İlk geçişte tablolar oluşturulur sembolik isimler, direktifler Ve işlem kodları, ve gerekirse gerçek masa. Bir değişmez değer, derleyicinin otomatik olarak belleği ayırdığı bir sabittir. Modern işlemcilerin doğrudan adreslere sahip talimatlar içerdiğini, dolayısıyla bunların derleyicilerinin değişmez değerleri desteklemediğini hemen belirtelim.

Sembol Adı Tablosu

her isim için bir öğe içerir (Tablo 5.2.4). Sembolik ad tablosunun her öğesi, adın kendisini (veya ona işaret eden bir işaretçiyi), sayısal değerini ve bazen aşağıdakileri içerebilecek bazı ek bilgileri içerir:

● sembolle ilişkili veri alanının uzunluğu;

● bellek yeniden tahsis bitleri (programın derleyicinin amaçladığı adresten farklı bir adrese yüklenmesi durumunda bir sembolün değerinin değişip değişmeyeceğini gösterir);

● sembole prosedür dışından erişilip erişilemeyeceğine ilişkin bilgi.

Sembolik adlar etiketlerdir. Operatörler kullanılarak belirtilebilirler (örneğin,

Direktif tablosu.

Bu tablo, bir programı derlerken karşılaşılan tüm yönergeleri veya sözde komutları listeler.

İşlem kodu tablosu.

Her işlem kodu için tabloda ayrı sütunlar bulunur: işlem kodu tanımı, işlenen 1, işlenen 2, işlem kodunun onaltılık değeri, komut uzunluğu ve komut türü (Tablo 5.2.5). İşlem kodları işlenenlerin sayısına ve türüne bağlı olarak gruplara ayrılır. Komut türü grup numarasını belirler ve o gruptaki tüm komutları işlemek için çağrılan prosedürü belirtir.

İkinci geçiş.

İkinci pasın golü- bir nesne programının oluşturulması ve gerekirse montaj protokolünün yazdırılması; Bağlayıcının farklı zamanlarda bir araya getirilen prosedürleri tek bir yürütülebilir dosyaya bağlaması için gerekli çıktı bilgileri.

İkinci geçişte (ilk geçişte olduğu gibi) ifadelerin bulunduğu satırlar tek tek okunur ve işlenir. Orijinal operatör ve ondan onaltılı olarak türetilen çıkış operatörü nesne Kod yazdırılabilir veya daha sonra yazdırmak üzere bir ara belleğe yerleştirilebilir. Komut adres sayacını sıfırladıktan sonra komut çağrılır sonraki ifade.

Kaynak programda hatalar bulunabilir, örneğin:

verilen sembol tanımlanmamış veya birden fazla tanımlanmış;

● işlem kodu geçersiz bir adla temsil ediliyor (yazım hatası nedeniyle), yeterli sayıda işlenen yok veya çok fazla işlenen var;

● operatör yok

Bazı montajcılar tanımlanmamış bir sembolü tespit edip değiştirebilir. Ancak çoğu durumda bir hata bildirimiyle karşılaştığında montajcı ekranda bir hata mesajı görüntüler ve montaj işlemine devam etmeye çalışır.

Assembly diline adanmış makaleler.

ÖZBEKİSTAN ULUSAL ÜNİVERSİTESİNE MİRZO ULUGBEK'İN ADI VERİLDİ

BİLGİSAYAR TEKNOLOJİSİ FAKÜLTESİ

Konuyla ilgili: Bir EXE dosyasının anlamsal ayrıştırılması.

Tamamlanmış:

Taşkent 2003.

Önsöz.

Assembly dili ve komut yapısı.

EXE dosya yapısı (anlamsal ayrıştırma).

COM dosya yapısı.

Virüsün etki ve yayılma prensibi.

Demonte edici.

Programlar.

Önsöz

Bir programcının mesleği şaşırtıcı ve benzersizdir. Günümüzde bilimi ve yaşamı son teknoloji olmadan hayal etmek imkansızdır. İnsan faaliyetiyle ilgili her şey onsuz yapılamaz bilgisayar Teknolojisi. Bu da onun yüksek gelişimine ve mükemmelliğine katkıda bulunur. Kişisel bilgisayarların gelişimi çok uzun zaman önce başlamamış olsa da bu süre zarfında yazılım ürünlerinde çok büyük adımlar atıldı ve bu ürünler uzun süre yaygın olarak kullanılacaktır. Bilgisayarla ilgili bilgi alanı, ilgili teknoloji gibi bir patlama yaşadı. Ticari tarafı dikkate almazsak, bu mesleki faaliyet alanında yabancıların olmadığını söyleyebiliriz. Pek çok insan kâr veya gelir elde etmek için değil, kendi özgür iradesiyle, tutkuyla programlar geliştiriyor. Elbette bu, programın kalitesini etkilememelidir ve bu işte, tabiri caizse, kaliteli uygulama, istikrarlı çalışma ve tüm modern gereksinimlerin karşılanması için rekabet ve talep vardır. Burada, 60'lı yıllarda çok sayıda lamba setinin yerini alan mikroişlemcilerin ortaya çıkışına da dikkat çekmek gerekiyor. Birbirinden çok farklı bazı mikroişlemci türleri vardır. Bu mikroişlemciler bit derinlikleri ve yerleşik sistem komutları bakımından birbirlerinden farklılık gösterir. En yaygın olanları şunlardır: Intel, IBM, Celeron, AMD, vb. Tüm bu işlemciler Intel işlemcilerin gelişmiş mimarisiyle ilgilidir. Mikrobilgisayarların yaygınlaşması, iki ana nedenden dolayı montaj diline yönelik tutumların yeniden değerlendirilmesine neden oldu. Birincisi, montaj dilinde yazılan programlar önemli ölçüde daha az bellek ve yürütme süresi gerektirir. İkinci olarak, montaj dili ve bunun sonucunda ortaya çıkan makine kodu bilgisi, makinenin mimarisinin anlaşılmasını sağlar ve bu, yüksek seviyeli bir dilde çalışırken sağlanması pek olası değildir. Çoğu yazılım profesyoneli, program yazarken daha kolay olan Pascal, C veya Delphi gibi üst düzey dillerde geliştirme yapsa da, en güçlü ve etkili olanı yazılım tamamen veya kısmen montaj dilinde yazılmıştır. Yüksek seviyeli diller özel kullanımdan kaçınmak için tasarlandı teknik özellikler belirli bilgisayarlar. Ve montaj dili de işlemcinin belirli özelliklerine göre tasarlanmıştır. Bu nedenle, belirli bir bilgisayara yönelik montaj dili programı yazabilmek için mimarisini bilmeniz gerekir. Bu günlerde ana manzara yazılım ürünü bir EXE dosyasıdır. Düşünen olumlu taraflar Bu, programın yazarının programın bütünlüğünden emin olabileceği anlamına gelir. Ancak çoğu zaman bu durumdan çok uzaktır. Ayrıca bir sökücü var. Bir sökücü kullanarak kesintileri ve program kodlarını bulabilirsiniz. Montajcı konusunda bilgili bir kişinin tüm programı kendi zevkine göre yeniden düzenlemesi zor olmayacaktır. Belki de en çözülmez sorunun ortaya çıktığı yer burasıdır - virüs. İnsanlar neden virüs yazıyor? Bazıları bu soruyu şaşkınlıkla, bazıları öfkeyle soruyor ama yine de bu işle zarar verme açısından değil, sistem programlamayla ilgilenen insanlar var. Virüsler tarafından yazılmıştır çeşitli sebepler. Bazıları sistem çağrılarını sever, bazıları ise montajcı bilgisini geliştirir. Bütün bunları yazımda açıklamaya çalışacağım. ders çalışması. Ayrıca sadece EXE dosyasının yapısı hakkında değil aynı zamanda montaj dili hakkında da bilgi veriyor.

^ Montaj Dili.

İlk bilgisayarların ortaya çıkışından günümüze kadar programcıların montaj dili hakkındaki fikirlerinin dönüşümünü takip etmek ilginçtir.

Bir zamanlar montaj, bir bilgisayarın yararlı hiçbir şey yapmasını sağlayamayacağınız bir dildi. Yavaş yavaş durum değişti. Bir bilgisayarla iletişim kurmanın daha uygun yolları ortaya çıktı. Ancak diğer dillerden farklı olarak assembler ölmedi, üstelik bunu prensipte de yapamazdı. Neden? Bir cevap bulmak için genel olarak montaj dilinin ne olduğunu anlamaya çalışalım.

Kısacası montaj dili, makine dilinin sembolik bir temsilidir. En düşük donanım seviyesindeki bir makinedeki tüm işlemler yalnızca makine dili komutları (talimatları) tarafından yönlendirilir. Buradan, ortak isme rağmen montaj dilinin her bilgisayar türü için farklı olduğu açıktır. Bu aynı zamanda geçerlidir dış görünüş Assembly dilinde yazılmış programlar ve bu dilin yansıması olan fikirler.

Donanımla ilgili (veya dahası, bir programın hızının arttırılması gibi donanıma bağlı) sorunları, çevirici bilgisi olmadan gerçek anlamda çözmek imkansızdır.

Bir programcı veya başka bir kullanıcı herhangi bir üst düzey aracı, hatta sanal dünyalar oluşturmaya yönelik programları kullanabilir ve hatta belki de bilgisayarın aslında programın yazıldığı dilin komutlarını değil, bunların dönüştürülmüş temsillerini yürüttüğünden şüphelenmeyebilir. tamamen farklı bir dilden - makine dilinden - sıkıcı ve donuk komut dizileri şeklinde. Şimdi böyle bir kullanıcının standart olmayan bir sorunu olduğunu veya bir şeyin yolunda gitmediğini hayal edelim. Örneğin, programı alışılmadık bir cihazla çalışmalı veya bilgisayar donanımının çalışma prensipleri hakkında bilgi gerektiren başka eylemler gerçekleştirmelidir. Programcı ne kadar akıllı olursa olsun, harika programını yazdığı dil ne kadar iyi olursa olsun, çevirici bilgisi olmadan yapamaz. Ve hemen hemen tüm yüksek seviyeli dil derleyicilerinin, modüllerini montajcı modüllere bağlama veya montaj programlama düzeyine erişimi destekleme araçları içermesi tesadüf değildir.

Elbette bilgisayar uzmanlarının zamanı çoktan geçti. Dedikleri gibi, enginliği kucaklayamazsınız. Ancak ortak bir nokta var; ciddi bir bilgisayar eğitiminin üzerine inşa edildiği bir tür temel. Bu, bu bilginin bir yansıması ve somutlaşmış hali olarak bilgisayarın işleyişinin ilkeleri, mimarisi ve montaj dili hakkındaki bilgidir.

Tipik bir modern bilgisayar (i486 veya Pentium tabanlı) aşağıdaki bileşenlerden oluşur (Şekil 1).

Pirinç. 1. Bilgisayar ve çevre birimleri

Pirinç. 2. Blok şeması kişisel bilgisayar

Şekilden (Şekil 1) bilgisayarın, her biri sistem birimi adı verilen bir birime bağlı olan birkaç fiziksel cihazdan oluştuğu görülebilir. Mantıklı düşünürsek bir nevi koordinasyon aracı görevi üstlendiği açıktır. Sistem biriminin içine bakalım (monitörün içine girmeye çalışmanıza gerek yok - orada ilginç bir şey yok ve ayrıca tehlikelidir): kasayı açın ve bazı panoları, blokları, bağlantı kablolarını görün. İşlevsel amaçlarını anlamak için tipik bir bilgisayarın blok şemasına bakalım (Şekil 2). Mutlak doğruluk iddiasında değildir ve yalnızca modern bir kişisel bilgisayarın öğelerinin amacını, ara bağlantısını ve tipik bileşimini göstermeyi amaçlamaktadır.

Şekil 2'deki diyagramı tartışalım. 2. Biraz alışılmadık bir tarzda.
Bir kişinin yeni bir şeyle karşılaştığında bilinmeyeni anlamasına yardımcı olabilecek bazı çağrışımlar araması yaygındır. Bilgisayar hangi çağrışımları çağrıştırıyor? Mesela ben çoğu zaman bir bilgisayarı kişinin kendisi ile ilişkilendiririm. Neden?

İnsan bilgisayarı yarattığında, derinlerde bir yerde kendisine benzer bir şey yarattığını düşünüyordu. Bilgisayarda dış dünyadan bilgi almak için organlar bulunur: klavye, fare ve manyetik disk sürücüleri. İncirde. 2 bu organlar sistem veriyollarının sağında bulunur. Bilgisayarda alınan bilgileri "sindiren" organlar vardır - bunlar İşlemci ve RAM. Ve son olarak bilgisayarda, işlemenin sonuçlarını üreten konuşma organları bulunur. Bunlar aynı zamanda sağdaki cihazlardan bazılarıdır.

Modern bilgisayarlar elbette insan olmaktan uzaktır. Dış dünyayla geniş ama sınırlı sayıda koşulsuz refleks düzeyinde etkileşime giren yaratıklarla karşılaştırılabilirler.
Bu refleks seti, bir makine komutları sistemi oluşturur. Bir bilgisayarla ne kadar yüksek düzeyde iletişim kurarsanız kurun, sonuçta sıkıcı ve monoton makine komutları dizisi ortaya çıkar.
Her makine komutu, bir veya daha fazla koşulsuz refleksi uyarmak için bir tür uyarıcıdır. Bu uyarıya verilen tepki her zaman nettir ve mikro program biçimindeki mikro komut bloğunda "donanımla bağlantılıdır". Bu mikro program, bir makine komutunu uygulamaya yönelik eylemleri gerçekleştirir, ancak bu, belirli komutlara sağlanan sinyaller düzeyindedir. mantık bilgisayar, böylece bilgisayarın çeşitli alt sistemlerini kontrol eder. Bu, mikroprogram kontrolünün sözde prensibidir.

Bir kişiyle benzetmeyi sürdürerek şunu not ediyoruz: Bir bilgisayarın düzgün bir şekilde beslenmesi için birçok işletim sistemi, yüzlerce programlama dili için derleyiciler vb. icat edildi, ancak hepsi aslında üzerinde sadece bir tabak var. yiyecek (programlar) belli kurallara göre iletilir, mideye (bilgisayar). Yalnızca bilgisayarın midesi diyeti, monoton yiyecekleri sever - ona, kombinasyonları makine dilini oluşturan, kesin olarak düzenlenmiş sıfırlar ve birler dizileri biçiminde yapılandırılmış bilgiler verir.

Böylece, dışarıdan çok dilli olmasına rağmen bilgisayar yalnızca tek bir dili anlar: makine talimatlarının dilini. Elbette, bir bilgisayarla iletişim kurmak ve çalışmak için bu dili bilmek gerekli değildir, ancak hemen hemen her profesyonel programcı er ya da geç onu inceleme ihtiyacıyla karşı karşıya kalır. Neyse ki, programcının çeşitli ikili sayı kombinasyonlarının anlamını kavramaya çalışması gerekmiyor, çünkü 50'li yıllarda programcılar programlama için montaj dili adı verilen sembolik bir makine dili analoğunu kullanmaya başladılar. Bu dil, makine dilinin tüm özelliklerini doğru bir şekilde yansıtmaktadır. Bu nedenle üst düzey dillerden farklı olarak montaj dili her bilgisayar türü için farklıdır.

Yukarıdakilerin hepsinden, montaj dili bir bilgisayar için "yerel" olduğundan, en etkili programın ancak bu programda yazılabileceği sonucuna varabiliriz (nitelikli bir programcı tarafından yazılması şartıyla). Burada küçük bir "ama" var: Bu, çok fazla dikkat ve pratik deneyim gerektiren, çok emek yoğun bir süreçtir. Bu nedenle, gerçekte, esas olarak montajcıda aşağıdakileri sağlaması gereken programlar yazıyorlar: etkili çalışma donanım ile. Bazen yürütme süresi veya bellek tüketimi açısından kritik olan program bölümleri çeviricide yazılır. Daha sonra bunlar altprogramlar şeklinde resmileştirilir ve üst düzey bir dildeki kodla birleştirilir.

Herhangi bir bilgisayarın montaj dilini öğrenmeye ancak bilgisayarın hangi bölümünün bu dilde programlama için görünür ve erişilebilir bırakıldığını öğrendikten sonra başlamak mantıklıdır. Bu, programcı tarafından kullanılabilen, bir dereceye kadar 32 kayıt içeren mikroişlemci program modelinin bir parçası olan sözde bilgisayar programı modelidir.

Bu kayıtlar iki büyük gruba ayrılabilir:

^ 16 kullanıcı kaydı;

16 sistem kaydı.

Assembly dili programları kayıtları çok yoğun bir şekilde kullanır. Çoğu kaydın belirli bir işlevsel amacı vardır.

Adından da anlaşılacağı gibi kullanıcı kayıtları kullanıcı kayıtları olarak adlandırılır çünkü programcı programlarını yazarken bunları kullanabilir. Bu kayıtlar şunları içerir (Şekil 3):

Programcılar tarafından verileri ve adresleri depolamak için kullanılabilen sekiz adet 32 ​​bitlik kayıt (genel amaçlı kayıtlar (GPR) olarak da adlandırılır):

altı bölüm kaydı: cs, ds, ss, es, fs, gs;

durum ve kontrol kayıtları:

Bayraklar, bayrakları/bayrakları kaydeder;

Komut işaretçisi kaydı eip/ip.

Pirinç. 3. i486 ve Pentium mikroişlemcilerin kullanıcı kayıtları

Bu kayıtların çoğu neden eğik çizgiyle gösteriliyor? Hayır, bunlar farklı yazmaçlar değil; bunlar büyük bir 32 bitlik yazmacın parçaları. Programda ayrı nesneler olarak kullanılabilirler. Bu, i8086'dan başlayarak Intel mikroişlemcilerin daha genç 16 bit modelleri için yazılan programların işlevselliğini sağlamak için yapıldı. i486 ve Pentium mikroişlemcileri çoğunlukla 32 bitlik kayıtlara sahiptir. Segment kayıtları hariç sayıları i8086'nınkiyle aynıdır, ancak boyutları daha büyüktür, bu da tanımlamalarına yansır - onlar
e öneki (Genişletilmiş).

^ Genel amaçlı kayıtlar
Bu gruptaki tüm kayıtlar “alt” kısımlarına erişmenizi sağlar (bkz. Şekil 3). Bu şekle bakıldığında, bu kayıtların yalnızca alt 16 ve 8 bitlik kısımlarının kendi kendine adresleme için kullanılabileceğini unutmayın. Bu kayıtların üstteki 16 biti bağımsız nesneler olarak mevcut değildir. Bu, yukarıda belirttiğimiz gibi, Intel mikroişlemcilerin daha genç 16 bit modelleriyle uyumluluk için yapıldı.

Genel amaçlı kaydediciler grubuna ait kayıtları listeleyelim. Bu kayıtlar fiziksel olarak bir aritmetik mantık biriminin (ALU) içindeki mikroişlemcide bulunduğundan, bunlara ALU kayıtları da denir:

eax/ax/ah/al (Akümülatör kaydı) - pil.
Ara verileri depolamak için kullanılır. Bazı komutlar bu yazmacın kullanılmasını gerektirir;

ebx/bx/bh/bl (Temel kayıt) - temel kayıt.
Bazı nesnelerin temel adresini bellekte saklamak için kullanılır;

ecx/cx/ch/cl (Sayma kaydı) - sayaç kaydı.
Bazı tekrarlayan eylemleri gerçekleştiren ekiplerde kullanılır. Kullanımı genellikle ilgili komutun algoritmasında örtülü ve gizlidir.
Örneğin, bir döngü döngüsü düzenleme komutu, kontrolü belirli bir adreste bulunan bir komuta aktarmanın yanı sıra, ecx/cx kaydının değerini analiz eder ve birer birer azaltır;

edx/dx/dh/dl (Veri kaydı) - veri kaydı.
Tıpkı eax/ax/ah/al kaydı gibi ara verileri saklar. Bazı komutlarda kullanımı zorunludur; Bazı komutlar için bu örtülü olarak gerçekleşir.

Aşağıdaki iki kayıt, zincir işlemlerini, yani her biri 32, 16 veya 8 bit uzunluğunda olabilen öğe zincirlerini sırayla işleyen işlemleri desteklemek için kullanılır:

esi/si (Kaynak Dizini kaydı) - kaynak dizini.
Zincirleme işlemlerdeki bu kayıt, kaynak zincirindeki öğenin geçerli adresini içerir;

edi/di (Hedef Dizin kaydı) - alıcının (alıcı) dizini.
Zincirleme işlemlerde bu kayıt, hedef zincirdeki geçerli adresi içerir.

Mikroişlemci mimarisinde yığın gibi bir veri yapısı donanım ve yazılım düzeyinde desteklenir. Yığınla çalışmak için mikroişlemci talimat sisteminde özel komutlar vardır ve mikroişlemci yazılım modelinde bunun için özel kayıtlar vardır:

esp/sp (Yığın İşaretçisi kaydı) - yığın işaretçisi kaydı.
Geçerli yığın bölümündeki yığının tepesine yönelik bir işaretçi içerir.

ebp/bp (Temel İşaretçi kaydı) - yığın çerçevesi temel işaretçi kaydı.
Yığın içindeki verilere rastgele erişimi düzenlemek için tasarlanmıştır.

Yığın, rastgele verilerin geçici olarak depolanmasına yönelik bir program alanıdır. Elbette veriler bir veri segmentinde de saklanabilir, ancak bu durumda geçici olarak saklanan her veri için ayrı bir adlandırılmış bellek hücresi oluşturulmalıdır, bu da programın boyutunu ve kullanılan ad sayısını artırır. Yığının rahatlığı, alanının yeniden kullanılabilir olması ve yığında veri depolama ve oradan almanın herhangi bir isim belirtmeden etkili push ve pop komutları kullanılarak yapılmasında yatmaktadır.
Yığın geleneksel olarak, örneğin bir altyordamı çağırmadan önce bir program tarafından kullanılan kayıtların içeriğini kaydetmek için kullanılır; bu da işlemci kayıtlarını "kendi amaçları için" kullanır. Altprogram döndükten sonra yazmaçların orijinal içerikleri yığından çıkarılır. Diğer bir yaygın teknik, ihtiyaç duyduğu parametreleri yığın aracılığıyla bir alt programa iletmektir. Parametrelerin yığına hangi sırayla yerleştirildiğini bilen alt program, bunları oradan alıp yürütme sırasında kullanabilir. Ayırt edici özellik Yığın, içindeki verilerin alındığı benzersiz bir sıradır: herhangi bir zamanda yığında yalnızca en üstteki öğe bulunur; öğe en son yığına itildi. Yığından en üstteki öğeyi çıkarmak bir sonraki öğeyi kullanılabilir hale getirir. Yığın elemanları, yığının en altından (yani maksimum adresinden) başlayarak, sırayla azalan adreslerde, yığına ayrılan bellek alanında bulunur. Üstteki erişilebilir elemanın adresi SP yığın işaretçisi kaydında saklanır. Program belleğinin diğer herhangi bir alanı gibi, yığının da bir bölümün parçası olması veya ayrı bir bölüm oluşturması gerekir. Her iki durumda da, bu bölümün bölüm adresi bölüm yığın kaydı SS'ye yerleştirilir. Böylece, SS:SP yazmaç çifti, erişilebilir bir yığın hücresinin adresini tanımlar: SS, yığının bölüm adresini saklar ve SP, yığında depolanan son verinin ofsetini saklar (Şekil 4, a). Başlangıç ​​durumunda yığın işaretçisinin SP, yığının altında yer alan ve ona dahil olmayan bir hücreye işaret ettiğini unutmayın.

Şekil 4. Yığın organizasyonu: a - başlangıç ​​durumu, b - bir öğe yüklendikten sonra (bu örnekte, AX kaydının içeriği), c - ikinci öğe yüklendikten sonra (DS kaydının içeriği), d - bir öğeyi boşalttıktan sonra eleman, e - iki elemanın yükünü kaldırdıktan ve orijinal durumuna döndükten sonra.

Yığına yükleme, yığınla çalışmak için özel bir komutla (itme) gerçekleştirilir. Bu komut önce yığın işaretçisinin içeriğini 2 azaltır ve ardından işleneni SP'deki adrese yerleştirir. Örneğin, AX kaydının içeriğini yığında geçici olarak saklamak istiyorsak, şu komutu çalıştırmalıyız:

Yığın Şekil 2'de gösterilen duruma girer. 1.10, b. Yığın işaretçisinin iki bayt yukarıya (daha düşük adreslere doğru) kaydırıldığı ve push komutunda belirtilen işlenenin bu adrese yazıldığı görülmektedir. Aşağıdaki yığın yükleme komutu örn.

yığını Şekil 2'de gösterilen duruma koyacaktır. 1.10, c. Yığın artık iki öğeyi saklayacak ve yalnızca yığın işaretçisi SP tarafından gösterilen en üstteki öğeye erişilebilecek. Bir süre sonra yığında depolanan kayıtların orijinal içeriğini geri yüklememiz gerekirse, yığından boşaltmak için pop (push) komutlarını uygulamamız gerekir:

pop DS
patlatma baltası

Yığın ne kadar büyük olmalı? Programda ne kadar yoğun kullanıldığına bağlıdır. Örneğin yığında 10.000 baytlık bir dizi depolamayı planlıyorsanız yığının en az bu boyutta olması gerekir. Bazı durumlarda, özellikle int 21h kesme komutunu çalıştırırken yığının sistem tarafından otomatik olarak kullanıldığı unutulmamalıdır. Bu komutla işlemci önce dönüş adresini yığına iter, ardından DOS kayıtların içeriğini ve kesintiye uğrayan programla ilgili diğer bilgileri yığına iter. Bu nedenle, bir program hiç yığın kullanmasa bile programda mevcut olmalı ve en az birkaç düzine kelime boyutunda olmalıdır. İlk örneğimizde yığına 128 kelime ayırdık ki bu da kesinlikle yeterli.

^ Bir montajcı programının yapısı

Bir derleme dili programı, bellek bölümleri adı verilen bellek bloklarının bir koleksiyonudur. Bir program bu tür bir veya daha fazla blok bölümünden oluşabilir. Her bölüm, her biri ayrı bir program kodu satırını kaplayan bir dil cümleleri koleksiyonu içerir.

Dört tür assembler ifadesi vardır:

makine komutlarının sembolik analogları olan komutlar veya talimatlar. Çeviri işlemi sırasında, çevirici talimatları mikroişlemci talimat setinin karşılık gelen komutlarına dönüştürülür;

makro komutlar - belirli bir şekilde biçimlendirilmiş, yayın sırasında başka cümlelerle değiştirilen program metninin cümleleri;

Montajcı çevirmeninin belirli eylemleri gerçekleştirmesi için talimatlar olan direktifler. Direktiflerin makine temsilinde karşılığı yoktur;

Rus alfabesinin harfleri de dahil olmak üzere herhangi bir karakter içeren yorum satırları. Yorumlar çevirmen tarafından dikkate alınmaz.

^ Derleme sözdizimi

Bir programı oluşturan cümleler bir komuta, makroya, yönergeye veya açıklamaya karşılık gelen sözdizimsel bir yapı olabilir. Çeviricinin bunları tanıyabilmesi için belirli sözdizimsel kurallara göre oluşturulmaları gerekir. Bunu yapmak için dilbilgisi kuralları gibi dilin sözdiziminin resmi bir tanımını kullanmak en iyisidir. Bir programlama dilini bu şekilde tanımlamanın en yaygın yolları sözdizimi diyagramları ve genişletilmiş Backus-Naur formlarıdır. İçin pratik kullanım sözdizimi diyagramları daha kullanışlıdır. Örneğin, montaj dili ifadelerinin sözdizimi, aşağıdaki şekillerde gösterilen sözdizimi diyagramları kullanılarak açıklanabilir.

Pirinç. 5. Derleme cümle formatı

Pirinç. 6. Yönerge formatı

Pirinç. 7. Komutların ve makroların formatı

Bu resimlerde:

etiket adı - değeri, belirlediği programın kaynak kodundaki cümlenin ilk baytının adresi olan bir tanımlayıcı;

isim - bu yönergeyi aynı adı taşıyan diğer yönergelerden ayıran bir tanımlayıcı. Montajcının belirli bir direktifi işlemesi sonucunda, bu isme belirli özellikler atanabilir;

bir işlem kodu (OPC) ve bir direktif, karşılık gelen makine talimatı, makro talimatı veya çevirmen direktifi için anımsatıcı sembollerdir;

işlenenler, üzerinde eylemlerin gerçekleştirileceği nesneleri belirten bir komut, makro veya birleştirici yönergesinin parçalarıdır. Montaj dili işlenenleri, sayısal ve metin sabitleri içeren ifadelerle, etiketlerle ve operatör işaretlerini kullanan değişken tanımlayıcılarla ve bazı ayrılmış sözcüklerle tanımlanır.

^ Sözdizimi diyagramları nasıl kullanılır? Çok basit: Tek yapmanız gereken, diyagramın girişinden (solda) çıkışına (sağda) kadar olan yolu bulup takip etmektir. Böyle bir yol mevcutsa, cümle veya yapı sözdizimsel olarak doğrudur. Böyle bir yol yoksa derleyici bu yapıyı kabul etmeyecektir. Söz dizimi diyagramlarıyla çalışırken oklarla gösterilen geçiş yönüne dikkat edin, çünkü yollar arasında sağdan sola doğru takip edilebilecek yollar olabilir. Özünde sözdizimi diyagramları, programın giriş cümlelerini ayrıştırırken çevirmenin işleminin mantığını yansıtır.

Program metni yazarken kabul edilebilir karakterler şunlardır:

Tüm edebiyat: A-Z, a-z. Bu durumda büyük ve küçük harfler eşdeğer kabul edilir;

0'dan 9'a kadar sayılar;

İşaretler ?, @, $, _, &;

Ayırıcılar, . ()< > { } + / * % ! " " ? \ = # ^.

Montaj dili cümleleri, çevirmen için anlamlı olan geçerli dil sembollerinin sözdizimsel olarak ayrılamaz dizileri olan sözcük birimlerinden oluşur.

Sözcük birimleri şunlardır:

tanımlayıcılar, işlem kodları, değişken adları ve etiket adları gibi program nesnelerini belirtmek için kullanılan geçerli karakter dizileridir. Tanımlayıcıları yazmanın kuralı şu şekildedir: Bir tanımlayıcı bir veya daha fazla karakterden oluşabilir. Sembol olarak Latin alfabesindeki harfleri, sayıları ve bazı özel karakterleri (_, ?, $, @) kullanabilirsiniz. Bir tanımlayıcı rakam karakteriyle başlayamaz. Tanımlayıcının uzunluğu en fazla 255 karakter olabilir, ancak çevirmen yalnızca ilk 32 karakteri kabul eder ve gerisini göz ardı eder. Seçeneği kullanarak olası tanımlayıcıların uzunluğunu ayarlayabilirsiniz. Komut satırı mv. Ek olarak, çevirmene büyük ve küçük harfler arasında ayrım yapması veya aralarındaki farkı göz ardı etmesi talimatını vermek de mümkündür (bu, varsayılan olarak yapılır).

^Assembler komutları.

Assembler komutları, mantıksal karşılaştırmalar ve program organizasyonu için bir programdaki kontrolü (döngüler ve geçişler) aktarmaya yönelik bir mekanizma olan gereksinimlerinizi bilgisayara aktarma yeteneğini ortaya çıkarır. Ancak programlanabilir görevler nadiren bu kadar basittir. Çoğu program, belirli bir gereksinim karşılanana kadar çeşitli komutların tekrarlandığı bir dizi döngü ve çeşitli eylemlerden hangisinin gerçekleştirilmesi gerektiğini belirleyen çeşitli kontroller içerir. Bazı talimatlar, talimat işaretçisindeki ofset değerini doğrudan değiştirerek adımların normal sırasını değiştirerek kontrolü aktarabilir. Daha önce de belirttiğimiz gibi farklı işlemciler için farklı komutlar mevcut ancak 80186, 80286 ve 80386 işlemciler için bazı komutlara bakacağız.

Belirli bir komutu yürüttükten sonra bayrakların durumunu tanımlamak için, eflags bayrak kaydının yapısını yansıtan tablodan bir seçim kullanacağız:

Bu tablonun alt satırı, komut yürütüldükten sonra bayrakların değerlerini gösterir. Aşağıdaki gösterimler kullanılır:

1 - komut yürütüldükten sonra bayrak ayarlanır (1'e eşit);

0 - komut yürütüldükten sonra bayrak sıfırlanır (0'a eşit);

r - bayrağın değeri komutun sonucuna bağlıdır;

Komut yürütüldükten sonra bayrak tanımlanmaz;

boşluk - komut yürütüldükten sonra bayrak değişmez;

Sözdizimi diyagramlarında işlenenleri temsil etmek için aşağıdaki gösterim kullanılır:

r8, r16, r32 - bayt boyutu, kelime veya çift kelime kayıtlarından birindeki işlenen;

m8, m16, m32, m48 - bellek işlenen boyutu bayt, kelime, çift kelime veya 48 bit;

i8, i16, i32 - anlık işlenen boyutu baytı, kelime veya çift kelime;

a8, a16, a32 - kod bölümündeki göreceli adres (ofset).

Komutlar (alfabetik sırayla):

*Bu komutlar detaylı olarak anlatılmıştır.

EKLEMEK
(Ek)

Ek

^ Komut diyagramı:

hedef, kaynak ekle

Amaç: bayt, kelime veya çift kelime boyutunda iki kaynak ve hedef işlenenin eklenmesi.

Çalışma algoritması:

kaynak ve hedef işlenenleri ekleyin;

toplama sonucunu alıcıya yazın;

bayrakları ayarlayın.

Komutun yürütülmesinden sonraki bayrakların durumu:

Başvuru:
Add komutu iki tamsayı işleneni eklemek için kullanılır. Toplamanın sonucu ilk işlenenin adresine yerleştirilir. Eklemenin sonucu alıcı işleneninin sınırlarını aşarsa (bir taşma meydana gelirse), cf bayrağı ve ardından adc komutunun olası kullanımı analiz edilerek bu durum dikkate alınmalıdır. Örnek olarak ax yazmacı ve ch hafıza alanındaki değerleri toplayalım. Eklerken taşma olasılığını dikkate alın.

Kayıt artı kayıt veya hafıza:

|000000dw|modregr/rm|

AX kaydı (AL) artı anlık değer:

|0000010w|--data--|veri eğer w=1|

Kayıt veya hafıza artı anlık değer:

|100000sw|mod000r/m|--data--|veri eğer BW=01|

ARAMA
(ARAMA)

Bir prosedürü veya görevi çağırma

^ Komut diyagramı:

Amaç:

dönüş noktasının adresinin yığın üzerinde saklanmasıyla kontrolün yakın veya uzak bir prosedüre aktarılması;

görevleri değiştirme.

Çalışma algoritması:
işlenen türüne göre belirlenir:

Etikete yakın - eip/ip komut işaretçisinin içeriği yığına itilir ve etikete karşılık gelen yeni adres değeri aynı kayda yüklenir;

Uzak etiketi - eip/ip ve cs komut işaretçisinin içerikleri yığına aktarılır. Daha sonra uzak etikete karşılık gelen yeni adres değerleri aynı kayıtlara yüklenir;

R16, 32 veya m16, 32 - kontrolün aktarıldığı geçerli talimat bölümündeki ofsetleri içeren bir kayıt veya bellek hücresini tanımlar. Kontrol aktarıldığında, eip/ip komut işaretçisinin içeriği yığına aktarılır;

Bellek işaretçisi - çağrılan prosedüre yönelik 4 veya 6 baytlık bir işaretçi içeren bir bellek konumunu tanımlar. Böyle bir işaretçinin yapısı 2+2 veya 2+4 bayttır. Böyle bir işaretçinin yorumlanması mikroişlemcinin çalışma moduna bağlıdır:

^ Komutun yürütülmesinden sonraki bayrakların durumu (görev değiştirme hariç):

komutun yürütülmesi bayrakları etkilemez

Bir görev değiştirildiğinde bayrak değerleri, geçiş yapılan görevin TSS durum bölümündeki eflags kaydı hakkındaki bilgilere göre değiştirilir.
Başvuru:
Çağrı komutu, dönüş noktasının adresini korurken kontrolün bir alt programa esnek ve çok değişkenli aktarımını düzenlemenize olanak tanır.

Nesne kodu (dört format):

Bir segmentte doğrudan adresleme:

|11101000|düşük görüntü|yüksek-yüksek|

Bir segmentte dolaylı adresleme:

|11111111|mod010r/m|

Segmentler arasında dolaylı adresleme:

|11111111|mod011r/m|

Segmentler arasında doğrudan adresleme:

|10011010|ofset-düşük|offset-yüksek|seg-düşük|seg-yüksek|

CMP
(İşlenenleri karşılaştırın)

İşlenen karşılaştırması

^ Komut diyagramı:

cmp işlenen1, işlenen2

Amaç: iki işlenenin karşılaştırılması.

Çalışma algoritması:

çıkarma işlemini gerçekleştirin (işlenen1-işlenen2);

sonuca bağlı olarak bayrakları ayarlayın, işlenen1 ve işlenen2'yi değiştirmeyin (yani sonucu hatırlamayın).

Başvuru:
Bu komutİşlenenleri değiştirmeden iki işleneni çıkarma yoluyla karşılaştırmak için kullanılır. Komutun sonuçlarına göre bayraklar ayarlanır. Cmp komutu, koşullu atlama komutları ve setcc bayt değere göre ayarla komutuyla birlikte kullanılır.

Nesne kodu (üç format):

Kayıt veya kayıt ile hafıza:

|001110dw|modregr/m|

AX (AL) kaydıyla anlık değer:

|0011110w|--data--|veri eğer w=1|

Kayıt veya hafıza ile anlık değer:

|100000sw|mod111r/m|--data--|sw=0 ise veriler|

Aralık
(İşleneni 1'e kadar azalt)

Bir işleneni bir azaltmak

^ Komut diyagramı:

aralık işleneni

Amaç: Bellekteki veya kayıttaki bir işlenenin değerini 1 azaltın.

Çalışma algoritması:
komut işlenenden 1'i çıkarır. Komutun yürütülmesinden sonraki bayrakların durumu:

Başvuru:
Dec komutu hafızadaki bir byte, word, double word veya yazmacın değerini birer azaltmak için kullanılır. Ancak komutun cf bayrağını etkilemediğini unutmayın.

Kayıt ol: |01001reg|

^ Kayıt veya hafıza: |1111111w|mod001r/m|

DIV
(DIVide imzasız)

İmzasız bölüm

Takım özeti:

div bölücü

Amaç: İki işaretsiz ikili değer arasında bölme işlemi gerçekleştirmek.

^ Çalışma algoritması:
Komut iki işlenen gerektirir: bölen ve bölen. Bölünme dolaylı olarak belirtilir ve büyüklüğü, komutta belirtilen bölenin boyutuna bağlıdır:

bölenin boyutu bir bayt ise, o zaman temettü balta kaydında bulunmalıdır. İşlemden sonra bölüm al'a, geri kalan ah'a yerleştirilir;

eğer bölen bir kelime boyutundaysa, o zaman bölen dx:ax kayıt çiftinde yer almalı ve bölenin düşük dereceli kısmı ax'te yer almalıdır. İşlemden sonra bölüm ax'e, geri kalan ise dx'e yerleştirilir;

eğer bölen çift kelime boyutundaysa, o zaman bölen edx:eax kayıt çiftinde yer almalıdır ve bölenin düşük dereceli kısmı eax'te bulunmalıdır. İşlemden sonra bölüm eax'e, geri kalan ise edx'e yerleştirilir.

^ Komutun yürütülmesinden sonraki bayrakların durumu:

Başvuru:
Komut, işlenenlerin tamsayı bölümünü gerçekleştirir ve bölümün sonucunu bölüm ve bölümün kalanı olarak üretir. Bir bölme işlemi gerçekleştirirken bir istisna meydana gelebilir: 0 - bölme hatası. Bu durum iki durumdan birinde meydana gelir: bölen 0 olduğunda veya bölüm eax/ax/al kaydına sığmayacak kadar büyük olduğunda.

Nesne kodu:

|1111011w|mod110r/m|

Dahili
(Yarıda kesmek)

Kesinti hizmeti rutininin çağrılması

^ Komut diyagramı:

int kesme_numarası

Amaç: kesme hizmeti rutinini, komut işleneni tarafından belirtilen kesme numarasıyla çağırmak.

^ Çalışma algoritması:

flags yazmacını eflags/flags ve dönüş adresini yığına itin. Bir dönüş adresi yazarken, önce cs bölüm kaydının içeriği, ardından eip/ip komut işaretçisinin içeriği yazılır;

if ve tf bayraklarını sıfıra sıfırlayın;

kontrolü belirtilen numara ile kesme servis programına aktarın. Kontrol aktarım mekanizması mikroişlemcinin çalışma moduna bağlıdır.

^ Komutun yürütülmesinden sonraki bayrakların durumu:

Başvuru:
Söz diziminden görebileceğiniz gibi bu komutun iki biçimi vardır:

int 3 - kendi bireysel işlem kodu 0cch'ye sahiptir ve bir bayt kaplar. Bu durum, çeşitli yazılım hata ayıklayıcılarında, herhangi bir komutun ilk baytını değiştirerek kesme noktaları ayarlamayı çok uygun hale getirir. Komut dizisinde 0cch işlem koduna sahip bir komutla karşılaşan mikroişlemci, yazılım hata ayıklayıcısıyla iletişim kurmaya yarayan 3 vektör numaralı kesme işleme programını çağırır.

Komutun ikinci biçimi iki bayt kaplar, 0cdh işlem koduna sahiptir ve 0-255 aralığında bir vektör numarasıyla bir kesme hizmeti rutinine çağrı başlatmanıza olanak tanır. Belirtildiği gibi kontrol aktarımının özellikleri mikroişlemcinin çalışma moduna bağlıdır.

Nesne kodu (iki format):

Kayıt ol: |01000reg|

^ Kayıt veya hafıza: |1111111w|mod000r/m|

J.C.C.
JCXZ/JECXZ
(Koşul varsa atla)

(CX=Sıfır ise atla/ECX=Sıfır ise atla)

Koşul karşılanırsa atla

CX/ECX sıfırsa atla

^ Komut diyagramı:

jcc etiketi
jcxz etiketi
jecxz etiketi

Amaç: bazı koşullara bağlı olarak mevcut komut bölümü içinde geçiş.

^ Komut algoritması (jcxz/jecxz hariç):
İşlem koduna bağlı olarak bayrakların durumunun kontrol edilmesi (kontrol edilen koşulu yansıtır):

test edilen koşul doğruysa işlenenin gösterdiği hücreye gidin;

kontrol edilen koşul yanlışsa kontrolü bir sonraki komuta aktarın.

jcxz/jecxz komutunun algoritması:
ecx/cx kaydının içeriğinin sıfıra eşit olması koşulunun kontrol edilmesi:

eğer durum kontrol ediliyorsa

Montaj dilinde komut yapısı Makine komutları seviyesinde programlama, bilgisayar programlamanın mümkün olduğu minimum seviyedir. Makine komut sistemi, makine ekipmanlarına talimat vererek gerekli eylemleri gerçekleştirebilecek yeterlilikte olmalıdır. Her makine talimatı iki bölümden oluşur: "ne yapılacağını" belirleyen operasyonel bölüm ve işlem nesnelerini yani "ne yapılacağını" belirleyen bir işlenen. Assembly dilinde yazılmış bir mikroişlemci makine talimatı, aşağıdaki forma sahip tek bir satırdır: etiket komutu/yönerge işlenen(ler)i; yorumlar Etiket, komut/yönerge ve işlenen en az bir boşluk veya sekme karakteriyle ayrılır. Komutun işlenenleri virgüllerle ayrılır.

Montaj Dili Komut Yapısı Bir montajcı komutu, çevirmene mikroişlemcinin hangi eylemi gerçekleştirmesi gerektiğini söyler. Montaj direktifleri, program metninde belirtilen ve montaj işlemini veya çıktı dosyasının özelliklerini etkileyen parametrelerdir. İşlenen, verinin (veri bölümünde) veya üzerinde komut eyleminin gerçekleştirildiği öğelerin (kod bölümünde) başlangıç ​​değerini belirtir. Bir talimatın bir veya iki işleneni olabilir veya hiç işleneni olmayabilir. İşlenenlerin sayısı, talimat kodu tarafından dolaylı olarak belirtilir. Bir komut veya yönergenin bir sonraki satırda devam etmesi gerekiyorsa ters eğik çizgi karakteri kullanılır: "" . Varsayılan olarak, çevirici komutları ve yönergeleri yazarken büyük ve küçük harfler arasında ayrım yapmaz. Direktif ve komut örnekleri Count db 1 ; Ad, yönerge, bir işlenen mov eax, 0 ; Komut, iki işlenen

Tanımlayıcılar, değişken adlarını ve etiket adlarını belirtmek için kullanılan geçerli karakter dizileridir. Tanımlayıcı aşağıdaki karakterlerden bir veya daha fazlasından oluşabilir: Latin alfabesinin tüm harfleri; 0'dan 9'a kadar sayılar; özel karakterler: _, @, $, ? . Etiketin ilk karakteri olarak nokta kullanılabilir. Ayrılmış çevirici adları (yönergeler, operatörler, komut adları) tanımlayıcı olarak kullanılamaz. Tanımlayıcının ilk karakteri bir harf veya özel bir karakter olmalıdır. Maksimum uzunluk Tanımlayıcının 255 karakteri vardır ancak çevirmen ilk 32 karakteri kabul eder ve gerisini göz ardı eder. Assembler direktifi içermeyen bir satıra yazılan tüm etiketlerin iki nokta üst üste ":" ile bitmesi gerekir. Etiket, komut (yönerge) ve işlenenin satırda herhangi bir belirli konumda başlaması gerekmez. Programın daha iyi okunabilmesi için bunları bir sütuna yazmanız önerilir.

Etiketler Assembler yönergesi içermeyen bir satıra yazılan tüm etiketlerin iki nokta üst üste ":" ile bitmesi gerekir. Etiket, komut (yönerge) ve işlenenin satırda herhangi bir belirli konumda başlaması gerekmez. Programın daha iyi okunabilmesi için bunları bir sütuna yazmanız önerilir.

Yorumlar Bir programda yorumların kullanılması, özellikle bir dizi komutun amacının belirsiz olduğu durumlarda programın anlaşılırlığını artırır. Yorumlar kaynak modüldeki herhangi bir satırda noktalı virgülle (;) başlar. "'nin sağındaki tüm karakterler; "Satırın sonunda bir yorum var. Bir yorum, boşluk da dahil olmak üzere yazdırılabilir herhangi bir karakter içerebilir. Bir yorum tüm satırı kapsayabilir veya aynı satırdaki bir komutu takip edebilir.

Assembly Dili Program Yapısı Assembly dilinde yazılmış bir program, her biri bir veya daha fazla veri, yığın ve kod segmentini tanımlayabilen, modül adı verilen birkaç parçadan oluşabilir. Assembly dilindeki herhangi bir tam program, yürütmenin başlayacağı bir ana veya ana modül içermelidir. Modül içerebilir program bölümleri, uygun yönergeler kullanılarak bildirilen veri ve yığın bölümleri.

Bellek modelleri Segmentleri bildirmeden önce, bir yönerge kullanarak bellek modelini belirtmeniz gerekir. MODEL değiştiricisi hafıza_modeli, çağıran_konvansiyon, OS_tipi, yığın_parametresi Montaj dilinin temel hafıza modelleri: Hafıza modeli Kod adresleme Veri adresleme işletim sistemi Kod ve verileri serpiştirme KÜÇÜK YAKIN MS-DOS Kabul Edilebilir KÜÇÜK YAKIN MS-DOS, Windows Hayır ORTA UZAK YAKIN MS-DOS, Windows Hayır KOMPAKT YAKIN UZAK MS-DOS, Windows Hayır BÜYÜK UZAK MS-DOS, Windows Hayır BÜYÜK UZAK MS-DOS, Windows Hayır Windows 2000 YAKIN, Windows XP, Windows Kabul Edilebilir FLAT NEAR NT,

Bellek Modelleri Minik model yalnızca 16 bit MS-DOS uygulamalarında çalışır. Bu modelde tüm veriler ve kodlar tek bir fiziksel segmentte bulunur. Bu durumda program dosyasının boyutu 64 KB'ı geçmez. Küçük model bir kod segmentini ve bir veri segmentini destekler. Bu modeli kullanırken veri ve kod yakın olarak adreslenir. Orta model, birden çok kod bölümünü ve bir veri bölümünü destekler; kod bölümlerindeki tüm referanslar varsayılan olarak uzak olarak kabul edilir ve bir veri bölümündeki referanslar yakın olarak kabul edilir. Kompakt model, uzak veri adresleme (uzak) kullanan çeşitli veri bölümlerini ve yakın adresleme (yakın) kullanan bir kod bölümünü destekler. Büyük model, birden çok kod bölümünü ve birden çok veri bölümünü destekler. Varsayılan olarak kod ve verilere yapılan tüm referanslar uzak olarak kabul edilir. Devasa model neredeyse büyük hafıza modeline eşdeğerdir.

Bellek modelleri Düz model, bölümlere ayrılmamış bir program yapılandırmasını varsayar ve yalnızca 32 bit işletim sistemlerinde kullanılır. Bu model, veri ve kodun tek bir segmentte yer alması nedeniyle minik modele benzer ancak 32 bittir. Direktif öncesi düz modele yönelik bir program geliştirmek. model daire direktiflerinden birini yerleştirmelidir: . 386, . 486, . 586 veya. 686. İşlemci seçim direktifinin seçimi, program yazarken mevcut olan talimat setini belirler. İşlemci seçimi yönergesinden sonra gelen p harfi, korumalı çalışma modu anlamına gelir. Tüm adresler ve işaretçiler 32 bit olduğundan veri ve kod adresleme yakındır.

Bellek modelleri. MODEL değiştiricisi hafıza_modeli, çağıran_konvansiyon, OS_tipi, yığın_parametresi Değiştirici parametresi, segment türlerini tanımlamak için kullanılır ve aşağıdaki değerleri alabilir: 16'yı kullanın (seçili modelin segmentleri 16 bit olarak kullanılır) 32'yi kullanın (seçilen modelin segmentleri kullanılır) 32 bit olarak). Calling_convention parametresi, üst düzey diller (C++, Pascal) dahil olmak üzere diğer dillerden bir prosedür çağrılırken parametrelerin iletilme yöntemini belirlemek için kullanılır. Parametre şu değerleri alabilir: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

Bellek modelleri. MODEL değiştiricisi hafıza_modeli, çağıran_konvansiyon, OS_tipi, yığın_parametresi OS_tipi parametresi varsayılan olarak OS_DOS'tur ve açıktır şu an bu parametre için desteklenen tek değer budur. Stack_parameter parametresi şu şekilde ayarlanır: NEARSTACK (SS kaydı DS'ye eşittir, veri ve yığın alanları aynı fiziksel segmentte bulunur) FARSTACK (SS kaydı DS'ye eşit değildir, veri ve yığın alanları farklı fiziksel segmentlerde bulunur). Varsayılan değer NEARSTACK'tir.

Hiçbir şey yapmayan bir program örneği. 686 P. MODEL DÜZ, STDCALL. VERİ. CODE START: RET END START RET - mikroişlemci komutu. Programın doğru bir şekilde sonlandırılmasını sağlar. Programın geri kalanı çevirmenin çalışmasıyla ilgilidir. . 686 P - Pentium 6 (Pentium II) korumalı mod komutlarına izin verilir. Bu yönerge, işlemci modelini belirterek desteklenen montajcı yönergeleri kümesini seçer. . MODEL FLAT, stdcall - düz bellek modeli. Bu bellek modeli Windows işletim sisteminde kullanılmaktadır. stdcall - kullanılan prosedür çağırma kuralı.

Hiçbir şey yapmayan bir program örneği. 686 P. MODEL DÜZ, STDCALL. VERİ. KOD BAŞLAT: GERİ BİTİR BAŞLAT. VERİ, veri içeren bir program bölümüdür. Bu program yığını kullanmaz, dolayısıyla segment. STACK eksik. . KOD, kod içeren bir program bölümüdür. BAŞLAT - etiket. END START - programın sonu ve derleyiciye programın yürütülmesinin START etiketiyle başlaması gerektiğini belirten bir mesaj. Her program, sonunu işaretlemek için bir END yönergesi içermelidir kaynak kodu programlar. END yönergesini takip eden tüm satırlar dikkate alınmaz.END yönergesinden sonra belirtilen etiket, çevirmene programın yürütülmesinin başlayacağı ana modülün adını bildirir. Program bir modül içeriyorsa, END yönergesinden sonraki etiket çıkartılabilir.

Montaj dili çevirmenleri Çevirmen - program veya teknik araçlar programlama dillerinden birinde temsil edilen bir programı, nesne kodu adı verilen hedef dildeki bir programa dönüştüren programdır. Makine talimatı anımsatıcılarını desteklemenin yanı sıra, her çevirmenin kendi yönergeleri ve makro araçları vardır ve bunlar genellikle başka hiçbir şeyle uyumsuzdur. Başlıca montaj dili çevirmenleri türleri: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - Tomasz Gryshtar (Lehçe) tarafından yazılan, serbestçe dağıtılan çok geçişli bir çevirici, NASM (Netwide Assembler) - ücretsiz Intel x mimarisi 86 için birleştirici, Simon Tatham tarafından Julian Hall ile birlikte oluşturuldu ve şu anda Source'taki küçük bir geliştirici ekibi tarafından geliştiriliyor. Forge. açık.

Src="https://current5.com/sunum/-29367016_63610977/image-15.jpg" alt="Microsoft Visual Studio 2005'te bir programın çevrilmesi 1) Dosya->Yeni-'yi seçerek bir proje oluşturun. >Proje menüsü Ve"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://current5.com/sunum/-29367016_63610977/image-16.jpg" alt="Programın Microsoft Visual Studio 2005'te çevrilmesi 2) Proje ağacında (Görünüm->Çözüm Gezgini) eklemek"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Programın Microsoft Visual Studio 2005'e çevrilmesi 3) Code C++ dosya türünü seçin, ancak uzantıyla birlikte adı belirtin. asm:

Programın Microsoft Visual Studio 2005'e çevrilmesi 5) Derleyici parametrelerini ayarlayın. Proje dosyasındaki Özel Derleme Kuralları menüsüne sağ tıklayın...

Programı Microsoft Visual Studio 2005'e çevirin ve beliren pencerede Microsoft Macro Assembler'ı seçin.

Programın Microsoft Visual Studio 2005'teki çevirisi Merhaba dosyasındaki sağ tuşla kontrol edin. Özellikler menüsünden asm proje ağacını açın ve Genel->Araç: Microsoft Macro Assembler'ı yükleyin.

Src="https://current5.com/sunum/-29367016_63610977/image-22.jpg" alt="Programın Microsoft Visual Studio 2005'te çevrilmesi 6) Build->Build hello'yu seçerek dosyayı derleyin. prj."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Windows İşletim Sisteminde Programlama Windows İşletim Sisteminde programlama, API işlevlerinin (Uygulama Programı Arayüzü, yani yazılım uygulama arayüzü) kullanımına dayanır. Sayıları 2000'e ulaşıyor. Windows programı büyük ölçüde bu tür çağrılardan oluşuyor. ile olan tüm etkileşimler harici cihazlar ve işletim sistemi kaynakları kural olarak bu tür işlevler aracılığıyla oluşur. ameliyathane Windows sistemi Düz bellek modelini kullanır. Herhangi bir bellek hücresinin adresi, 32 bitlik bir yazmacın içeriğine göre belirlenecektir. Windows için 3 tip program yapısı vardır: diyalog (ana pencere diyalogdur), konsol veya penceresiz yapı, klasik yapı (pencereli, çerçeve).

Arama Windows işlevleri API Yardım dosyasında, herhangi bir API işlevi tür işlev_adı (FA 1, FA 2, FA 3) olarak sunulur. Tür – dönüş değeri türü; FAx – resmi argümanların göründükleri sıraya göre listesi. Örneğin, int Mesaj. Box(HWND h.Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Bu işlev bir mesaj ve bir çıkış düğmesi (veya düğmeleri) içeren bir pencere görüntüler. Parametrelerin anlamı: h. Wnd, mesaj penceresinin görüneceği pencerenin tanımlayıcısıdır, lp. Metin - pencerede görünecek metin, lp. Başlık - pencere başlığındaki metin, u. Tür - pencere türü; özellikle çıkış düğmelerinin sayısını belirleyebilirsiniz.

Windows API int Mesaj işlevlerinin çağrılması. Box(HWND h.Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Neredeyse tüm API işlev parametreleri aslında 32 bitlik tam sayılardır: HWND 32 bitlik bir tam sayıdır, LPCTSTR bir dizeye yönelik 32 bitlik bir işaretçidir, UINT 32 bitlik bir tam sayıdır. İşlevin daha yeni sürümlerine geçmek için genellikle işlev adına "A" son eki eklenir.

Windows API int Mesaj işlevlerinin çağrılması. Box(HWND h.Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); MASM kullanırken, adın sonuna @N N eklemelisiniz; bu, iletilen bağımsız değişkenlerin yığında kapladığı bayt sayısıdır. Win 32 API işlevleri için bu sayı, bağımsız değişken sayısı n'nin 4 ile çarpılması (her bağımsız değişkendeki bayt) olarak tanımlanabilir: N=4*n. Bir işlevi çağırmak için çeviricinin CALL komutunu kullanın. Bu durumda, tüm fonksiyon argümanları yığın (PUSH komutu) aracılığıyla ona iletilir. Bağımsız değişkenleri aktarma yönü: SOLDAN SAĞA - ALTTAN YUKARI. İlk olarak u argümanı yığına aktarılacaktır. Tip. Belirtilen işleve yapılan çağrı şu şekilde görünecektir: CALL Mesajı. Kutu. A@16

Windows API int Mesaj işlevlerinin çağrılması. Box(HWND h.Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Herhangi bir API fonksiyonunun yürütülmesinin sonucu genellikle EAX kaydında döndürülen bir tamsayıdır. OFFSET yönergesi bir "bölümdeki ofseti" temsil eder veya üst düzey dil terimleriyle tercüme edilirse, bir satırın başlangıcını gösteren bir "işaretçiyi" temsil eder. EQU direktifi, SI'daki #define gibi bir sabit tanımlar. EXTERN yönergesi çevirmene işlevin veya tanımlayıcının bu modülün dışında olduğunu bildirir.

“Herkese merhaba!” programı örneği . 686 P. MODEL DÜZ, STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 DB "İlk programım", 0 STR 2 DB "Herkese merhaba!", 0 HW DD ? DIŞ Mesaj. Kutu. C@16: YAKIN. KOD BAŞLAT: PUSH MB_OK PUSH OFSET STR 1 PUSH OFSET STR 2 PUSH HW CALL Mesajı. Kutu. A@16 GERİ BİT BAŞLAT

INVOKE yönergesi MASM dil çeviricisi aynı zamanda bir makro aracı - INVOKE yönergesi kullanarak işlev çağrılarını basitleştirmenize olanak tanır: INVOKE işlevi, parametre1, parametre2, ... İşlev çağrısına @16 eklemenize gerek yoktur; parametreler tam olarak fonksiyon açıklamasında verildikleri sıraya göre yazılır. Çeviricinin makro aracılığıyla parametreler yığına yerleştirilir. INVOKE direktifini kullanmak için, PROTO direktifini kullanarak fonksiyon prototipinin açıklamasına şu şekilde sahip olmalısınız: Mesaj. Kutu. A PROTO: DWORD, : DWORD Bir program birçok Win 32 API işlevini kullanıyorsa, include direktifinin kullanılması tavsiye edilir C: masm 32includeuser 32. inc

Konu 2.5 İşlemci programlamanın temelleri

Programın uzunluğu arttıkça çeşitli işlemlerin kodlarını hatırlamak giderek zorlaşır. Anımsatıcılar bu konuda bazı yardımlar sağlar.

Sembolik komut kodlama diline denir montajcı.

Montaj dili her ifadenin tam olarak bir makine komutuna karşılık geldiği bir dildir.

Toplantı bir programın montaj dilinden dönüştürülmesi olarak adlandırılır; yani, işlemlerin sembolik adlarını makine kodlarıyla ve sembolik adresleri mutlak veya göreceli sayılarla değiştirerek makine dilinde bir program hazırlamak, ayrıca kütüphane programlarını dahil etmek ve belirli belirtilerek sembolik talimat dizileri oluşturmak. Mikro takımlardaki parametreler. Bu program genellikle ROM'da bulunur veya bazı harici ortamlardan RAM'e girilir.

Assembly dilini üst düzey dillerden ayıran çeşitli özellikler vardır:

1. Bu, montaj dili ifadeleri ile makine talimatları arasındaki bire bir yazışmadır.

2. Bir montaj dili programcısının, hedef makinede bulunan tüm nesnelere ve talimatlara erişimi vardır.

Makine odaklı dillerde programlamanın temellerini anlamak aşağıdakiler için faydalıdır:



PC mimarisinin daha iyi anlaşılması ve bilgisayarların daha yetkin kullanılması;

Uygulamalı problemlerin çözümüne yönelik programlar için daha rasyonel algoritma yapıları geliştirmek;

Kaynak programların kaybı durumunda, herhangi bir üst düzey dilden derlenen .exe ve .com uzantılı yürütülebilir programları görüntüleme ve düzeltme yeteneği (DEBUG program hata ayıklayıcısında belirtilen programları çağırarak ve derlemede görüntülerini kaynak koda dönüştürerek) dil);

En kritik sorunların çözümüne yönelik programların derlenmesi (makine odaklı bir dilde yazılmış bir program genellikle daha etkilidir - üst düzey dillerden çeviri sonucu elde edilen programlara göre yüzde 30-60 oranında daha kısa ve daha hızlıdır)

Ana programda yer alan prosedürleri, kullanılan üst düzey dilde veya işletim sistemi hizmet prosedürleri kullanılarak uygulanamaması durumunda, ayrı parçalar halinde uygulamak.

Montaj dilindeki bir program yalnızca bir bilgisayar ailesinde çalışabilirken, üst düzey bir dilde yazılmış bir program potansiyel olarak farklı makinelerde çalışabilir.

Montaj dili alfabesi ASCII karakterlerinden oluşur.

Sayılar yalnızca tam sayılardır. Var:

İkili sayılar B harfiyle biter;

D harfiyle biten ondalık sayılar;

Onaltılı sayılar H harfiyle biter.

Veri deposu, kayıtlar, veri sunumu

Belirli bir MP serisi için ayrı bir programlama dili kullanılır - montaj dili.

Montaj dili, makine kodları ile üst düzey diller arasında bir ara konumda bulunur. Bu dilde programlama daha kolaydır. Montaj dilindeki bir program, belirli bir makinenin (daha kesin olarak bir MP'nin) yeteneklerini, yüksek düzeyli bir dildeki (bir programcı için montajcıdan daha basit olan) bir programa göre daha verimli kullanır. MP KR580VM80 için montaj dili örneğini kullanarak makine yönelimli dillerde programlamanın temel ilkelerine bakalım. Dilde programlama yapmak için genel bir metodoloji kullanılır. Programları kaydetmeye yönelik özel teknik teknikler, hedef MP'nin mimari ve komut sisteminin özellikleriyle ilişkilidir.

Yazılım modeli MP KR580VM80 tabanlı mikroişlemci sistemi

Şekil 1'e göre MPS'nin yazılım modeli

MP Bağlantı Noktası Belleği

S Z AC. P C

Resim 1

Programcının bakış açısından MP KR580VM80 aşağıdaki programla erişilebilen kayıtlara sahiptir.

A– 8 bitlik akümülatör kaydı. MP'nin ana kaydıdır. Bir ALU'da gerçekleştirilen herhangi bir işlem, işlenecek işlenenlerden birinin akümülatöre yerleştirilmesini içerir. ALU'daki bir işlemin sonucu da genellikle A'da saklanır.

B, C, D, E, H, L– 8 bitlik genel amaçlı kayıtlar (GPR). İç hafıza Milletvekili. İşlenen bilgilerin yanı sıra operasyonun sonuçlarını depolamak için tasarlanmıştır. 16 bitlik sözcükleri işlerken, kayıtlar BC, DE, HL çiftlerini oluşturur ve çift kayıt ilk harf olarak adlandırılır - B, D, H. Bir kayıt çiftinde en yüksek olan ilk kayıttır. H ve L kayıtları, hem veri depolamak hem de RAM hücrelerinin 16 bitlik adreslerini depolamak için kullanılan özel bir özelliğe sahiptir.

FL– bayrak kaydı (işaret kaydı) MP'de aritmetik ve mantıksal işlemlerin gerçekleştirilmesi sonucunun beş işaretinin saklandığı 8 bitlik kayıt. Resme göre FL formatı

Bit C (CY - taşıma) - taşıma, aritmetik işlemler gerçekleştirirken baytın yüksek sırasından bir taşıma varsa 1'e ayarlanır.

Bit P (eşlik) – eşlik, sonucun bitlerindeki birlerin sayısı çift ise 1'e ayarlanır.

AC rakamı, sonucun düşük dereceli tetradından elde edilen taşıma değerini depolamak için tasarlanmış ek bir taşımadır.

Bit Z (sıfır) – işlemin sonucu 0 ise 1'e ayarlanır.

Bit S (işaret) – sonuç negatifse 1'e, sonuç pozitifse 0'a ayarlanır.

SP– yığın işaretçisi, 16 bitlik bir kayıttır; yığına eklenen son baytın yazıldığı bellek hücresinin adresini depolamak için tasarlanmıştır.

RS– program sayacı (program sayacı), yürütülecek bir sonraki talimatın adresini saklamak için tasarlanmış 16 bitlik bir kayıttır. Program sayacının içeriği, bir sonraki talimat baytının getirilmesinden hemen sonra otomatik olarak 1 artırılır.

0000Н – 07FF adresinin ilk hafıza alanında kontrol programı ve gösteri programları. Burası ROM alanıdır.

0800 – 0AFF - incelenen programların kaydedilmesi için adres alanı. (VERİ DEPOSU).

0В00 – 0ВВ0 - veri yazmak için adres alanı. (VERİ DEPOSU).

0ВВ0 – yığının başlangıç ​​adresi. (VERİ DEPOSU).

Yığın, verilerin veya adreslerin geçici olarak depolanması için özel olarak organize edilmiş bir RAM alanıdır. Yığına yazılan son sayı ilk önce açılır. Yığın işaretçisi, bilgilerin yazıldığı son yığın hücresinin adresini saklar. Bir alt program çağrıldığında ana programın dönüş adresi otomatik olarak yığında saklanır. Kural olarak, her altprogramın başlangıcında, yürütülmesine dahil olan tüm kayıtların içerikleri yığına kaydedilir ve altprogramın sonunda yığından geri yüklenirler.

Montaj dilinin veri formatı ve komut yapısı

MP KR580VM80'in belleği, bayt adı verilen 8 bitlik sözcüklerden oluşan bir dizidir. Her baytın, bellek hücreleri sırasındaki konumunu belirleyen kendi 16 bitlik adresi vardır. MP, hem ROM'da hem de RAM'de bulunabilen 65536 baytlık belleği adresleyebilir.

Veri formatı

Veriler hafızada 8 bitlik kelimeler olarak saklanır:

D7 D6 D5 D4 D3 D2 D1 D0

En az anlamlı bit 0. bit, en anlamlı bit ise 7. bittir.

Bir komut, formatıyla, yani bayt bayt belirli işlevsel alanlara bölünen, kendisi için ayrılan bit sayısıyla karakterize edilir.

Komut Formatı

MP KR580VM80 komutları bir, iki veya üç bayt formatına sahiptir. Çok baytlı komutlar bitişik dillere yerleştirilmelidir. Komut formatı, gerçekleştirilen işlemin özelliklerine bağlıdır.

Komutun ilk baytı, anımsatıcı biçimde yazılmış işlem kodunu içerir.

Komut formatını ve MP'nin yürütülmesi sırasında veriler üzerinde gerçekleştirmesi gereken eylemleri ve adresleme yöntemini belirler ve ayrıca verilerin konumu hakkında bilgi de içerebilir.

İkinci ve üçüncü baytlar üzerinde işlemlerin yapıldığı verileri veya verilerin konumunu belirten adresleri içerebilir. Eylemlerin gerçekleştirildiği verilere işlenenler denir.

Şekil 2'ye göre tek baytlık komut formatı

Şekil 4

Montaj dili komutlarında, işlem kodu, İngilizce sözcüklerin kısaltılmış bir yazım biçimine (anımsatıcı bir gösterim) sahiptir. Anımsatıcılar (Yunanca anımsatıcıdan - ezberleme sanatı) işlevsel amaçları nedeniyle komutların hatırlanmasını kolaylaştırır.

Yürütmeden önce kaynak program, assembler adı verilen bir çeviri programı kullanılarak kod kombinasyonları diline (makine dili) çevrilir, bu biçimde MP'nin belleğine yerleştirilir ve daha sonra komutun yürütülmesi sırasında kullanılır.


Adresleme yöntemleri

Tüm işlenen kodları (giriş ve çıkış) bir yerde bulunmalıdır. MP'nin dahili kayıtlarında bulunabilirler (en uygun ve hızlı seçenek). Sistem belleğinde bulunabilirler (en yaygın seçenek). Son olarak, I/O cihazlarında bulunabilirler (en nadir durum). İşlenenlerin konumu talimat koduyla belirlenir. Var olmak farklı yöntemler talimat kodu, giriş işleneninin nereye alınacağını ve çıkış işleneninin nereye yerleştirileceğini belirleyebilir. Bu yöntemlere adresleme yöntemleri denir.

MP KR580VM80 için aşağıdaki adresleme yöntemleri mevcuttur:

Doğrudan;

Kayıt olmak;

Dolaylı;

Yığılmış.

Doğrudan Adresleme, (giriş) işleneninin bellekte talimat kodundan hemen sonra yer aldığını varsayar. İşlenen genellikle bir yere gönderilmesi, bir şeye eklenmesi vb. gereken bir sabittir. Veriler, komutun ikinci veya ikinci ve üçüncü baytlarında bulunur, düşük bayt ise komutun ikinci baytında bulunur. ve üçüncü komut baytındaki yüksek bayt.

Dümdüz (diğer adıyla mutlak) adresleme, işlenenin (giriş veya çıkış), kodu, talimat kodundan hemen sonra programın içinde bulunan adreste bellekte bulunduğunu varsayar. Üç baytlık komutlarda kullanılır.

Kayıt olmak adresleme, işlenenin (giriş veya çıkış) MP'nin dahili kaydında olduğunu varsayar. Tek baytlık komutlarda kullanılır

Dolaylı (örtük) adresleme, MP'nin dahili kaydının işlenenin kendisini değil, bellekteki adresini içerdiğini varsayar.

Yığın adresleme, komutun bir adres içermediğini varsayar. 16 bit SP kaydının (yığın işaretçisi) içeriğini kullanarak bellek hücrelerini adresleme.

Komuta sistemi

MP komut sistemi, MP'nin gerçekleştirebildiği temel eylemlerin tam listesidir. Bu komutlar tarafından kontrol edilen MP, temel aritmetik ve mantıksal işlemler, veri aktarımı, iki değerin karşılaştırılması vb. gibi basit eylemleri gerçekleştirir. MP KR580VM80'in komut sayısı 78'dir (değişiklikler 244 dikkate alınarak).

Aşağıdaki komut grupları ayırt edilir:

Veri aktarımı;

Aritmetik;

Zeka oyunu;

Atlama komutları;

Giriş/çıkış, kontrol ve yığın komutları.


Komutları açıklarken ve programları oluştururken kullanılan semboller ve kısaltmalar

Sembol Kesinti
ADDR 16 bitlik adres
VERİ 8 bitlik veri
VERİ 16 16 bit veri
LİMAN 8 bit G/Ç cihaz adresi
Bayt 2 Komutun ikinci baytı
Bayt 3 Komutun üçüncü baytı
R, R1, R2 Kayıtlardan biri: A, B, C, D, E, H, L
R.P. Kayıt çiftlerinden biri: B - BC çiftini belirtir; D - bir DE çiftini belirtir; H - HL çiftini belirtir
Sağ Çiftin ilk kaydı
R.L. Çiftin ikinci kaydı
Λ Mantıksal çarpma
V Mantıksal ekleme
Toplama modulo iki
M Adresi HL kayıt çiftinin içeriğini belirten bir bellek hücresi, yani M = (HL)



Tepe