Montaj dili komut yapısı şunları içerir: IBM-PC için Assembler dilinin komut sisteminin genel özellikleri (temel komut kümesi, işlenenleri adreslemenin temel yöntemleri). Assembler dilinde program yapısı. Program bölümleri. direktifi üstlenmek

Konu 1.4 Montaj anımsatıcıları. Komut yapısı ve formatları. Adresleme türleri. Mikroişlemcili komut sistemi

Plan:

1 Montaj dili. Temel konseptler

2 Montaj dili sembolleri

3 Çevirici ifadesi türleri

4 Montaj direktifleri

5 İşlemci talimat sistemi

1 benmontaj dili. Temel konseptler

Montaj dilimakine 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.

Bir derleme dili programı, adı verilen bellek bloklarının bir koleksiyonudur. Bellek bölümleri. 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:

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

2) makro komutları -program metninin belli bir biçimde biçimlendirilmiş cümlelerinin yayın sırasında başka cümlelerle değiştirilmesi;

3) direktifler,Bunlar, montajcı çevirmenine belirli eylemleri gerçekleştirmesi için verilen talimatlardır. Direktiflerin makine temsilinde karşılığı yoktur;

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

­ Montaj programı yapısı. 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ı.İçin pratik kullanım daha uygun sözdizimi diyagramları.Örneğin, birleştirici cümlelerinin sözdizimi, aşağıdaki Şekil 10, 11, 12'de gösterilen sözdizimi diyagramları kullanılarak açıklanabilir.

Şekil 10 - Derleme cümle formatı


­ Şekil 11 - Yönerge formatı

­ Şekil 12 - Komutların ve makroların formatı

Bu resimlerde:

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

­ İsim -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;

­ operasyon kodu (OPC) ve direktif - bunlar karşılık gelen makine talimatı, makro talimat veya çevirmen direktifi için anımsatıcılardır;

­ işlenenler -Üzerinde eylemlerin gerçekleştirileceği nesneleri belirleyen bir komut, makro veya birleştirici yönergesinin parçaları. 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ı yardımı Diyagramın girişinden (sol) çıkışına (sağ) kadar olan yolu bulun ve izleyin. 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.

­ 2 Montaj dili sembolleri

Program metni yazarken kabul edilebilir karakterler şunlardır:

1) tüm latin harfler: A'dan Z'ye,a'dan z'ye. Bu durumda büyük ve küçük harfler eşdeğer kabul edilir;

2) gelen sayılar 0 önce 9 ;

3) işaretler ? , @ , $ , _ , & ;

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

Assembly dili ifadeleri şunlardan oluşur: sözlük Bunlar, çevirmen için anlamlı olan geçerli dil sembollerinin sözdizimsel olarak ayrılamaz dizileridir.

Sözcükbirimlerişunlardır:

1) tanımlayıcılar - İşlem kodları, değişken adları ve etiket adları gibi program nesnelerini temsil etmek için kullanılan geçerli karakter dizileri. Tanımlayıcıların yazılmasına ilişkin kural şu ​​şekildedir: bir tanımlayıcı bir veya daha fazla karakterden oluşabilir;

2) karakter dizileri - tek veya kapalı karakter dizileri ikili alıntı;

3) aşağıdaki sayı sistemlerinden birindeki tam sayılar : ikili, ondalık, onaltılı. Montajcı programlarına yazarken sayıların tanımlanması belirli kurallara göre gerçekleştirilir:

4) ondalık sayılar herhangi bir ek karakterin tanımlanmasını gerektirmez, örneğin 25 veya 139. Programın kaynak metninde tanımlama için ikili sayılar Sıfırları ve onları oluşturanları yazdıktan sonra Latinceyi koymak gerekir. B”, örneğin 10010101 B.

5) Onaltılık sayıları yazarken daha fazla kural vardır:

Öncelikle sayılardan oluşurlar 0...9 Latin alfabesinin küçük ve büyük harfleri A,B, C,D,e,F veya A,B,C,D,e,F.

İkinci olarak, çevirmen onaltılık sayıların yalnızca 0...9 rakamlarından oluşabilmesi (örneğin, 190845) veya Latin alfabesinin bir harfiyle başlayabilmesi (örneğin, ef15). Belirli bir belirtecin ondalık sayı veya tanımlayıcı olmadığını çevirmene "açıklamak" için programcının onaltılık sayıyı özel bir şekilde vurgulaması gerekir. Bunu yapmak için onaltılık sayıyı oluşturan onaltılık basamak dizisinin sonuna Latin harfini yazın “ H" Bu bir zorunluluk. Onaltılık sayı bir harfle başlıyorsa, ondan önce bir sıfır yazılır: 0 ef15 H.

Hemen hemen her cümle, üzerinde veya yardımıyla bazı eylemlerin gerçekleştirildiği bir nesnenin tanımını içerir. Bu nesnelere denir işlenenler. Bunlar şu şekilde tanımlanabilir: işlenenler- bunlar, talimatların veya direktiflerin üzerinde etki ettiği nesnelerdir (bazı değerler, kayıtlar veya bellek hücreleri) veya bunlar, talimatların veya direktiflerin eylemini tanımlayan veya açıklığa kavuşturan nesnelerdir.

İşlenenleri aşağıdaki gibi sınıflandırmak mümkündür:

­ sabit veya anlık işlenenler;

­ adres işlenenleri;

­ hareketli işlenenler;

adres sayacı;

­ işleneni kaydet;

­ temel ve indeks işlenenleri;

­ yapı işlenenleri;

kayıtları.

İşlenenler, üzerinde bir işlemin gerçekleştirileceği nesneleri belirleyen makine komutunun bir parçasını oluşturan temel bileşenlerdir. Daha genel bir durumda, işlenenler, adı verilen daha karmaşık oluşumların bileşenleri olarak dahil edilebilir. ifade.

İfade bir bütün olarak ele alınan işlenenlerin ve operatörlerin kombinasyonlarıdır. Bir ifadenin değerlendirilmesinin sonucu, bir bellek hücresinin adresi veya bir sabit (mutlak) değer olabilir.

­ 3 Çevirici ifadesi türleri

Olası türleri listeleyelim montajcı operatörleri ve birleştirici ifadelerin oluşumuna ilişkin sözdizimsel kurallar:

­ aritmetik operatörler;

­ vardiya operatörleri;

­ karşılaştırma operatörleri;

­ mantıksal operatörler;

­ indeks operatörü;

­ tür yeniden tanımlama operatörü;

­ segment geçersiz kılma operatörü;

­ yapı türü adlandırma operatörü;

­ bir ifade adresinin bölüm bileşenini elde etmek için operatör;

­ Bir ifadenin uzaklığını elde etmeye yönelik operatör.

1 Montaj direktifleri

­ Montajcı direktifleri vardır:

1) Segmentasyon direktifleri. Önceki tartışma sırasında, bir montaj dili programında talimatların ve işlenenlerin yazılmasına ilişkin tüm temel kuralları öğrendik. Komut dizisinin, çevirmenin bunları işleyebilmesi ve mikroişlemcinin yürütebilmesi için doğru şekilde nasıl biçimlendirileceği sorusu hala cevapsızdır.

Mikroişlemcinin mimarisini göz önünde bulundurduğumuzda, aynı anda çalışabileceği altı bölüm kaydına sahip olduğunu öğrendik:

­ bir kod segmenti ile;

­ bir yığın segmenti ile;

­ bir veri segmenti ile;

­ üç ek veri segmenti ile.

Fiziksel olarak bir segment, adresleri ilgili segment kaydındaki değere göre hesaplanan talimatlar ve/veya veriler tarafından işgal edilen bir hafıza alanıdır. Birleştiricideki bir segmentin sözdizimsel açıklaması Şekil 13'te gösterilen yapıdır:


­ Şekil 13 - Birleştiricideki bir segmentin sözdizimsel açıklaması

Bir segmentin işlevselliğinin, bir programı kod, veri ve yığın bloklarına bölmekten biraz daha geniş olduğunu unutmamak önemlidir. Segmentasyon, aşağıdakilerle ilişkili daha genel bir mekanizmanın parçasıdır: Modüler programlama kavramı. Farklı programlama dilleri de dahil olmak üzere derleyici tarafından oluşturulan nesne modüllerinin tasarımının birleştirilmesini içerir. Bu, farklı dillerde yazılmış programları birleştirmenize olanak tanır. SEGMENT direktifindeki işlenenler böyle bir birleşim için çeşitli seçenekleri uygulamaya yöneliktir.

2) Listeleme yönetimi direktifleri. Listeleme yönetimi direktifleri aşağıdaki gruplara ayrılmıştır:

­ genel listeleme yönetimi yönergeleri;

­ dahil edilen dosyaların listelenmesine yönelik yönergeler;

­ koşullu montaj bloklarının çıktısı için direktifler;

­ listede makro komutlarını görüntülemek için yönergeler;

­ listelemedeki çapraz referanslarla ilgili bilgilerin görüntülenmesine yönelik yönergeler;

­ listeleme biçimini değiştirmeye yönelik yönergeler.

2 İşlemci talimat sistemi

İşlemci komut sistemi Şekil 14'te gösterilmektedir.

Ana komut gruplarına bakalım.

­ Şekil 14 - Montajcı talimatlarının sınıflandırılması

Takımlar:

1 Veri aktarım komutları. Bu komutlar herhangi bir işlemcinin komut setinde çok önemli bir yer tutar. Aşağıdaki temel işlevleri yerine getirirler:

­ işlemcinin dahili kayıtlarının içeriğinin hafızada saklanması;

­ içeriğin bir hafıza alanından diğerine kopyalanması;

­ G/Ç aygıtlarına yazma ve bunlardan okuma.

Bazı işlemcilerde tüm bu işlevler tek bir komutla gerçekleştirilir. MOV (bayt aktarımları için - MOVB ) ancak farklı işlenen adresleme yöntemleriyle.

Komut dışındaki diğer işlemcilerde MOV Bu işlevleri gerçekleştirmek için birkaç komut daha vardır. Veri aktarım komutları aynı zamanda bilgi alışverişi komutlarını da içerir (bunların atamaları kelimeye dayanmaktadır) Değişme ). Dahili kayıtlar arasında, bir kaydın iki yarısı arasında bilgi alışverişi yapılabilir ( TAKAS ) veya bir kayıt ile bir bellek hücresi arasında.

2 Aritmetik komutları. Aritmetik talimatlar, işlenen kodları sayısal ikili veya BCD kodları olarak ele alır. Bu komutlar beş ana gruba ayrılabilir:

­ sabit nokta işlemleri talimatları (toplama, çıkarma, çarpma, bölme);

­ kayan nokta talimatları (toplama, çıkarma, çarpma, bölme);

­ temizleme komutları;

­ artırma ve azaltma komutları;

­ karşılaştırma komutu.

3 Sabit nokta komutları, işlemci kayıtlarındaki veya bellekteki kodları normal ikili kodlarmış gibi ele alır. Kayan nokta (nokta) komutları, sayıları üs ve mantis ile temsil etmek için bir format kullanır (genellikle bu sayılar iki ardışık bellek hücresini kaplar). Modern güçlü işlemciler Kayan nokta talimatları seti sadece dört aritmetik işlemle sınırlı değildir, aynı zamanda trigonometrik fonksiyonların hesaplanması, logaritmik fonksiyonların yanı sıra ses ve görüntü işleme için gerekli karmaşık fonksiyonların hesaplanması gibi daha birçok karmaşık talimatı da içerir.

4 Açık talimatlar, bir kayıt defterine veya hafıza konumuna sıfır kodu yazmak için tasarlanmıştır. Bu komutlar ileri sıfır kod komutlarıyla değiştirilebilir, ancak özel temizleme komutları genellikle ileri komutlardan daha hızlıdır.

5 Arttırma (birer birer artırma) ve azaltma komutları

(bir azalır) da çok uygundur. Prensipte bir ekle veya bir çıkar talimatlarıyla değiştirilebilirler, ancak artırma ve azaltma, toplama ve çıkarmadan daha hızlıdır. Bu talimatlar aynı zamanda bir çıkış işleneni olan bir giriş işleneni gerektirir.

6 Karşılaştırma komutu iki giriş işlenenini karşılaştırmak için kullanılır. Temel olarak, bu iki işlenen arasındaki farkı hesaplar, ancak bir çıkış işleneni oluşturmaz, yalnızca bu çıkarmanın sonucuna bağlı olarak işlemci durum kaydındaki bitleri değiştirir. Karşılaştırma talimatını takip eden talimat (genellikle bir atlama talimatı), işlemcinin durum kaydındaki bitleri inceleyecek ve değerlerine göre eylemler gerçekleştirecektir. Bazı işlemciler, bellekte bulunan iki işlenen dizisinin zincir karşılaştırması için talimatlar sağlar.

7 Mantıksal komutlar. Mantıksal talimatlar işlenenleri üzerinde mantıksal (bit düzeyinde) işlemler gerçekleştirir; yani işlenenlerin kodlarını tek bir sayı olarak değil, ayrı bitler kümesi olarak ele alırlar. İşte bu şekilde farklılaşıyorlar aritmetik talimatlar. Mantıksal komutlar aşağıdaki temel işlemleri gerçekleştirir:

­ mantıksal VE, mantıksal VEYA, toplama modulo 2 (Özel VEYA);

­ mantıksal, aritmetik ve döngüsel kaymalar;

­ bitlerin ve işlenenlerin kontrol edilmesi;

­ işlemci durum kaydının bitlerini (bayraklarını) ayarlama ve temizleme ( PSW).

Mantıksal işlem talimatları, temel mantıksal işlevleri iki giriş işleneninden parça parça değerlendirmenize olanak tanır. Ek olarak, VE işlemi, belirtilen bitlerin temizlenmesini zorlamak için kullanılır (işlenenlerden biri olarak, temizlenmesi gereken bitlerin sıfıra ayarlandığı bir maske kodu kullanılır). VEYA işlemi, belirtilen bitlerin ayarlanmasını zorlamak için kullanılır (işlenenlerden biri olarak, bire ayarlanması gereken bitlerin bire eşit olduğu bir maske kodu kullanılır). "Özel VEYA" işlemi, belirtilen bitleri tersine çevirmek için kullanılır (tersine çevrilecek bitlerin bire ayarlandığı işlenenlerden biri olarak bir maske kodu kullanılır). Talimatlar iki giriş işleneni gerektirir ve bir çıkış işleneni üretir.

8 Kaydırma talimatları, işlenen kodunu parça parça sağa (düşük sıralı bitlere doğru) veya sola (yüksek sıralı bitlere doğru) kaydırmanıza olanak tanır. Kaydırma türü (mantıksal, aritmetik veya döngüsel), yüksek bitin (sağa kaydırma için) veya düşük bitin (sola kaydırma için) yeni değerinin ne olacağını belirler ve ayrıca yüksek bitin eski değerinin ne olacağını belirler. (sola kaydırma için) bir yerde saklanacaktır veya en az anlamlı bit (sağa kaydırıldığında). Dairesel kaydırmalar, bir işlenenin kod bitlerini dairesel bir şekilde kaydırmanıza olanak tanır (sağa kaydırma için saat yönünde veya sola kaydırma için saat yönünün tersine). Bu durumda vites değiştirme halkası bir taşıma bayrağı içerebilir veya içermeyebilir. Taşıma bayrağı biti (kullanılıyorsa), sola dönerken en anlamlı bitin değerini ve sağa dönerken en az anlamlı bitin değerini saklar. Buna göre, taşıma bayrağı bitinin değeri, sola çevrimsel bir kayma sırasında en az anlamlı bit'e ve sağa çevrimsel bir kayma sırasında en anlamlı bit'e yeniden yazılacaktır.

9 Geçiş komutları. Atlama komutları her türlü döngüyü, dalları, alt program çağrılarını vb. organize etmek için tasarlanmıştır, yani program yürütmenin sıralı akışını bozarlar. Bu komutlar program sayaç kaydına yeni bir değer yazar ve böylece işlemcinin sırayla bir sonraki talimata değil, program belleğindeki herhangi bir başka talimata geçmesine neden olur. Bazı geçiş komutları, geçişin yapıldığı noktaya daha sonra geri dönüş sağlarken, diğerleri bunu sağlamaz. Bir dönüş sağlanırsa, mevcut işlemci parametreleri yığında saklanır. Geri dönüş sağlanmazsa mevcut işlemci parametreleri kaydedilmez.

Dönüşsüz atlama komutları iki gruba ayrılır:

­ koşulsuz atlama komutları;

­ koşullu atlama komutları.

Bu komutlar kelimeleri kullanır Dallanma (dallanma) ve Atlama (atlama).

Koşulsuz atlama komutları bir sıçramaya neden olur yeni adres ne olursa olsun. Belirli bir uzaklık miktarına (ileri veya geri) veya belirli bir bellek adresine atlamaya neden olabilirler. Ofset değeri veya yeni adres değeri giriş işleneni olarak belirtilir.

Koşullu atlama komutları her zaman bir atlamaya neden olmaz, ancak yalnızca belirtilen koşullar karşılandığında. Bu tür koşullar genellikle işlemci durum kaydındaki bayrakların değerleridir ( P.S.W. ). Yani geçiş koşulu, bayrakların değerlerini değiştiren önceki bir işlemin sonucudur. Toplamda 4'ten 16'ya kadar bu tür geçiş koşulları olabilir.Koşullu geçiş komutlarının birkaç örneği:

­ sıfıra eşitse atla;

­ sıfır değilse atla;

­ taşma varsa atla;

­ taşma yoksa atla;

­ sıfırdan büyükse atla;

­ Sıfırdan küçük veya sıfıra eşitse atlayın.

Geçiş koşulu karşılanırsa komut sayaç kaydına yeni bir değer yüklenir. Geçiş koşulu karşılanmazsa program sayacı basitçe artırılır ve işlemci bir sonraki talimatı sırayla seçip yürütür.

Spesifik olarak, atlama koşullarını kontrol etmek için, bir koşullu atlama talimatından (veya hatta birkaç koşullu atlama talimatından) önce gelen bir karşılaştırma talimatı (CMP) kullanılır. Ancak bayraklar, örneğin bir veri aktarım komutu veya herhangi bir aritmetik veya mantıksal komut gibi başka herhangi bir komutla da ayarlanabilir. Atlama komutlarının bayrakları değiştirmediğini unutmayın; bu tam olarak birkaç atlama komutunu arka arkaya yerleştirmenize olanak tanır.

Geri dönüş komutları arasında kesme komutları özel bir yere sahiptir. Bu talimatlar, giriş işleneni olarak bir kesme numarası (vektör adresi) gerektirir.

Çözüm:

Montaj dili, makine dilinin sembolik bir temsilidir. Montaj dili her bilgisayar türü için farklıdır. Bir derleme dili programı, bellek bölümleri adı verilen bellek bloklarının bir koleksiyonudur. 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 çevirici ifadesi vardır: komutlar veya talimatlar, makrolar, direktifler ve yorum satırları.

Program metni yazarken kabul edilen karakterlerin tümü Latin harfleridir: A'dan Z'ye,a'dan z'ye. Bu durumda büyük ve küçük harfler eşdeğer kabul edilir; gelen sayılar 0 önce 9 ; işaretler ? , @ , $ , _ , & ; ayırıcılar , . () < > { } + / * % ! " " ? = # ^ .

Birleştirici ifadeleri oluşturmak için aşağıdaki türlerde çevirici operatörleri ve söz dizimi kuralları kullanılır. aritmetik operatörleri, kaydırma operatörleri, karşılaştırma operatörleri, mantıksal operatörler, indeks operatörü, tür yeniden tanımlama operatörü, bölüm yeniden tanımlama operatörü, yapı tipi adlandırma operatörü, bir ifadenin adresinin bölüm bileşenini elde etmeye yönelik operatör, bir ifadenin uzaklığını elde etmeye yönelik operatör.

Komuta sistemi 8 ana gruba ayrılmıştır.

­ Kontrol soruları:

1 Montaj dili nedir?

2 Montaj dilinde komut yazmak için hangi semboller kullanılabilir?

3 Etiketler nedir ve amaçları nelerdir?

4 Assembler komutlarının yapısını açıklayın.

5 4 tür birleştirici cümleyi listeleyin.

Ö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.

Montajcı bilgisi olmadan donanımla ilgili (veya hatta donanıma bağlı, örneğin bir programın hızını artırmak gibi) sorunları 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. Kişisel bir bilgisayarın blok şeması

Ş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. Haydi içeriye bir göz atalım sistem birimi(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 Veri deposu. 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 komut sisteminde özel komutlar vardır ve programı modeli Mikroişlemcinin 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. Pratik kullanım için sözdizimi diyagramları daha uygundur. Ö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 Latin harfleri: 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

Makine talimat seviyesinde programlama, programların yazılabileceği minimum seviyedir. Makine talimatları sistemi, bilgisayar donanımına talimatlar vererek gerekli eylemleri uygulamaya yeterli olmalıdır.

Her makine komutu iki bölümden oluşur:

  • operasyonel - “ne yapılacağının” belirlenmesi;
  • işlenen - işleme nesnelerini, "ne yapılacağını" tanımlar.

Montaj dilinde yazılan mikroişlemci makine komutu, aşağıdaki sözdizimsel forma sahip bir satırdır:

komut/yönerge etiketi işlenen(ler) ;yorumlar

Bu durumda satırda bulunması gereken alan bir komut veya yönergedir.

Etiket, komut/yönerge ve işlenenler (varsa) en az bir boşluk veya sekme karakteriyle ayrılır.

Bir komut veya yönergenin bir sonraki satırda devam etmesi gerekiyorsa ters eğik çizgi karakteri kullanılır: \.

Varsayılan olarak, montaj dili, komut veya yönerge yazarken büyük ve küçük harfler arasında ayrım yapmaz.

Örnek kod satırları:

db'yi say 1 ;İsim, direktif, tek işlenen
hareket eax,0 ;Komut, iki işlenen
cbw; Takım

Etiketler

Etiket Assembly dilinde aşağıdaki semboller bulunabilir:

  • Latin alfabesinin tüm harfleri;
  • 0'dan 9'a kadar sayılar;
  • özel karakterler: _, @, $, ?.

Bir etiketin ilk karakteri olarak nokta kullanılabilir ancak bazı derleyiciler bu karakterin kullanılmasını önermez. Ayrılmış Assembler adları (yönergeler, operatörler, komut adları) etiket olarak kullanılamaz.

Etiketteki ilk karakter bir harf veya özel karakter olmalıdır (ancak sayı olmamalıdır). Maksimum uzunluk Etiketler – 31 karakter. Assembler direktifi içermeyen bir satıra yazılan tüm etiketlerin iki nokta üst üste ile bitmesi gerekir: .

Takımlar

Takım çevirmene mikroişlemcinin hangi eylemi gerçekleştirmesi gerektiğini söyler. Bir veri segmentinde bir komut (veya yönerge) bir alanı, çalışma alanını veya sabiti tanımlar. Bir kod bölümünde komut, taşıma (taşıma) veya ekleme (ekleme) gibi bir eylemi belirtir.

Direktifler

Montajcının, montaj ve listeleme sürecini kontrol etmenize olanak tanıyan bir dizi operatörü vardır. Bu operatörlere denir direktifler . Yalnızca programın derlenmesi işlemi sırasında hareket ederler ve komutların aksine makine kodu oluşturmazlar.

İşlenenler

İşlenen – üzerinde bir makine komutunun veya programlama dili ifadesinin yürütüldüğü bir nesne.
Bir talimatın bir veya iki işleneni olabilir veya hiç işleneni olmayabilir. İşlenenlerin sayısı, talimat kodu tarafından dolaylı olarak belirtilir.
Örnekler:

  • Geri dönen işlenen yok;Dönüş
  • Bir işlenen ecx dahil ;ecx'i artır
  • İki işlenen eax'i ekler, 12 ; eax'e 12'yi ekler

Etiket, komut (yönerge) ve işlenenin satırda herhangi bir belirli konumda başlaması gerekmez. Ancak programın okunmasını kolaylaştırmak için bunları bir sütuna yazmanız önerilir.

İşlenenler şunlar olabilir:

  • tanımlayıcılar;
  • tek veya çift tırnak içine alınmış karakter dizileri;
  • İkili, sekizli, ondalık veya onaltılık sayı sistemlerinde tamsayılar.
Tanımlayıcılar

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 dizileri.

Tanımlayıcıları kaydetme kuralları.

  • 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.
  • Çevirmen tanımlayıcının ilk 32 karakterini kabul eder ve gerisini göz ardı eder.
Yorumlar

Yorumlar yürütülebilir satırdan bir karakterle ayrılır; . Bu durumda noktalı virgülden sonra ve satırın sonuna kadar yazılan her şey bir yorumdur. 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. Yorum, boşluklar 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.

Montaj programı yapısı

Assembly dilinde yazılmış bir program, adı verilen birkaç bölümden oluşabilir. modüller . Her modül tanımlanmış bir veya daha fazla veri, yığın ve kod segmentine sahip olabilir. Herhangi bir tam montajcı programı, yürütmenin başlayacağı bir ana veya ana modül içermelidir. Bir modül, uygun yönergeler kullanılarak bildirilen kod bölümlerini, veri bölümlerini ve yığın bölümlerini içerebilir. Segmentleri bildirmeden önce .MODEL yönergesini kullanarak bellek modelini belirtmelisiniz.

Assembly dilinde "hiçbir şey yapma" programına bir örnek:

686P
.MODEL DÜZ, STDCALL
.VERİ
.KOD
BAŞLANGIÇ:

RET
SON BAŞLANGIÇ

Bu program yalnızca bir mikroişlemci komutu içerir. Bu komut RET'tir. Programın doğru bir şekilde sonlandırılmasını sağlar. Genel olarak bu komut bir prosedürden çıkmak için kullanılır.
Programın geri kalanı çevirmenin çalışmasıyla ilgilidir.
.686P - 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. Yönergenin sonunda belirtilen P harfi, çevirmene işlemcinin korumalı modda çalıştığını bildirir.
.MODEL FLAT, stdcall - düz bellek modeli. Bu bellek modeli Windows işletim sisteminde kullanılmaktadır. stdcall
.DATA, veri içeren bir program bölümüdür.
.CODE, kod içeren bir program bloğudur.
BAŞLAT - etiket. Çeviricide etiketler, modern üst düzey diller için söylenemeyecek kadar büyük bir rol oynar.
END START - programın sonu ve çevirmene, programın yürütülmesinin START etiketiyle başlaması gerektiğini belirten bir mesaj.
Her modül, sonu işaretlemek için bir END yönergesi içermelidir kaynak kodu programlar. END yönergesini izleyen tüm satırlar dikkate alınmaz. END yönergesini atlarsanız bir hata oluşturulur.
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 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. Bir tanımlayıcının maksimum uzunluğu 255 karakterdir, 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. Bir modül, uygun yönergeler kullanılarak bildirilen program, veri ve yığın bölümlerini içerebilir.

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çilen 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 tahsis edilmiştir) FARSTACK (SS kaydı DS'ye eşit değildir, veri ve yığın alanları farklı fiziksel segmentlerde tahsis edilmiştir). 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, programın kaynak kodunun sonunu belirten bir END yönergesi içermelidir. 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 dayanmaktadı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 tamsayı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 tamsayı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şkenlerin iletilme 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 dili çeviricisi aynı zamanda bir makro aracı - INVOKE yönergesi kullanarak işlev çağrılarını basitleştirmenize de 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




Tepe