Asamblejas valodas pamatkomponenti un instrukciju struktūra. Datu formāts un montāžas valodas komandu struktūra. Disciplīnā "Sistēmu programmēšana"

Ievads.

Tiek izsaukta valoda, kurā ir uzrakstīta avota programma ieeja valoda, un valoda, kurā tas tiek tulkots, lai procesors to izpildītu brīvdienās mēle. Tiek saukts ievades valodas pārvēršanas process izvades valodā pārraide. Tā kā procesori spēj izpildīt programmas binārā mašīnvalodā, kas netiek izmantota programmēšanai, ir nepieciešama visu avota programmu tulkošana. Zināms divos veidos raidījumi: kompilācija un interpretācija.

Plkst kompilācija avota programma vispirms tiek pilnībā pārtulkota līdzvērtīgā programmā izvades valodā, ko sauc objektu programmu un pēc tam izpildīts. Šis process tiek īstenots, izmantojot īpašu programmas, sauca kompilators. Tiek saukts kompilators, kuram ievades valoda ir simboliska bināro kodu mašīnvalodas (izvades) attēlošanas forma. montētājs.

Plkst interpretācijas Katra teksta rindiņa avota programmā tiek analizēta (interpretēta) un uzreiz tiek izpildīta tajā norādītā komanda. Šīs metodes īstenošana ir uzticēta tulku programma. Interpretācija aizņem ilgu laiku. Lai palielinātu tā efektivitāti, tulks vispirms pārveido visu tā vietā, lai apstrādātu katru rindiņu komanda rakstzīmju virknes (

). Ģenerētā simbolu secība tiek izmantota, lai veiktu oriģinālajai programmai piešķirtās funkcijas.

Tālāk aprakstītā montāžas valoda tiek ieviesta, izmantojot kompilāciju.

Valodas iezīmes.

Galvenās montāžas funkcijas:

● bināro kodu vietā valoda izmanto simboliskus nosaukumus - mnemonika. Piemēram, pievienošanas komandai (

) tiek izmantota mnemonika

Atņemšanas (

reizināšana (

Divīzijas (

uc Simboliskie nosaukumi tiek izmantoti arī, lai adresētu atmiņas šūnas. Lai programmētu montāžas valodā, bināro kodu un adrešu vietā ir jāzina tikai simbolisks nosaukumi, ko montētājs pārvērš bināros kodos;

katrs apgalvojums atbilst viena mašīnas komanda(kods), t.i., ir savstarpēja atbilstība starp mašīnu komandām un operatoriem montāžas valodas programmā;

● valoda nodrošina piekļuvi uz visiem objektiem un komandas. Augsta līmeņa valodām šādas iespējas nav. Piemēram, montāžas valoda ļauj pārbaudīt karoga reģistra bitus un augsta līmeņa valodu (piemēram,

) nav šīs iespējas. Ņemiet vērā, ka sistēmu programmēšanas valodas (piemēram, C) bieži ieņem starpposmu. Pieejamības ziņā tās ir tuvākas montāžas valodai, taču tām ir augsta līmeņa valodas sintakse;

● montāžas valoda nav universāla valoda. Katrai konkrētai mikroprocesoru grupai ir savs montētājs. Augsta līmeņa valodām šī trūkuma nav.

Atšķirībā no augsta līmeņa valodām, programmas rakstīšana un atkļūdošana montāžas valodā aizņem daudz laika. Neskatoties uz to, montāžas valoda ir saņemta plaša izmantošanašādu apstākļu dēļ:

● programma, kas rakstīta montāžas valodā, ir ievērojami mazāka izmēra un darbojas daudz ātrāk nekā programma, kas rakstīta augsta līmeņa valodā. Dažās lietojumprogrammās šiem indikatoriem ir galvenā loma, piemēram, daudzām sistēmas programmām (tostarp kompilatoriem), kredītkaršu programmām, mobilos tālruņus, ierīču draiveri utt.;

● nepieciešamas dažas procedūras pilna piekļuve aparatūrai, ko parasti nav iespējams izdarīt augsta līmeņa valodā. Šajā gadījumā ir iekļauti pārtraukumu un pārtraukumu apstrādātāji operētājsistēmās, kā arī ierīču kontrolleri iegultās reāllaika sistēmās.

Lielākajā daļā programmu tikai neliela daļa no kopējā koda ir atbildīga par lielu programmas izpildes laika procentuālo daļu. Parasti 1% programmas ir atbildīgi par 50% no izpildes laika, un 10% no programmas ir atbildīgi par 90% no izpildes laika. Tāpēc, lai rakstītu konkrētu programmu reālos apstākļos, tiek izmantots gan montētājs, gan viena no augsta līmeņa valodām.

Operatora formāts montāžas valodā.

Montāžas valodas programma ir komandu (paziņojumu, teikumu) saraksts, no kurām katra aizņem atsevišķu rindu un satur četrus laukus: etiķetes lauks, darbības lauks, operanda lauks un komentāru lauks. Katram laukam ir atsevišķa kolonna.

Etiķetes lauks.

Etiķetes laukam ir piešķirta 1. sleja. Etiķete ir simbolisks nosaukums vai identifikators, adreses atmiņa. Tas ir nepieciešams, lai jūs varētu:

● veikt nosacītu vai beznosacījumu pāreju uz komandu;

● piekļūt vietai, kur dati tiek glabāti.

Šādi paziņojumi ir nodrošināti ar etiķeti. Lai norādītu vārdu, tiek izmantoti angļu alfabēta (lielie) burti un cipari. Nosaukuma sākumā ir jābūt burtam un beigās - kolu atdalītājam. Kola marķējumu var rakstīt atsevišķā rindā, bet operācijas kodu var rakstīt nākamajā 2. kolonnas rindā, kas vienkāršo kompilatora darbu. Kolas trūkums neļauj atšķirt etiķeti no darbības koda, ja tie atrodas atsevišķās rindās.

Dažās montāžas valodas versijās koli tiek ievietoti tikai pēc instrukciju etiķetēm, nevis pēc datu etiķetēm, un etiķetes garums var būt ierobežots līdz 6 vai 8 rakstzīmēm.

Iezīmes laukā nedrīkst būt identiskiem nosaukumiem, jo ​​etiķete ir saistīta ar komandu adresēm. Ja programmas izpildes laikā nav nepieciešams izsaukt komandu vai datus no atmiņas, tad etiķetes lauks paliek tukšs.

Operācijas koda lauks.

Šajā laukā ir komandas vai pseido komandas mnemoniskais kods (skatiet tālāk). Komandas mnemonisko kodu izvēlas valodas izstrādātāji. Montāžas valodā

mnemonika ir atlasīta, lai ielādētu reģistru no atmiņas

), un reģistra satura saglabāšanai atmiņā - mnemonika

). Asamblejas valodās

abām darbībām varat izmantot attiecīgi vienu un to pašu nosaukumu

Ja mnemonisko nosaukumu izvēle var būt patvaļīga, tad nepieciešamību izmantot divas mašīnas instrukcijas nosaka procesora arhitektūra

Reģistru mnemonika ir atkarīga arī no montētāja versijas (5.2.1. tabula).

Operanda lauks.

Šeit atrodas Papildus informācija, kas nepieciešams operācijas veikšanai. Operanda laukā lēciena komandām ir norādīta adrese, uz kuru jāveic lēciens, kā arī adreses un reģistri, kas ir mašīnas komandas operandi. Kā piemēru mēs sniedzam operandus, kurus var izmantot 8 bitu procesoriem

● skaitliskos datus,

attēlots dažādās skaitļu sistēmās. Lai norādītu izmantoto skaitļu sistēmu, konstantei seko viens no latīņu burtiem: B,

Attiecīgi binārās, oktālās, heksadecimālās un decimālās skaitļu sistēmas (

Jums tas nav jāpieraksta). Ja heksadecimālā skaitļa pirmais cipars ir A, B, C,

Tad priekšā tiek pievienots nenozīmīgs 0 (nulle);

● iekšējo mikroprocesoru reģistru un atmiņas šūnu kodi

M (informācijas avoti vai saņēmēji) burtu A, B, C veidā,

M vai to adreses jebkurā numuru sistēmā (piemēram, 10B - reģistra adrese

binārajā sistēmā);

● identifikatori,

gaisa kuģu pāru reģistrācijai,

Pirmie burti ir B,

N; akumulatora un funkciju reģistra pārim -

; programmu skaitītājam -

;steka rādītājam -

● etiķetes, kas norāda operandu adreses vai nākamos norādījumus nosacījumos

(ja nosacījums ir izpildīts) un beznosacījuma pārejas. Piemēram, operands M1 komandā

nozīmē nepieciešamību pēc beznosacījuma pārejas uz komandu, kuras adrese etiķetes laukā apzīmēta ar identifikatoru M1;

● izteiksmes,

kuras tiek konstruētas, saistot iepriekš aplūkotos datus, izmantojot aritmētiskos un loģiskos operatorus. Ņemiet vērā, ka datu vietas rezervēšanas metode ir atkarīga no valodas versijas. Asamblejas valodas izstrādātāji par

Definējiet vārdu) un vēlāk ievadiet Alternatīva iespēja.

kas bija procesoru valodā jau no paša sākuma

Valodas versijā

lietots

Definējiet konstanti).

Procesori apstrādā dažāda garuma operandus. Lai to definētu, montētāju izstrādātāji pieņēma dažādus lēmumus, piemēram:

II dažāda garuma reģistriem ir dažādi nosaukumi: EAX - 32 bitu operandu izvietošanai (tips

); AX — 16 bitiem (tips

un AN - 8 bitiem (tips

● procesoriem

Katram darbības kodam tiek pievienoti sufiksi: sufikss

Tipam

; sufikss ".B" tipam

dažāda garuma operandiem tiek izmantoti dažādi opkodi, piemēram, lai ielādētu baitu, pusvārdu (

) un vārdus 64 bitu reģistrā, izmantojot opkodus

attiecīgi.

Komentāru lauks.

Šajā laukā ir sniegti skaidrojumi par programmas darbībām. Komentāri neietekmē programmas darbību un ir paredzēti cilvēkiem. Tie var būt nepieciešami, lai modificētu programmu, kas bez šādiem komentāriem var būt pilnīgi nesaprotama pat pieredzējušiem programmētājiem. Komentārs sākas ar simbolu un tiek izmantots, lai izskaidrotu un dokumentētu programmas. Komentāra sākuma rakstzīme var būt:

● semikolu (;) uzņēmuma procesoru valodās

Izsaukuma zīme(!) valodās priekš

Pirms katras atsevišķas komentāra rindiņas ir ievadzīme.

Pseidokamandas (direktīvas).

Montāžas valodā ir divi galvenie komandu veidi:

pamata instrukcijas, kas ir līdzvērtīgas procesora mašīnas kodam. Šīs komandas veic visu programmas paredzēto apstrādi;

pseido komandas vai direktīvas, izstrādāts, lai apkalpotu programmas tulkošanas procesu kodu kombinācijas valodā. Kā piemēru tabulā. 5.2.2 parāda dažas pseido komandas no montētāja

ģimenei

.

Programmējot ir situācijas, kad pēc algoritma viena un tā pati komandu ķēde ir jāatkārto daudzas reizes. Lai izkļūtu no šīs situācijas, varat:

● ierakstiet nepieciešamo komandu secību, kad vien tā parādās. Šāda pieeja palielina programmas apjomu;

● sakārtot šo secību procedūrā (apakšprogrammā) un vajadzības gadījumā izsaukt to. Šai izvadei ir savi trūkumi: katru reizi ir jāizpilda īpašas procedūras izsaukšanas komanda un atgriešanās komanda, kas, ja secība ir īsa un bieži tiek izmantota, var ievērojami samazināt programmas ātrumu.

Vienkāršākais un efektīva metode atkārtota komandu ķēdes atkārtošana sastāv no izmantošanas makro, ko var attēlot kā pseido-komandu, kas paredzēta, lai pārtulkotu programmā bieži sastopamo komandu grupu.

Makro vai makrokomandu raksturo trīs aspekti: makrodefinīcija, makroinversija un makropaplašināšana.

Makro definīcija

Šis ir apzīmējums atkārtoti atkārtotai programmas komandu secībai, ko izmanto atsaucēm programmas tekstā.

Makro definīcijai ir šāda struktūra:

Izteicienu saraksts; Makro definīcija

Dotajā makrodefinīcijas struktūrā var izdalīt trīs daļas:

● nosaukums

makro, ieskaitot nosaukumu

Pseidokamanda

un parametru kopums;

● atzīmēts ar punktiem ķermeni makro;

● komanda

izlaidums

makro definīcijas.

Makro definīcijas parametru kopa satur visu parametru sarakstu, kas norādīti operanda laukā atlasītajai instrukciju grupai. Ja šie parametri programmā tika norādīti agrāk, tad makro definīcijas galvenē tie nav jānorāda.

Lai atkārtoti apkopotu atlasīto komandu grupu, tiek izmantota apelācija, kas sastāv no nosaukuma

makro komandas un parametru saraksts ar citām vērtībām.

Kad apkopotājs sastopas ar makro definīciju kompilācijas procesa laikā, tas saglabā to makro definīciju tabulā. Turpmākajās parādīšanās vārda programmā (

), montētājs to aizstāj ar makro pamattekstu.

Makro nosaukuma izmantošana kā opkods tiek izsaukta makro apvērsums(makro izsaukums) un aizstājot to ar makro pamattekstu - makro paplašināšana.

Ja programma tiek attēlota kā rakstzīmju secība (burti, cipari, atstarpes, pieturzīmes un karietes atgriešana, lai pārietu uz jaunu rindu), tad makro izvēršana sastāv no dažu ķēžu aizstāšanas no šīs secības ar citām ķēdēm.

Makro paplašināšana notiek montāžas procesā, nevis programmas izpildes laikā. Metodes manipulēšanai ar rakstzīmju virknēm ir piešķirtas makro nozīmē.

Tiek veikts montāžas process divos piegājienos:

● Pirmajā piegājienā visas makro definīcijas tiek saglabātas un makro izsaukumi tiek paplašināti. Šajā gadījumā sākotnējā programma tiek nolasīta un pārveidota par programmu, kurā tiek noņemtas visas makro definīcijas, un katrs makro izsaukums tiek aizstāts ar makro pamattekstu;

● otrā kārta apstrādā iegūto programmu bez makro.

Makro ar parametriem.

Lai strādātu ar atkārtotām komandu secībām, kuru parametriem var būt dažādas vērtības, tiek sniegtas makro definīcijas:

● ar faktiskais parametri, kas tiek ievietoti makro izsaukuma operanda laukā;

● ar formāls parametrus. Makro paplašināšanas laikā katrs formālais parametrs, kas parādās makro pamattekstā, tiek aizstāts ar atbilstošo faktisko parametru.

izmantojot makro ar parametriem.

Programma 1 satur divas līdzīgas komandu secības, kas atšķiras ar to, ka pirmā apmaina P un

Un otrais

2. programmā ir iekļauts makro ar diviem formāliem parametriem P1 un P2. Makro izvēršanas laikā katra P1 rakstzīme makro pamattekstā tiek aizstāta ar pirmo faktisko parametru (P,

), un simbols P2 tiek aizstāts ar otro faktisko parametru (

) no programmas Nr. 1. Makro izsaukumā

2. programma ir atzīmēta: P,

Pirmais faktiskais parametrs,

Otrais faktiskais parametrs.

1. programma

2. programma

MOV EBX,Q MOV EAX,Pl

MOV Q, EAX MOV EBX, P2

MOV P, EBX MOV P2, EAX

Paplašinātas iespējas.

Apskatīsim dažas uzlabotas valodas funkcijas

Ja makro, kas satur nosacījuma lēciena komandu un etiķeti, uz kuru jālec, tiek izsaukts divas vai vairākas reizes, etiķete tiks dublēta (dublikāta etiķetes problēma), kas izraisīs kļūdu. Tāpēc katrs izsaukums kā parametru piešķir atsevišķu etiķeti (no programmētāja). Valodā

etiķete ir deklarēta vietējā (

) un, pateicoties uzlabotajām iespējām, montētājs automātiski ģenerē citu etiķeti katru reizi, kad makro tiek izvērsts.

ļauj definēt makro citos makro. Šī uzlabotā funkcija ir ļoti noderīga kombinācijā ar programmas nosacījumu saistīšanu. Apsvērsim

JA WORDSIZE GT 16 M2 MAKRO

M2 makro var definēt abās priekšraksta daļās

Tomēr definīcija ir atkarīga no tā, kurā procesorā programma ir samontēta: 16 bitu vai 32 bitu. Ja M1 netiek izsaukts, makro M2 netiks definēts vispār.

Vēl viena uzlabota funkcija ir tāda, ka makro var izsaukt citus makro, tostarp sevi - rekursīvs zvanu. Pēdējā gadījumā, lai izvairītos no nebeidzamas cilpas, makro ir jānodod sev parametrs, kas mainās ar katru paplašināšanu, kā arī pārbaudītšo parametru un beidz rekursiju, kad parametrs sasniedz noteiktu vērtību.

Par makro līdzekļu izmantošanu montētājā.

Izmantojot makro, montētājam jāspēj veikt divas funkcijas: saglabāt makro definīcijas Un paplašināt makro izaicinājumus.

Makro definīciju saglabāšana.

Visi makro nosaukumi tiek saglabāti tabulā. Katram nosaukumam ir pievienots rādītājs uz atbilstošo makro, lai vajadzības gadījumā to varētu izsaukt. Dažiem montētājiem ir atsevišķa tabula makro nosaukumiem, citiem ir vispārīga tabula, kurā kopā ar makro nosaukumiem atrodas visas mašīnas instrukcijas un direktīvas.

Sastopoties ar makro montāžas laikā ir izveidots:

jauns tabulas elements ar makro nosaukumu, parametru skaitu un rādītāju uz citu makro definīciju tabulu, kurā tiks saglabāts makro pamatteksts;

● saraksts formāls parametrus.

Pēc tam makro pamattekstu, kas ir vienkārši rakstzīmju virkne, nolasa un saglabā makro definīciju tabulā. Tiek atzīmēti formālie parametri, kas rodas cilpas pamattekstā īpašs raksturs.

Makro iekšējais attēlojums

no iepriekš minētā piemēra 2. programmai (244. lpp.) ir:

MOV EAX, MOV EBX, MOV MOV un

kur semikolu izmanto kā karieta atgriešanas rakstzīmi, bet & kā formālo parametra rakstzīmi.

Makro zvanu paplašināšana.

Ikreiz, kad montāžas laikā tiek atrasta makro definīcija, tā tiek saglabāta makro tabulā. Kad tiek izsaukts makro, montētājs uz laiku pārtrauc ievades datu lasīšanu no ievades ierīces un sāk nolasīt saglabāto makro pamattekstu. Formālie parametri, kas iegūti no makro korpusa, tiek aizstāti ar faktiskajiem parametriem, un tos nodrošina izsaukums. Ampersands un pirms parametri ļauj montētājam tos atpazīt.

Neskatoties uz to, ka ir daudzas montētāja versijas, montāžas procesiem ir kopīgas iezīmes un tie daudzējādā ziņā ir līdzīgi. Tālāk ir apskatīta divu caurlaides montētāja darbība.

Divkāršu montētājs.

Programma sastāv no vairākiem paziņojumiem. Tāpēc šķiet, ka montāžas laikā varat izmantot šādu darbību secību:

● tulkot to mašīnvalodā;

● pārsūtīt iegūto mašīnas kodu uz failu un atbilstošo saraksta daļu uz citu failu;

● atkārtojiet uzskaitītās procedūras, līdz tiek iztulkota visa programma.

Tomēr šī pieeja nav efektīva. Piemērs ir tā sauktā problēma uz priekšu saite. Ja pirmais priekšraksts ir lēciens uz priekšrakstu P, kas atrodas programmas pašās beigās, tad montētājs to nevar pārtulkot. Vispirms viņam ir jānosaka operatora P adrese, un, lai to izdarītu, viņam ir jāizlasa visa programma. Tiek izsaukta katra pilnīga avota programmas lasīšana fragments. Parādīsim, kā varat atrisināt paredzamās saites problēmu, izmantojot divas reizes:

pirmajā piegājienā jums vajadzētu savākt un saglabājiet visas simbolu definīcijas (ieskaitot etiķetes) tabulā, un otrajā piegājienā izlasiet un salieciet katru operatoru. Šī metode ir salīdzinoši vienkārša, taču otrreizējai sākotnējās programmas iziešanai nepieciešams papildu laiks, kas jāpavada I/O operācijām;

● pirmajā piegājienā jums vajadzētu konvertēt programmu starpformā un saglabājiet to tabulā, un otro piegājienu veiciet nevis pēc sākotnējās programmas, bet gan pēc tabulas. Šī montāžas metode ietaupa laiku, jo otrā kārta neveic I/O darbības.

Pirmā piespēle.

Pirmā piespēles vārti- izveidojiet simbolu tabulu. Kā minēts iepriekš, vēl viens pirmās kārtas mērķis ir saglabāt visas makro definīcijas un paplašināt zvanus, tiklīdz tie parādās. Līdz ar to gan simbolu definīcija, gan makro paplašināšana notiek vienā piegājienā. Simbols var būt jebkurš etiķete, vai nozīme, kam tiek piešķirts konkrēts nosaukums, izmantojot direktīvu -you:

;Vērtība - bufera lielums

Piešķirot nozīmi simboliskiem nosaukumiem komandas etiķetes laukā, montētājs būtībā norāda adreses, kas katrai komandai būs programmas izpildes laikā. Šim nolūkam montētājs uzglabā montāžas procesa laikā instrukciju adrešu skaitītājs(

) kā īpašu mainīgo. Pirmās piegājiena sākumā īpašā mainīgā vērtība tiek iestatīta uz 0 un tiek palielināta pēc katras apstrādātās komandas atbilstoši šīs komandas garumam. Kā piemēru tabulā. 5.2.3 parāda programmas fragmentu, kas norāda komandu garumu un skaitītāja vērtības. Pirmajā piegājienā tiek ģenerētas tabulas simboliski nosaukumi, direktīvas Un darbības kodi, un ja nepieciešams burtiski tabula. Literāls ir konstante, kurai montētājs automātiski rezervē atmiņu. Tūlīt atzīmēsim, ka mūsdienu procesoros ir instrukcijas ar tūlītējām adresēm, tāpēc to montētāji neatbalsta burtus.

Simbolu nosaukumu tabula

satur vienu elementu katram nosaukumam (5.2.4. tabula). Katrs simbolisko nosaukumu tabulas elements satur pašu nosaukumu (vai rādītāju uz to), tā skaitlisko vērtību un dažreiz papildu informāciju, kas var ietvert:

● ar simbolu saistītā datu lauka garums;

● atmiņas pārdalīšanas biti (kas norāda, vai simbola vērtība mainās, ja programma tiek ielādēta citā adresē, nekā to paredzējis montētājs);

● informācija par to, vai simbolam var piekļūt ārpus procedūras.

Simboliskie nosaukumi ir etiķetes. Tos var norādīt, izmantojot operatorus (piemēram,

Direktīvas tabula.

Šajā tabulā ir uzskaitītas visas direktīvas vai pseidokomandas, kas rodas, sastādot programmu.

Darbības kodu tabula.

Katram darbības kodam tabulā ir atsevišķas kolonnas: operācijas koda apzīmējums, operands 1, operands 2, operācijas koda heksadecimālā vērtība, komandas garums un komandas veids (5.2.5. tabula). Operāciju kodi ir sadalīti grupās atkarībā no operandu skaita un veida. Komandas veids nosaka grupas numuru un nosaka procedūru, kas tiek izsaukta, lai apstrādātu visas šīs grupas komandas.

Otrā piespēle.

Otrās piespēles vārti- objekta programmas izveide un nepieciešamības gadījumā montāžas protokola izdruka; izvadīt informāciju, kas nepieciešama saitītājam, lai vienā izpildāmā failā saistītu procedūras, kas tika apkopotas dažādos laikos.

Otrajā piegājienā (tāpat kā pirmajā) rindas, kas satur paziņojumus, tiek lasītas un apstrādātas pa vienai. Sākotnējais operators un izvades operators, kas no tā iegūts heksadecimālā veidā objektu Kodu var izdrukāt vai ievietot buferī vēlākai drukāšanai. Pēc komandas adreses skaitītāja atiestatīšanas komanda tiek izsaukta nākamais paziņojums.

Avota programmā var būt kļūdas, piemēram:

dotais simbols nav definēts vai ir definēts vairāk nekā vienu reizi;

● opkods ir attēlots ar nederīgu nosaukumu (drukas kļūdas dēļ), tajā nav pietiekami daudz operandu vai ir pārāk daudz operandu;

● nav operatora

Daži montieri var atklāt nedefinētu simbolu un to aizstāt. Tomēr vairumā gadījumu, kad tiek parādīts kļūdas paziņojums, montētājs ekrānā parāda kļūdas ziņojumu un mēģina turpināt montāžas procesu.

Raksti, kas veltīti montāžas valodai.

UZBEKISTĀNAS NACIONĀLĀ UNIVERSITĀTE NOSAUKTA MIRZO ULUGBEKA VĀRDĀ

DATORTEHNOLOĢIJAS FAKULTĀTE

Par tēmu: EXE faila semantiskā parsēšana.

Pabeigts:

Taškenta 2003.

Priekšvārds.

Montāžas valoda un komandu struktūra.

EXE faila struktūra (semantiskā parsēšana).

COM faila struktūra.

Vīrusa darbības un izplatības princips.

Demontētājs.

Programmas.

Priekšvārds

Programmētāja profesija ir pārsteidzoša un unikāla. Mūsdienās zinātni un dzīvi nav iespējams iedomāties bez jaunākajām tehnoloģijām. Bez visa, kas saistīts ar cilvēka darbību, nevar iztikt datortehnoloģijas. Un tas veicina tā augsto attīstību un pilnību. Lai gan personālo datoru attīstība sākās ne tik sen, šajā laikā programmatūras produktos ir sperti kolosāli soļi un šie produkti tiks plaši izmantoti vēl ilgi. Ar datoru saistīto zināšanu joma ir piedzīvojusi sprādzienu, tāpat kā atbilstošās tehnoloģijas. Ja neņem vērā komerciālo pusi, tad varam teikt, ka šajā profesionālās darbības jomā nav svešinieku. Daudzi cilvēki izstrādā programmas nevis peļņas vai ienākumu dēļ, bet gan pēc savas brīvas gribas, aizrautības. Protams, tam nevajadzētu ietekmēt programmas kvalitāti, un šajā biznesā, tā teikt, ir konkurence un pieprasījums pēc kvalitatīvas izpildes, stabila darba un atbilstības visām mūsdienu prasībām. Šeit ir vērts atzīmēt arī mikroprocesoru parādīšanos 60. gados, kas nāca, lai aizstātu lielu skaitu lampu komplektu. Ir daži mikroprocesoru veidi, kas ļoti atšķiras viens no otra. Šie mikroprocesori atšķiras viens no otra ar savu bitu dziļumu un iebūvētajām sistēmas komandām. Visizplatītākie ir: Intel, IBM, Celeron, AMD utt. Visi šie procesori ir saistīti ar Intel procesoru uzlaboto arhitektūru. Mikrodatoru izplatība izraisīja divu galveno iemeslu dēļ attieksmes pret montāžas valodu pārskatīšanu. Pirmkārt, programmām, kas rakstītas montāžas valodā, ir nepieciešams ievērojami mazāk atmiņas un izpildes laika. Otrkārt, montāžas valodas zināšanas un no tā izrietošā mašīnkoda nodrošina izpratni par mašīnas arhitektūru, kas diez vai tiks nodrošināta, strādājot augsta līmeņa valodā. Lai gan lielākā daļa programmatūras speciālistu izstrādā augsta līmeņa valodas, piemēram, Pascal, C vai Delphi, kas ir vieglāk, rakstot programmas, visspēcīgākais un efektīvākais. programmatūra pilnībā vai daļēji rakstīts montāžas valodā. Augsta līmeņa valodas tika izstrādātas, lai izvairītos no īpašām tehniskās īpašības konkrēti datori. Un montāžas valoda savukārt ir paredzēta konkrētai procesora specifikai. Tāpēc, lai rakstītu montāžas valodas programmu konkrētam datoram, ir jāzina tā arhitektūra. Šajās dienās skats uz galveno programmatūras produkts ir EXE fails. Ņemot vērā pozitīvās puses Tas nozīmē, ka programmas autors var būt pārliecināts par tās integritāti. Bet bieži vien tas ir tālu no tā. Ir arī demontētājs. Izmantojot demontētāju, jūs varat uzzināt pārtraukumus un programmu kodus. Personai, kas labi pārzina montētāju, nebūs grūti visu programmu pārveidot pēc savas gaumes. Varbūt tieši šeit rodas visneatrisināmākā problēma - vīruss. Kāpēc cilvēki raksta vīrusus? Kāds šo jautājumu uzdod ar izbrīnu, kāds ar dusmām, bet tomēr joprojām ir cilvēki, kurus šis uzdevums interesē nevis no kaitējuma nodarīšanas, bet gan kā interese par sistēmas programmēšanu. Vīrusus raksta dažādu iemeslu dēļ. Dažiem patīk sistēmas izsaukumi, citi uzlabo zināšanas par montētāju. Es mēģināšu to visu izskaidrot savā kursa darbs. Tas arī saka ne tikai par EXE faila struktūru, bet arī par montāžas valodu.

^ Asamblejas valoda.

Interesanti ir sekot līdzi programmētāju priekšstatu transformācijai par montāžas valodu, sākot no pirmo datoru parādīšanās līdz mūsdienām.

Savulaik montāža bija valoda, bez kuras datoram nevarēja likt darīt neko noderīgu. Pamazām situācija mainījās. Parādījās ērtāki saziņas līdzekļi ar datoru. Bet atšķirībā no citām valodām montētājs nemira, turklāt principā to nevarēja izdarīt. Kāpēc? Meklējot atbildi, mēģināsim saprast, kas vispār ir montāžas valoda.

Īsāk sakot, montāžas valoda ir simbolisks mašīnvalodas attēlojums. Visus procesus mašīnā zemākajā aparatūras līmenī vada tikai mašīnas valodas komandas (instrukcijas). No tā ir skaidrs, ka, neskatoties uz vispārpieņemto nosaukumu, montāžas valoda katram datora veidam ir atšķirīga. Tas attiecas arī uz izskats programmas, kas rakstītas montāžas valodā, un idejas, kuras šī valoda atspoguļo.

Nav iespējams patiesi atrisināt ar aparatūru saistītas problēmas (vai pat, turklāt no aparatūras atkarīgas, piemēram, programmas ātruma palielināšanu), bez montētāja zināšanām.

Programmētājs vai jebkurš cits lietotājs var izmantot jebkādus augsta līmeņa rīkus, pat programmas virtuālo pasauļu konstruēšanai, un varbūt pat nenojauš, ka patiesībā dators izpilda nevis tās valodas komandas, kurā ir uzrakstīta tā programma, bet gan to pārveidoto attēlojumu. garlaicīgas un blāvas komandu secības veidā no pavisam citas valodas - mašīnvalodas. Tagad iedomāsimies, ka šādam lietotājam ir nestandarta problēma vai kaut kas vienkārši nedarbojas. Piemēram, viņa programmai jādarbojas ar kādu neparastu ierīci vai jāveic citas darbības, kas prasa zināšanas par datoru aparatūras darbības principiem. Neatkarīgi no tā, cik gudrs ir programmētājs, neatkarīgi no tā, cik labā valodā viņš uzrakstīja savu brīnišķīgo programmu, viņš nevar iztikt bez asamblera zināšanām. Un tā nav nejaušība, ka gandrīz visi augsta līmeņa valodu kompilatori satur līdzekļus, kā savienot savus moduļus ar montāžas moduļiem vai atbalsta piekļuvi programmēšanas montāžas līmenim.

Protams, datorģenerālistu laiks jau pagājis. Kā viņi saka, jūs nevarat aptvert bezgalīgumu. Bet ir kaut kas kopīgs, sava veida pamats, uz kura balstās jebkura nopietna datorizglītība. Tās ir zināšanas par datora darbības principiem, tā arhitektūru un montāžas valodu kā šo zināšanu atspoguļojumu un iemiesojumu.

Tipisks mūsdienu dators (uz i486 vai Pentium bāzes) sastāv no šādām sastāvdaļām (1. attēls).

Rīsi. 1. Dators un perifērijas ierīces

Rīsi. 2. Blokshēma personālais dators

No attēla (1. attēls) ir skaidrs, ka dators sastāv no vairākām fiziskām ierīcēm, no kurām katra ir savienota ar vienu bloku, ko sauc par sistēmas bloku. Ja mēs domājam loģiski, ir skaidrs, ka tas spēlē kaut kādas koordinācijas ierīces lomu. Apskatīsim sistēmas bloku (nav jāmēģina iekļūt monitorā - tur nav nekā interesanta, turklāt tas ir bīstami): atveriet korpusu un skatiet dažus dēļus, blokus, savienojošos vadus. Lai saprastu to funkcionālo mērķi, apskatīsim tipiska datora blokshēmu (2. att.). Tas nepretendē uz absolūtu precizitāti un ir paredzēts tikai, lai parādītu mūsdienu personālā datora elementu mērķi, savstarpējo savienojumu un tipisko sastāvu.

Apspriedīsim diagrammu attēlā. 2 nedaudz netradicionālā stilā.
Ierasts, ka cilvēks, sastopoties ar ko jaunu, meklē kādas asociācijas, kas var palīdzēt izprast nezināmo. Kādas asociācijas rada dators? Piemēram, man dators bieži asociējas ar pašu cilvēku. Kāpēc?

Kad cilvēks radīja datoru, viņš kaut kur dziļi sevī domāja, ka rada kaut ko līdzīgu sev. Datorā ir orgāni informācijas saņemšanai no ārpasaules - tastatūra, pele un magnētiskie diskdziņi. Attēlā 2 šie orgāni atrodas pa labi no sistēmas kopnēm. Datoram ir orgāni, kas “sagremo” saņemto informāciju - tie ir Procesors un RAM. Un visbeidzot, datorā ir runas orgāni, kas rada apstrādes rezultātus. Šīs ir arī dažas no labajā pusē esošajām ierīcēm.

Mūsdienu datori, protams, ir tālu no cilvēka. Tos var salīdzināt ar radībām, kas mijiedarbojas ar ārpasauli liela, bet ierobežota beznosacījumu refleksu kopuma līmenī.
Šis refleksu kopums veido mašīnu komandu sistēmu. Neatkarīgi no tā, cik augstā līmenī jūs sazināties ar datoru, galu galā tā ir garlaicīga un vienmuļa mašīnas komandu secība.
Katra mašīnas komanda ir sava veida stimuls, lai ierosinātu vienu vai otru beznosacījumu refleksu. Reakcija uz šo stimulu vienmēr ir nepārprotama un mikrokomandu blokā “pieslēgta” mikroprogrammas veidā. Šī mikroprogramma īsteno darbības, lai īstenotu mašīnas komandu, bet noteiktām personām piegādāto signālu līmenī loģika datoru, tādējādi kontrolējot dažādas datora apakšsistēmas. Tas ir tā sauktais mikroprogrammu vadības princips.

Turpinot analoģiju ar cilvēku, mēs atzīmējam: lai dators ēstu pareizi, ir izgudrotas daudzas operētājsistēmas, kompilatori simtiem programmēšanas valodu utt. Bet patiesībā tie visi ir tikai šķīvis, uz kura pārtika (programmas) tiek piegādāta saskaņā ar noteiktiem noteikumiem.kuņģis (dators). Tikai datora kuņģis mīl diētu, monotonu ēdienu – sniedziet tam strukturētu informāciju, stingri organizētu nulles un vieninieku secību veidā, kuru kombinācijas veido mašīnvalodu.

Tādējādi, lai gan ārēji ir poliglots, dators saprot tikai vienu valodu - mašīnu instrukciju valodu. Protams, lai sazinātos un strādātu ar datoru, šī valoda nav jāzina, taču gandrīz jebkurš profesionāls programmētājs agrāk vai vēlāk saskaras ar nepieciešamību to apgūt. Par laimi, programmētājam nav jācenšas izprast dažādu bināro skaitļu kombināciju nozīmi, jo jau 50. gados programmētāji programmēšanai sāka izmantot simbolisku mašīnvalodas analogu, ko sauca par montāžas valodu. Šī valoda precīzi atspoguļo visas mašīnvalodas iezīmes. Tāpēc atšķirībā no augsta līmeņa valodām montāžas valoda katram datora veidam ir atšķirīga.

No visa iepriekš minētā varam secināt, ka, tā kā montāžas valoda datoram ir “dzimtā”, visefektīvāko programmu var rakstīt tikai tajā (ar nosacījumu, ka to rakstījis kvalificēts programmētājs). Šeit ir viens mazs “bet”: tas ir ļoti darbietilpīgs process, kas prasa lielu uzmanību un praktisku pieredzi. Tāpēc patiesībā viņi galvenokārt raksta programmas montētājā, kas būtu jānodrošina efektīvs darbs ar aparatūru. Dažreiz programmas sadaļas, kas ir kritiskas izpildes laika vai atmiņas patēriņa ziņā, tiek ierakstītas montētājā. Pēc tam tie tiek formalizēti apakšprogrammu veidā un apvienoti ar kodu augsta līmeņa valodā.

Jebkura datora montāžas valodu ir jēga sākt apgūt tikai pēc tam, kad ir noskaidrots, kura datora daļa ir atstāta redzama un pieejama programmēšanai šajā valodā. Šis ir tā sauktais datorprogrammu modelis, kura daļa ir mikroprocesora programmas modelis, kurā vienā vai otrā pakāpē ir 32 reģistri, kas pieejami programmētāja lietošanai.

Šos reģistrus var iedalīt divās lielās grupās:

^ 16 lietotāju reģistri;

16 sistēmas reģistri.

Asamblejas valodas programmas ļoti intensīvi izmanto reģistrus. Lielākajai daļai reģistru ir īpašs funkcionāls mērķis.

Kā norāda nosaukums, lietotāju reģistrus sauc par lietotāju reģistriem, jo ​​programmētājs tos var izmantot, rakstot savas programmas. Šajos reģistros ietilpst (3. attēls):

Astoņi 32 bitu reģistri, ko programmētāji var izmantot datu un adrešu glabāšanai (saukti arī par vispārējas nozīmes reģistriem (GPR)):

seši segmentu reģistri: cs, ds, ss, es, fs, gs;

statusa un kontroles reģistri:

Karogi reģistrē karogus/karodziņus;

Komandu rādītāja reģistrs eip/ip.

Rīsi. 3. i486 un Pentium mikroprocesoru lietotāju reģistri

Kāpēc daudzi no šiem reģistriem ir parādīti ar slīpsvītām? Nē, tie nav dažādi reģistri – tie ir viena liela 32 bitu reģistra daļas. Programmā tos var izmantot kā atsevišķus objektus. Tas tika darīts, lai nodrošinātu jaunākiem 16 bitu Intel mikroprocesoru modeļiem rakstīto programmu funkcionalitāti, sākot ar i8086. Mikroprocesoriem i486 un Pentium galvenokārt ir 32 bitu reģistri. To skaits, izņemot segmentu reģistrus, ir tāds pats kā i8086, taču izmērs ir lielāks, kas atspoguļojas to apzīmējumos - tiem ir
prefikss e (Paplašināts).

^ Vispārēji reģistri
Visi šīs grupas reģistri ļauj piekļūt to “apakšējām” daļām (skat. 3. att.). Aplūkojot šo attēlu, ņemiet vērā, ka pašadresācijai var izmantot tikai šo reģistru apakšējās 16 un 8 bitu daļas. Šo reģistru augšējie 16 biti nav pieejami kā neatkarīgi objekti. Tas tika darīts, kā minēts iepriekš, lai nodrošinātu saderību ar jaunākiem 16 bitu Intel mikroprocesoru modeļiem.

Uzskaitīsim vispārējas nozīmes reģistru grupā ietilpstošos reģistrus. Tā kā šie reģistri fiziski atrodas mikroprocesorā aritmētiskās loģiskās vienības (ALU) iekšpusē, tos sauc arī par ALU reģistriem:

eax/ax/ah/al (Akumulatoru reģistrs) - akumulators.
Izmanto starpposma datu glabāšanai. Dažām komandām ir nepieciešams izmantot šo reģistru;

ebx/bx/bh/bl (Bāzes reģistrs) - bāzes reģistrs.
Izmanto, lai atmiņā saglabātu kāda objekta bāzes adresi;

ecx/cx/ch/cl (Count register) - skaitītāju reģistrs.
Izmanto komandās, kas veic dažas atkārtotas darbības. Tās lietošana bieži vien ir netieša un paslēpta attiecīgās komandas algoritmā.
Piemēram, komanda cilpas cilpas organizēšanai papildus vadības nodošanai komandai, kas atrodas noteiktā adresē, analizē un samazina ecx/cx reģistra vērtību par vienu;

edx/dx/dh/dl (Datu reģistrs) - datu reģistrs.
Tāpat kā eax/ax/ah/al reģistrs, tas saglabā starpposma datus. Dažās komandās tā lietošana ir obligāta; Dažām komandām tas notiek netieši.

Šādi divi reģistri tiek izmantoti, lai atbalstītu tā sauktās ķēdes darbības, tas ir, darbības, kas secīgi apstrādā elementu ķēdes, no kurām katra var būt 32, 16 vai 8 biti gara:

esi/si (Source Index register) - avota indekss.
Šis ķēdes operāciju reģistrs satur elementa pašreizējo adresi avota ķēdē;

edi/di (Destination Index register) - saņēmēja (saņēmēja) indekss.
Šis ķēdes darbību reģistrā ir pašreizējā adrese galamērķa ķēdē.

Mikroprocesora arhitektūrā datu struktūra, piemēram, steks, tiek atbalstīta aparatūras un programmatūras līmenī. Lai strādātu ar steku, mikroprocesora instrukciju sistēmā ir īpašas komandas, un mikroprocesora programmatūras modelī tam ir īpaši reģistri:

esp/sp (Stack Pointer register) - steka rādītāju reģistrs.
Satur rādītāju uz stekas augšdaļu pašreizējā steka segmentā.

ebp/bp (Base Pointer register) - steka rāmja bāzes rādītāju reģistrs.
Izstrādāts, lai organizētu nejaušu piekļuvi datiem stekā.

Stacks ir programmas apgabals patvaļīgu datu pagaidu glabāšanai. Protams, datus var glabāt arī datu segmentā, taču šajā gadījumā katram uz laiku saglabātajam datiem ir jāizveido atsevišķa nosaukta atmiņas šūna, kas palielina programmas izmēru un izmantoto nosaukumu skaitu. Steka ērtība slēpjas faktā, ka tās laukums ir atkārtoti lietojams, un datu glabāšana stekā un izguve no turienes tiek veikta, izmantojot efektīvās push un pop komandas, nenorādot nevienu nosaukumu.
Stacks tradicionāli tiek izmantots, piemēram, lai saglabātu programmas izmantoto reģistru saturu pirms apakšprogrammas izsaukšanas, kas savukārt izmantos procesora reģistrus "savām vajadzībām". Sākotnējais reģistru saturs tiek noņemts no steka pēc apakšprogrammas atgriešanās. Vēl viens izplatīts paņēmiens ir nepieciešamo parametru nodošana apakšprogrammai, izmantojot steku. Apakšprogramma, zinot, kādā secībā parametri tiek novietoti stekā, var tos no turienes paņemt un izmantot izpildes laikā. Atšķirīga iezīme Kaudzīte ir unikāla secība, kādā tiek izgūti tajā ietvertie dati: jebkurā brīdī stekā ir pieejams tikai augšējais elements, t.i. elements, kas nesen tika uzspiests uz kaudzītes. Atverot augšējo elementu no kaudzes, nākamais elements kļūst pieejams. Steka elementi atrodas stekam atvēlētajā atmiņas apgabalā, sākot no steka apakšas (t.i., no tās maksimālās adreses) līdz secīgi dilstošām adresēm. Augšējā, pieejamā elementa adrese tiek saglabāta steka rādītāju reģistrā SP. Tāpat kā jebkurai citai programmas atmiņas apgabalam, kaudzei ir jābūt daļai no kāda segmenta vai jāveido atsevišķs segments. Jebkurā gadījumā šī segmenta segmenta adrese tiek ievietota segmentu steku reģistrā SS. Tādējādi reģistru pāris SS:SP apraksta pieejamas steka šūnas adresi: SS saglabā steka segmenta adresi, bet SP saglabā pēdējo stekā saglabāto datu nobīdi (4. att., a). Ņemiet vērā, ka sākotnējā stāvoklī steka rādītājs SP norāda uz šūnu, kas atrodas zem steka apakšas un nav tajā iekļauta.

4. att. Steka organizācija: a - sākotnējais stāvoklis, b - pēc viena elementa ielādes (šajā piemērā AX reģistra saturs), c - pēc otrā elementa ielādes (DS reģistra saturs), d - pēc viena izkraušanas. elements, e - pēc divu elementu izkraušanas un atgriešanās sākotnējā stāvoklī.

Iekraušana kaudzē tiek veikta, izmantojot īpašu komandu darbam ar skursteni (stumt). Šī instrukcija vispirms samazina steka rādītāja saturu par 2 un pēc tam novieto operandu SP adresē. Ja, piemēram, mēs vēlamies īslaicīgi saglabāt AX reģistra saturu stekā, mums vajadzētu palaist komandu

Kaudze nonāk stāvoklī, kas parādīts attēlā. 1.10, dz. Redzams, ka steka rādītājs tiek pārvietots par diviem baitiem uz augšu (uz zemākām adresēm) un uz šo adresi tiek ierakstīts push komandā norādītais operands. Sekojošā steka ielādes komanda ir piem.

novietos kaudzi stāvoklī, kas parādīts attēlā. 1.10, c. Tagad kaudze saglabās divus elementus, un būs pieejams tikai augšējais, uz kuru norāda steka rādītājs SP. Ja pēc kāda laika mums ir jāatjauno kaudzē saglabāto reģistru sākotnējais saturs, mums ir jāizpilda pop (push) komandas, lai izlādētu no steka:

pop DS
pop AX

Cik lielai vajadzētu būt kaudzei? Tas ir atkarīgs no tā, cik intensīvi tas tiek izmantots programmā. Ja, piemēram, plānojat stekā saglabāt 10 000 baitu masīvu, tad steksam ir jābūt vismaz šādam izmēram. Jāpatur prātā, ka dažos gadījumos sistēma automātiski izmanto steku, jo īpaši, izpildot int 21h pārtraukuma komandu. Izmantojot šo komandu, procesors vispirms nospiež atgriešanas adresi stekā, un pēc tam DOS nospiež stekā reģistru saturu un citu informāciju, kas saistīta ar pārtraukto programmu. Tāpēc, pat ja programma vispār neizmanto steku, tai joprojām ir jābūt programmā un tai jābūt vismaz vairākus desmitus vārdu lielai. Pirmajā piemērā mēs kaudzei piešķīrām 128 vārdus, kas noteikti ir pietiekami.

^ Asemblera programmas struktūra

Montāžas valodas programma ir atmiņas bloku kolekcija, ko sauc par atmiņas segmentiem. Programma var sastāvēt no viena vai vairākiem šādiem bloka segmentiem. Katrs segments satur valodas teikumu kopumu, no kuriem katrs aizņem atsevišķu programmas koda rindiņu.

Ir četri montētāja paziņojumu veidi:

komandas vai instrukcijas, kas ir simboliski mašīnas komandu analogi. Tulkošanas procesā montētāja instrukcijas tiek pārveidotas attiecīgajās mikroprocesora instrukciju kopas komandās;

makrokomandas - noteiktā veidā formatēti programmas teksta teikumi, kas pārraides laikā aizstāti ar citiem teikumiem;

direktīvas, kas ir norādījumi montētāja tulkotājam veikt noteiktas darbības. Direktīvām nav līdzinieku mašīnu attēlojumā;

komentāru rindas, kurās ir jebkādas rakstzīmes, tostarp krievu alfabēta burti. Tulkotājs ignorē komentārus.

^ Montāžas sintakse

Teikumi, kas veido programmu, var būt sintaktiska konstrukcija, kas atbilst komandai, makro, direktīvai vai komentāram. Lai montiera tulks tos atpazītu, tie jāveido pēc noteiktiem sintakses likumiem. Lai to izdarītu, vislabāk ir izmantot formālu valodas sintakses aprakstu, piemēram, gramatikas noteikumus. Visizplatītākie veidi, kā šādā veidā aprakstīt programmēšanas valodu, ir sintakses diagrammas un paplašinātās Backus-Naur formas. Priekš praktiska izmantošana sintakses diagrammas ir ērtākas. Piemēram, montāžas valodas paziņojumu sintaksi var aprakstīt, izmantojot sintakses diagrammas, kas parādītas turpmākajos attēlos.

Rīsi. 5. Montāžas teikuma formāts

Rīsi. 6. Direktīvas formāts

Rīsi. 7. Komandu un makro formāts

Šajos attēlos:

etiķetes nosaukums - identifikators, kura vērtība ir teikuma pirmā baita adrese programmas avota kodā, kuru tas apzīmē;

nosaukums - identifikators, kas atšķir šo direktīvu no citām tāda paša nosaukuma direktīvām. Tā kā montētājs apstrādā noteiktu direktīvu, šim nosaukumam var tikt piešķirtas noteiktas īpašības;

darbības kods (OPC) un direktīva ir atbilstošās mašīnas instrukcijas, makroinstrukcijas vai tulkotāja direktīvas mnemoniski simboli;

operandi ir komandas, makro vai montētāja direktīvas daļas, kas apzīmē objektus, ar kuriem tiek veiktas darbības. Montāžas valodas operandus apraksta ar izteiksmēm ar ciparu un teksta konstantēm, etiķetēm un mainīgo identifikatoriem, izmantojot operatora zīmes un dažus rezervētus vārdus.

^ Kā lietot sintakses diagrammas? Tas ir ļoti vienkārši: viss, kas jums jādara, ir atrast un pēc tam sekot ceļam no diagrammas ievades (kreisajā pusē) līdz izvadei (labajā pusē). Ja šāds ceļš pastāv, tad teikums vai konstrukcija ir sintaktiski pareiza. Ja tāda ceļa nav, tad kompilators šo konstrukciju nepieņems. Strādājot ar sintakses diagrammām, pievērsiet uzmanību ar bultiņām norādītajam pārvietošanās virzienam, jo ​​starp ceļiem var būt daži, kuriem var sekot no labās uz kreiso pusi. Būtībā sintakses diagrammas atspoguļo tulkotāja darbības loģiku, analizējot programmas ievades teikumus.

Pieņemamās rakstzīmes, rakstot programmas tekstu, ir:

Visi vēstules: A-Z, a-z. Šajā gadījumā lielie un mazie burti tiek uzskatīti par līdzvērtīgiem;

Cipari no 0 līdz 9;

Zīmes ?, @, $, _, &;

Atdalītāji,. ()< > { } + / * % ! " " ? \ = # ^.

Montāžas valodas teikumi tiek veidoti no leksēmām, kas ir sintaktiski neatdalāmas derīgu valodas simbolu secības, kas tulkotājam ir jēgpilnas.

Leksēmas ir šādas:

identifikatori ir derīgu rakstzīmju secības, ko izmanto, lai apzīmētu programmas objektus, piemēram, darbības kodus, mainīgo nosaukumus un etiķešu nosaukumus. Identifikatoru rakstīšanas noteikums ir šāds: identifikators var sastāvēt no vienas vai vairākām rakstzīmēm. Kā simbolus varat izmantot latīņu alfabēta burtus, ciparus un dažas speciālās rakstzīmes - _, ?, $, @. Identifikators nevar sākties ar cipara rakstzīmi. Identifikatora garums var būt līdz 255 rakstzīmēm, lai gan tulks pieņem tikai pirmās 32 un ignorē pārējās. Izmantojot opciju, varat pielāgot iespējamo identifikatoru garumu komandrinda mv. Turklāt ir iespējams uzdot tulkotājam atšķirt lielos un mazos burtus vai ignorēt to atšķirību (kas tiek darīts pēc noklusējuma).

^Assembler komandas.

Assembler komandas atklāj iespēju pārsūtīt jūsu prasības uz datoru, mehānismu vadības pārnešanai programmā (cikli un pārejas) loģiskiem salīdzinājumiem un programmas organizēšanai. Tomēr programmējamie uzdevumi reti ir tik vienkārši. Lielākā daļa programmu satur virkni cilpu, kurās tiek atkārtotas vairākas komandas, līdz tiek sasniegta noteikta prasība, un dažādas pārbaudes, kas nosaka, kura no vairākām darbībām ir jāveic. Dažas instrukcijas var pārsūtīt vadību, mainot parasto darbību secību, tieši mainot nobīdes vērtību instrukciju rādītājā. Kā minēts iepriekš, dažādiem procesoriem ir dažādas komandas, taču mēs apskatīsim vairākas komandas 80186, 80286 un 80386 procesoriem.

Lai aprakstītu karogu stāvokli pēc noteiktas komandas izpildes, mēs izmantosim atlasi no tabulas, kas atspoguļo karogu karodziņu reģistra struktūru:

Šīs tabulas apakšējā rindā tiek parādītas karodziņu vērtības pēc komandas izpildes. Tiek izmantoti šādi apzīmējumi:

1 - pēc komandas izpildes tiek iestatīts karogs (vienāds ar 1);

0 - pēc komandas izpildes karodziņš tiek atiestatīts (vienāds ar 0);

r - karoga vērtība ir atkarīga no komandas rezultāta;

Pēc komandas izpildes karogs nav definēts;

atstarpe - pēc komandas izpildes karogs nemainās;

Operandu attēlošanai sintakses diagrammās tiek izmantots šāds apzīmējums:

r8, r16, r32 - operands vienā no baitu lieluma, vārda vai dubultvārda reģistriem;

m8, m16, m32, m48 - atmiņas operanda lielums baits, vārds, dubultvārds vai 48 biti;

i8, i16, i32 - tūlītēja operanda lieluma baits, vārds vai dubultvārds;

a8, a16, a32 - relatīvā adrese (nobīde) koda segmentā.

Komandas (alfabēta secībā):

*Šīs komandas ir sīki aprakstītas.

PIEVIENOT
(Papildinājums)

Papildinājums

^ Komandu diagramma:

pievienot galamērķi, avotu

Mērķis: divu avota un mērķa operandus pievienošana baitu, vārda vai dubultvārda izmēram.

Darba algoritms:

pievienot avota un mērķa operandus;

ierakstiet saskaitīšanas rezultātu uztvērējam;

uzstādīt karogus.

Karogu stāvoklis pēc komandas izpildes:

Pielietojums:
Komandu add izmanto, lai pievienotu divus veselus skaitļus. Papildinājuma rezultāts tiek novietots pirmā operanda adresē. Ja pievienošanas rezultāts pārsniedz uztvērēja operanda robežas (notiek pārpilde), tad šī situācija jāņem vērā, analizējot cf karogu un turpmāko iespējamo adc komandas izmantošanu. Piemēram, pievienosim vērtības cirvju reģistrā un ch atmiņas apgabalā. Pievienojot, jāņem vērā pārplūdes iespēja.

Reģistrācija plus reģistrs vai atmiņa:

|000000dw|modregr/rm|

AX reģistrs (AL) plus tūlītējā vērtība:

|0000010w|--data--|dati, ja w=1|

Reģistrs vai atmiņa plus tūlītēja vērtība:

|100000sw|mod000r/m|--data--|dati, ja BW=01|

ZVANIET
(ZVANI)

Procedūras vai uzdevuma izsaukšana

^ Komandu diagramma:

Mērķis:

kontroles pārnešana uz tuvu vai tālu procedūru ar atgriešanas punkta adreses saglabāšanu stekā;

pārslēgšanas uzdevumi.

Darba algoritms:
nosaka pēc operanda veida:

Netālu no etiķetes - komandas eip/ip rādītāja saturs tiek uzspiests uz steku un tajā pašā reģistrā tiek ielādēta etiķetei atbilstošā jaunā adreses vērtība;

Far etiķete — eip/ip un cs komandu rādītāja saturs tiek uzspiests uz steku. Tad tajos pašos reģistros tiek ielādētas jaunas adreses vērtības, kas atbilst tālākajai etiķetei;

R16, 32 vai m16, 32 - definējiet reģistru vai atmiņas šūnu, kas satur nobīdes pašreizējā instrukciju segmentā, uz kuru tiek nodota vadība. Kad vadība tiek nodota, eip/ip komandas rādītāja saturs tiek nospiests uz steku;

Atmiņas rādītājs — nosaka atmiņas vietu, kurā ir 4 vai 6 baitu rādītājs uz izsaukto procedūru. Šāda rādītāja struktūra ir 2+2 vai 2+4 baiti. Šāda rādītāja interpretācija ir atkarīga no mikroprocesora darbības režīma:

^ Karogu stāvoklis pēc komandas izpildes (izņemot uzdevumu pārslēgšanu):

komandas izpilde neietekmē karogus

Kad uzdevums tiek pārslēgts, karogu vērtības tiek mainītas atbilstoši informācijai par karogu reģistru tā uzdevuma TSS statusa segmentā, uz kuru tiek pārslēgts.
Pielietojums:
Izsaukuma komanda ļauj organizēt elastīgu un daudzveidīgu vadības nodošanu apakšprogrammai, vienlaikus saglabājot atgriešanas punkta adresi.

Objekta kods (četri formāti):

Tiešā adresēšana segmentā:

|11101000|disp-low|diep-high|

Netiešā adresēšana segmentā:

|11111111|mod010r/m|

Netiešā adresācija starp segmentiem:

|11111111|mod011r/m|

Tieša adresēšana starp segmentiem:

|10011010|nobīde-zema|nobīde-augsta|seg-zema|seg-augsta|

CMP
(Salīdzināt operandus)

Operandu salīdzinājums

^ Komandu diagramma:

cmp operand1, operand2

Mērķis: divu operandu salīdzināšana.

Darba algoritms:

veikt atņemšanu(operand1-operand2);

atkarībā no rezultāta iestatiet karogus, nemainiet operandu1 un operandu2 (tas ir, neatcerieties rezultātu).

Pielietojums:
Šī komanda izmanto, lai salīdzinātu divus operandus, atņemot, nemainot operandus. Pamatojoties uz komandas rezultātiem, tiek iestatīti karodziņi. Komanda cmp tiek izmantota ar nosacījumu lēciena komandām un iestatīto baitu pēc vērtības komandu setcc.

Objekta kods (trīs formāti):

Reģistrēties vai atmiņa ar reģistru:

|001110dw|modregr/m|

Tūlītēja vērtība ar AX (AL) reģistru:

|0011110w|--data--|dati, ja w=1|

Tūlītēja vērtība ar reģistru vai atmiņu:

|100000sw|mod111r/m|--data--|dati, ja sw=0|

DEC
(samazināt operandu par 1)

Operanda samazināšana par vienu

^ Komandu diagramma:

dec operands

Mērķis: samaziniet operanda vērtību atmiņā vai reģistrējiet par 1.

Darba algoritms:
komanda no operanda atņem 1. Karogu stāvoklis pēc komandas izpildes:

Pielietojums:
Dec instrukcija tiek izmantota, lai samazinātu baita, vārda, dubultvārda vērtību atmiņā vai reģistrā par vienu. Tomēr ņemiet vērā, ka komanda neietekmē cf karogu.

Reģistrēties: |01001reg|

^ Reģistrs vai atmiņa: |1111111w|mod001r/m|

DIV
(DALĪT neparakstītu)

Neparakstīts sadalījums

Komandas izklāsts:

div dalītājs

Mērķis: veiciet dalīšanas darbību starp divām neparakstītām binārām vērtībām.

^ Darbības algoritms:
Komandai ir nepieciešami divi operandi - dividende un dalītājs. Dividende tiek norādīta netieši, un tās lielums ir atkarīgs no dalītāja lieluma, kas norādīts komandā:

ja dalītājs ir baita lielums, tad dividendei jāatrodas cirvju reģistrā. Pēc operācijas koeficientu ievieto al un atlikušo daļu ah;

ja dalītājs ir vārda lielums, tad dividendei jāatrodas reģistru pārī dx:ax, dividendes zemās kārtas daļai jāatrodas ax. Pēc operācijas koeficientu ievieto axē un atlikumu dx;

ja dalītājs ir dubultvārda lielums, tad dividendei jāatrodas reģistru pārī edx:eax, dividendes zemās kārtas daļai jāatrodas eax. Pēc operācijas koeficients tiek ievietots eax un atlikums edx.

^ Karogu stāvoklis pēc komandas izpildes:

Pielietojums:
Komanda veic operandu dalīšanu ar veseliem skaitļiem, iegūstot dalīšanas rezultātu kā dalījuma koeficientu un atlikušo daļu. Veicot dalīšanas operāciju, var rasties izņēmums: 0 - dalīšanas kļūda. Šī situācija rodas vienā no diviem gadījumiem: dalītājs ir 0 vai koeficients ir pārāk liels, lai ietilptu reģistrā eax/ax/al.

Objekta kods:

|1111011w|mod110r/m|

INT
(Pārtraukt)

Pārtraukšanas pakalpojuma rutīnas izsaukšana

^ Komandu diagramma:

int pārtraukuma_numurs

Mērķis: izsaukt pārtraukuma pakalpojuma rutīnu ar komandas operandā norādīto pārtraukuma numuru.

^ Darbības algoritms:

spiediet karodziņus, reģistrē karogus/karodziņus un atgriešanas adresi uz steka. Rakstot atgriešanas adresi, vispirms tiek ierakstīts segmenta reģistra cs saturs, pēc tam komandas rādītāja saturs eip/ip;

atiestatīt if un tf karogus uz nulli;

pārsūtīt vadību uz pārtraukumu servisa programmu ar norādīto numuru. Vadības pārsūtīšanas mehānisms ir atkarīgs no mikroprocesora darbības režīma.

^ Karogu stāvoklis pēc komandas izpildes:

Pielietojums:
Kā redzat no sintakses, šai komandai ir divas formas:

int 3 - ir savs individuālais darbības kods 0cch un aizņem vienu baitu. Šis apstāklis ​​padara ļoti ērtu izmantošanu dažādos programmatūras atkļūdoņos, lai iestatītu pārtraukuma punktus, aizstājot jebkuras komandas pirmo baitu. Mikroprocesors, sastopoties ar komandu ar darbības kodu 0cch komandu secībā, izsauc pārtraukumu apstrādes programmu ar vektora numuru 3, kas kalpo saziņai ar programmatūras atkļūdotāju.

Komandas otrā forma aizņem divus baitus, tās darbības kods ir 0cdh, un tā ļauj sākt zvanu uz pakalpojumu pārtraukuma rutīnu ar vektora numuru diapazonā no 0 līdz 255. Vadības pārsūtīšanas iezīmes, kā minēts, ir atkarīgas no mikroprocesora darbības režīma.

Objekta kods (divi formāti):

Reģistrēties: |01000reg|

^ Reģistrs vai atmiņa: |1111111w|mod000r/m|

J.C.C.
JCXZ/JECXZ
(Pārlēkt, ja nosacījums)

(Pārlēkt, ja CX=nulle/ Pārlēkt, ja ECX=nulle)

Pārlēkt, ja nosacījums ir izpildīts

Pārlēkt, ja CX/ECX ir nulle

^ Komandu diagramma:

jcc etiķete
jcxz etiķete
jecxz etiķete

Mērķis: pāreja pašreizējā komandas segmentā atkarībā no dažiem nosacījumiem.

^ Komandu algoritms (izņemot jcxz/jecxz):
Karogu stāvokļa pārbaude atkarībā no operētājkoda (tas atspoguļo pārbaudāmo stāvokli):

ja pārbaudāmais nosacījums ir patiess, tad pārejiet uz operanda norādīto šūnu;

ja pārbaudāmais nosacījums ir nepatiess, pārsūtiet vadību uz nākamo komandu.

Algoritms komandai jcxz/jecxz:
Pārbaudot nosacījumu, ka ecx/cx reģistra saturs ir vienāds ar nulli:

ja stāvoklis tiek pārbaudīts

Komandu struktūra montāžas valodā Programmēšana mašīnu komandu līmenī ir minimālais līmenis, kurā ir iespējama datorprogrammēšana. Mašīnas vadības sistēmai jābūt pietiekamai, lai veiktu nepieciešamās darbības, izdodot mašīnas aprīkojumam norādījumus. Katra mašīnas instrukcija sastāv no divām daļām: operatīvās, kas nosaka “ko darīt” un operanda, kas nosaka apstrādes objektus, tas ir, “ko darīt”. Mikroprocesora mašīnas instrukcija, kas rakstīta montāžas valodā, ir viena rinda, kurai ir šāda forma: etiķetes komanda/direktīvas operands(-i); komentāri Iezīme, komanda/direktīva un operands ir atdalīti ar vismaz vienu atstarpi vai tabulēšanas rakstzīmi. Komandas operandus atdala ar komatiem.

Montāžas valodas komandu struktūra Asemblera komanda norāda tulkotājam, kāda darbība jāveic mikroprocesoram. Montāžas direktīvas ir programmas tekstā norādītie parametri, kas ietekmē montāžas procesu vai izvades faila īpašības. Operands norāda datu sākotnējo vērtību (datu segmentā) vai elementus, uz kuriem tiek veikta komandas darbība (koda segmentā). Instrukcijā var būt viens vai divi operandi vai bez operandiem. Operandu skaitu netieši norāda instrukcijas kods. Ja komanda vai direktīva jāturpina nākamajā rindā, tiek izmantota atpakaļvērstā slīpsvītra: "" . Pēc noklusējuma montētājs neatšķir lielos un mazos burtus, rakstot komandas un direktīvas. Direktīvu un komandu piemēri Skaits db 1 ; Nosaukums, direktīva, viens operands mov eax, 0 ; Komanda, divi operandi

Identifikatori ir derīgu rakstzīmju secības, ko izmanto, lai apzīmētu mainīgo nosaukumus un etiķešu nosaukumus. Identifikators var sastāvēt no vienas vai vairākām no šādām rakstzīmēm: visi latīņu alfabēta burti; skaitļi no 0 līdz 9; īpašās rakstzīmes: _, @, $, ? . Punktu var izmantot kā etiķetes pirmo rakstzīmi. Rezervētos montētāju nosaukumus (direktīvas, operatorus, komandu nosaukumus) nevar izmantot kā identifikatorus. Identifikatora pirmajai rakstzīmei jābūt burtam vai īpašai rakstzīmei. Maksimālais garums Identifikatoram ir 255 rakstzīmes, bet tulkotājs pieņem pirmās 32 un ignorē pārējās. Visām etiķetēm, kas ir rakstītas uz rindas, kurā nav ietverta montāžas direktīva, jābeidzas ar kolu ":". Etiķetei, komandai (direktīvai) un operandam nav jāsākas nevienā konkrētā pozīcijā rindā. Ieteicams tos rakstīt kolonnā, lai nodrošinātu labāku programmas lasāmību.

Etiķetes Visām etiķetēm, kas ir rakstītas rindā, kurā nav montētāja direktīvas, jābeidzas ar kolu ":". Etiķetei, komandai (direktīvai) un operandam nav jāsākas nevienā konkrētā pozīcijā rindā. Ieteicams tos rakstīt kolonnā, lai nodrošinātu labāku programmas lasāmību.

Komentāri Komentāru izmantošana programmā uzlabo tās skaidrību, īpaši, ja komandu kopas mērķis ir neskaidrs. Komentāri sākas jebkurā avota moduļa rindiņā ar semikolu (;). Visas rakstzīmes pa labi no "; " līdz rindas beigām ir komentārs. Komentārā var būt jebkuras drukājamas rakstzīmes, ieskaitot atstarpi. Komentārs var aptvert visu rindiņu vai sekot komandai tajā pašā rindā.

Assembly Language Programmas struktūra Programma, kas rakstīta montāžas valodā, var sastāvēt no vairākām daļām, ko sauc par moduļiem, no kuriem katrs var definēt vienu vai vairākus datu, steku un koda segmentus. Jebkurai pilnīgai programmai montāžas valodā ir jāietver viens galvenais vai galvenais modulis, no kura sākas tās izpilde. Modulis var saturēt programmas segmenti, datu un steku segmenti, kas deklarēti, izmantojot atbilstošas ​​direktīvas.

Atmiņas modeļi Pirms segmentu deklarēšanas ir jānorāda atmiņas modelis, izmantojot direktīvu. MODEL modifikators memory_model, calling_convention, OS_type, steck_parameter Asamblejas valodas pamata atmiņas modeļi: Atmiņas modelis Koda adresēšana Datu adresēšana operētājsistēma Koda un datu savstarpēja iejaukšana MAZĀ TĀLU MS-DOS Pieņemama MAZI TĀLU MS-DOS, Windows nav VIDĒJI TĀLU MS-DOS, Windows nav KOMPAKTI TĀLU TĀLU MS-DOS, Windows nav LIELA TĀLU MS-DOS, Windows nav MILZĪGI TĀLU MS-DOS, Windows NAV TUVUMĀ Windows 2000, Windows XP, Windows pieņemams FLAT NEAR NT,

Atmiņas modeļi Mazais modelis darbojas tikai 16 bitu MS-DOS lietojumprogrammās. Šajā modelī visi dati un kods atrodas vienā fiziskajā segmentā. Programmas faila lielums šajā gadījumā nepārsniedz 64 KB. Mazais modelis atbalsta vienu koda segmentu un vienu datu segmentu. Izmantojot šo modeli, dati un kods tiek adresēti pēc iespējas tuvāk. Vides modelis atbalsta vairākus koda segmentus un vienu datu segmentu, visas atsauces koda segmentos pēc noklusējuma tiek uzskatītas par tālu, un atsauces datu segmentā tiek uzskatītas par tuvu. Kompaktais modelis atbalsta vairākus datu segmentus, kas izmanto tālu datu adresēšanu (tālu), un vienu koda segmentu, kas izmanto tuvu adresāciju (tuvu). Lielais modelis atbalsta vairākus koda segmentus un vairākus datu segmentus. Pēc noklusējuma visas atsauces uz kodu un datiem tiek uzskatītas par tālu. Milzīgais modelis ir gandrīz līdzvērtīgs lielas atmiņas modelim.

Atmiņas modeļi Plakanajam modelim ir nesegmentēta programmas konfigurācija, un to izmanto tikai 32 bitu operētājsistēmās. Šis modelis ir līdzīgs mazajam modelim, jo ​​dati un kods atrodas vienā segmentā, taču tas ir 32 bitu. Pirms direktīvas izstrādāt programmu plakanajam modelim. paraugdzīvoklī jāievieto viena no direktīvām: . 386, . 486, . 586 vai. 686. Procesora izvēles direktīvas izvēle nosaka instrukciju kopu, kas pieejama, rakstot programmas. Burts p pēc procesora izvēles direktīvas nozīmē aizsargātu darbības režīmu. Datu un kodu adresēšana ir tuvu, un visas adreses un norādes ir 32 bitu.

Atmiņas modeļi. MODEL modifikators memory_model, calling_convention, OS_type, steck_parameter Modifikatora parametrs tiek izmantots, lai definētu segmentu tipus, un tam var būt šādas vērtības: use 16 (izvēlētā modeļa segmenti tiek izmantoti kā 16 biti) use 32 (tiek izmantoti atlasītā modeļa segmenti kā 32 bitu). Parametrs calling_convention tiek izmantots, lai noteiktu parametru nodošanas metodi, izsaucot procedūru no citām valodām, tostarp augsta līmeņa valodām (C++, Pascal). Parametram var būt šādas vērtības: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

Atmiņas modeļi. MODEL modifikators memory_model, calling_convention, OS_type, steck_parameter Parametrs OS_type pēc noklusējuma ir OS_DOS un ieslēgts Šis brīdisšī ir vienīgā atbalstītā šī parametra vērtība. Parametrs stack_parameter ir iestatīts uz: NEARSTACK (SS reģistrs ir vienāds ar DS, dati un steka apgabali atrodas vienā fiziskajā segmentā) FARSTACK (SS reģistrs nav vienāds ar DS, dati un steka apgabali atrodas dažādos fiziskajos segmentos). Noklusējuma vērtība ir NEARSTACK.

Piemērs programmai, kas neko nedara. 686 P. MODELIS DZĪVOKLIS, STDCALL. DATI. CODE START: RET END START RET - mikroprocesora komanda. Tas nodrošina, ka programma tiek pareizi pārtraukta. Pārējā programmas daļa attiecas uz tulka darbību. . 686 P — Pentium 6 (Pentium II) aizsargātā režīma komandas ir atļautas. Šī direktīva atlasa atbalstīto montētāja instrukciju kopu, norādot procesora modeli. . MODEL FLAT, stdcall - plakanas atmiņas modelis. Šis atmiņas modelis tiek izmantots operētājsistēmā Windows. stdcall — izmantotā procedūras izsaukšanas vienošanās.

Piemērs programmai, kas neko nedara. 686 P. MODELIS DZĪVOKLIS, STDCALL. DATI. CODE START: RET END START. DATA ir programmas segments, kas satur datus. Šī programma neizmanto steku, tātad segmentu. Trūkst STACK. . CODE ir programmas segments, kas satur kodu. START - etiķete. END START - programmas beigas un ziņojums kompilatoram, ka programmas izpildei jāsākas ar START etiķeti. Katrā programmā ir jābūt END direktīvai, lai atzīmētu beigas avota kods programmas. Visas rindas, kas seko direktīvai END, tiek ignorētas.Etiķete, kas norādīta pēc direktīvas END, norāda tulkotājam galvenā moduļa nosaukumu, no kura sākas programmas izpilde. Ja programmā ir viens modulis, etiķeti pēc direktīvas END var izlaist.

Montāžas valodas tulki Tulkotājs - programma vai tehniskajiem līdzekļiem, kas vienā no programmēšanas valodām pārstāvēto programmu pārvērš programmā mērķa valodā, ko sauc par objekta kodu. Papildus mašīnmācību mnemonikas atbalstam katram tulkotājam ir savs direktīvu un makro rīku komplekts, kas bieži vien nav saderīgs ar neko citu. Galvenie montāžas valodas tulkotāju veidi: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - brīvi izplatīts daudzpakāpju montētājs, ko rakstījis Tomašs Grištars (poļu valoda), NASM (Netwide Assembler) - bezmaksas. montētājs Intel x arhitektūrai 86, ko izveidoja Saimons Tehems kopā ar Džulianu Holu, un pašlaik to izstrādā neliela Source izstrādātāju komanda. Kalts. tīkls.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="Programmas tulkošana programmā Microsoft Visual Studio 2005 1) Izveidojiet projektu, atlasot Fails->Jauns- >Projekta izvēlne Un"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="Programmas tulkošana programmā Microsoft Visual Studio 2005 2) Projekta kokā (View->Solution Explorer) pievienot"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Programmas tulkošana programmā Microsoft Visual Studio 2005 3) Izvēlieties Code C++ faila tipu, bet norādiet nosaukumu ar paplašinājumu. asm:

Programmas tulkošana programmā Microsoft Visual Studio 2005 5) Iestatiet kompilatora parametrus. Ar peles labo pogu noklikšķiniet uz izvēlnes Custom Build Rules projekta failā...

Tulkojiet programmu programmā Microsoft Visual Studio 2005 un parādītajā logā atlasiet Microsoft Macro Assembler.

Programmas tulkošana programmā Microsoft Visual Studio 2005 Pārbaudiet ar labo pogu failā hello. asm projekta koku izvēlnē Properties un instalējiet General-> Tool: Microsoft Macro Assembler.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="Programmas tulkošana programmā Microsoft Visual Studio 2005 6) Kompilējiet failu, atlasot Build->Build hello. prj."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Programmēšana operētājsistēmā Windows OS Programmēšana operētājsistēmā Windows ir balstīta uz API funkciju izmantošanu (Application Program Interface, t.i., programmatūras lietojumprogrammas interfeiss). To skaits sasniedz 2000. Windows programma lielākoties sastāv no šādiem zvaniem. Visas mijiedarbības ar ārējās ierīces un operētājsistēmas resursi, kā likums, notiek caur šādām funkcijām. operācijas zāle Windows sistēma izmanto plakanas atmiņas modeli. Jebkuras atmiņas šūnas adresi noteiks viena 32 bitu reģistra saturs. Operētājsistēmai Windows ir 3 veidu programmu struktūras: dialogs (galvenais logs ir dialogs), konsoles jeb bezlogu struktūra, klasiskā struktūra (logu, rāmis).

Zvaniet Windows funkcijas API Palīdzības failā jebkura API funkcija tiek parādīta kā tips funkcijas_nosaukums (FA 1, FA 2, FA 3) Tips – atgriešanas vērtības tips; FAx – formālo argumentu saraksts to parādīšanās secībā, piemēram, int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Šī funkcija parāda logu ar ziņojumu un izejas pogu (vai pogām). Parametru nozīme: h. Wnd ir tā loga deskriptors, kurā parādīsies ziņojuma logs, lp. Teksts - teksts, kas parādīsies logā, lp. Paraksts - teksts loga virsrakstā, u. Tips - loga veids; jo īpaši varat noteikt izejas pogu skaitu.

Windows API int Message funkcijas izsaukšana. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Gandrīz visi API funkciju parametri faktiski ir 32 bitu veseli skaitļi: HWND ir 32 bitu vesels skaitlis, LPCTSTR ir 32 bitu rādītājs uz virkni, UINT ir 32 bitu vesels skaitlis. Funkcijas nosaukumam bieži tiek pievienots sufikss "A", lai pārietu uz jaunākām funkcijas versijām.

Windows API int Message funkcijas izsaukšana. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Lietojot MASM, nosaukuma beigās jāpievieno @N N — baitu skaits, ko stekā aizņem nodotie argumenti. Win 32 API funkcijām šo skaitli var definēt kā argumentu skaitu n, kas reizināts ar 4 (baiti katrā argumentā): N=4*n. Lai izsauktu funkciju, izmantojiet montētāja CALL instrukciju. Šajā gadījumā visi funkciju argumenti tiek nodoti tai caur steku (PUSH komanda). Argumentu nodošanas virziens: NO KREISĀ UZ LABĀ — APAŠS UZ AUGŠU. Arguments u vispirms tiks ievietots kaudzē. Tips. Norādītās funkcijas izsaukums izskatīsies šādi: CALL Message. Kaste. A@16

Windows API int Message funkcijas izsaukšana. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Jebkuras API funkcijas izpildes rezultāts parasti ir vesels skaitlis, kas tiek atgriezts EAX reģistrā. OFFSET direktīva apzīmē "nobīdi segmentā" vai, tulkojot augsta līmeņa valodas terminos, "rādītāju" uz rindas sākumu. EQU direktīva, tāpat kā #define SI, definē konstanti. Direktīva EXTERN norāda tulkotājam, ka funkcija vai identifikators ir ārpus šī moduļa.

Programmas “Sveiki visiem!” piemērs . 686 P. MODELIS DZĪVOKLIS, STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 DB "Mana pirmā programma", 0 STR 2 DB "Sveiki visiem!", 0 HW DD ? ĀRĒJAIS Ziņojums. Kaste. A@16: TUVUMĀ. KODA SĀKUMS: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Ziņojums. Kaste. A@16 RET END START

Direktīva INVOKE Valodas MASM tulkotājs ļauj arī vienkāršot funkciju izsaukumus, izmantojot makro rīku - direktīvu INVOKE: INVOKE funkcija, parametrs1, parametrs2, ... Funkcijas izsaukumam nav jāpievieno @16; parametri ir uzrakstīti tieši tādā secībā, kādā tie norādīti funkcijas aprakstā. Ar tulkotāja makro palīdzību parametri tiek ievietoti kaudzē. Lai izmantotu direktīvu INVOKE, jums ir jābūt funkcijas prototipa aprakstam, izmantojot PROTO direktīvu šādā formā: Ziņojums. Kaste. PROTO: DWORD, : DWORD Ja programma izmanto daudzas Win 32 API funkcijas, ieteicams izmantot direktīvu iekļaut C: masm 32includeuser 32. inc

Tēma 2.5 Procesora programmēšanas pamati

Palielinoties programmas garumam, kļūst arvien grūtāk atcerēties dažādu darbību kodus. Mnemonika sniedz zināmu palīdzību šajā ziņā.

Tiek izsaukta simboliskā komandu kodēšanas valoda montētājs.

Montāžas valoda ir valoda, kurā katrs izteikums atbilst tieši vienai mašīnas komandai.

Montāža ko sauc par programmas konvertēšanu no montāžas valodas, t.i., programmas sagatavošanu mašīnvalodā, aizstājot simboliskos operāciju nosaukumus ar mašīnkodiem, bet simboliskās adreses ar absolūtajiem vai relatīvajiem skaitļiem, kā arī iekļaujot bibliotēkas programmas un ģenerējot simbolisku instrukciju secības, norādot konkrētus parametri mikrokomandās. Šī programma parasti atrodas ROM vai ievadīta RAM no dažiem ārējiem datu nesējiem.

Montāžas valodai ir vairākas iezīmes, kas to atšķir no augsta līmeņa valodām:

1. Šī ir savstarpēja atbilstība starp montāžas valodas paziņojumiem un mašīnas instrukcijām.

2. Montāžas valodas programmētājam ir piekļuve visiem objektiem un instrukcijām, kas atrodas mērķa mašīnā.

Izpratne par programmēšanas pamatiem mašīnorientētās valodās ir noderīga:



Labāka izpratne par datoru arhitektūru un kompetentāka datoru lietošana;

Izstrādāt racionālākas algoritmu struktūras lietišķo uzdevumu risināšanas programmām;

Iespēja skatīt un labot izpildāmās programmas ar paplašinājumu .exe un .com, kas kompilētas no jebkura augsta līmeņa valodām, avota programmu pazaudēšanas gadījumā (izsaucot norādītās programmas DEBUG programmu atkļūdotājs un dekompilējot to displeju montāžā valoda);

Programmu sastādīšana kritiskāko problēmu risināšanai (programma, kas rakstīta mašīnorientētā valodā, parasti ir efektīvāka - īsāka un ātrāka par 30-60 procentiem no programmām, kas iegūtas tulkošanas rezultātā no augsta līmeņa valodām)

Ieviest galvenajā programmā iekļautās procedūras atsevišķu fragmentu veidā, ja tās nevar realizēt ne lietotajā augsta līmeņa valodā, ne izmantojot OS servisa procedūras.

Programma montāžas valodā var darboties tikai vienā datoru saimē, savukārt programma, kas rakstīta augsta līmeņa valodā, var darboties dažādās iekārtās.

Montāžas valodas alfabēts sastāv no ASCII rakstzīmēm.

Skaitļi ir tikai veseli skaitļi. Tur ir:

Binārie skaitļi beidzas ar burtu B;

Decimālskaitļi, kas beidzas ar burtu D;

Heksadecimālie skaitļi beidzas ar burtu H.

RAM, reģistri, datu prezentācija

Noteiktai MP sērijai tiek izmantota individuāla programmēšanas valoda - montāžas valoda.

Montāžas valoda ieņem starpposmu starp mašīnkodiem un augsta līmeņa valodām. Programmēšana šajā valodā ir vienkāršāka. Programma montāžas valodā efektīvāk izmanto konkrētas mašīnas (precīzāk, MP) iespējas nekā programma augsta līmeņa valodā (kas programmētājam ir vienkāršāka nekā montētājam). Apskatīsim programmēšanas pamatprincipus mašīnorientētās valodās, izmantojot MP KR580VM80 montāžas valodas piemēru. Programmēšanai valodā tiek izmantota vispārīga metodoloģija. Īpaši tehniskie paņēmieni programmu ierakstīšanai ir saistīti ar mērķa MP arhitektūras un komandu sistēmas iezīmēm.

Programmatūras modelis mikroprocesoru sistēma, kuras pamatā ir MP KR580VM80

MPS programmatūras modelis saskaņā ar 1. attēlu

MP portu atmiņa

S Z A.C. P C

1. attēls

No programmētāja viedokļa MP KR580VM80 ir šādi programmā pieejamie reģistri.

A– 8 bitu akumulatoru reģistrs. Tas ir deputāta galvenais reģistrs. Jebkura darbība, kas tiek veikta ALU, ietver viena no apstrādājamajiem operandiem ievietošanu akumulatorā. Darbības rezultāts ALU parasti tiek saglabāts arī A.

B, C, D, E, H, L– 8 bitu vispārējas nozīmes reģistri (GPR). Iekšējā atmiņa MP. Paredzēts apstrādātas informācijas, kā arī operācijas rezultātu glabāšanai. Apstrādājot 16 bitu vārdus, reģistri veido pārus BC, DE, HL, un dubultreģistru sauc par pirmo burtu - B, D, H. Reģistru pārī augstākais ir pirmais reģistrs. Reģistriem H un L ir īpašs īpašums, ko izmanto gan datu glabāšanai, gan RAM šūnu 16 bitu adrešu glabāšanai.

FL– karogu reģistrs (zīmju reģistrs) 8 bitu reģistrs, kurā glabājas piecas MP aritmētisko un loģisko darbību veikšanas rezultāta zīmes. FL formāts atbilstoši attēlam

Bits C (CY - pārnēsāšana) - pārnēsāšana, iestatīta uz 1, ja, veicot aritmētiskās darbības, notika pārnešana no baita augstākās kārtas.

Bits P (paritāte) – paritāte, iestatīta uz 1, ja vieninieku skaits rezultāta bitos ir pāra.

Maiņstrāvas cipars ir papildu pārnesums, kas paredzēts, lai saglabātu pārneses vērtību no rezultāta zemās kārtas tetrades.

Bits Z (nulle) – iestatiet uz 1, ja darbības rezultāts ir 0.

Bits S (zīme) – ir iestatīts uz 1, ja rezultāts ir negatīvs, un uz 0, ja rezultāts ir pozitīvs.

SP– steka rādītājs, 16 bitu reģistrs, kas paredzēts, lai saglabātu tās atmiņas šūnas adresi, kurā tika ierakstīts pēdējais stekā ievietotais baits.

RS– programmu skaitītājs (programmu skaitītājs), 16 bitu reģistrs, kas paredzēts nākamās izpildāmās instrukcijas adreses glabāšanai. Programmu skaitītāja saturs tiek automātiski palielināts par 1 tūlīt pēc nākamā instrukcijas baita iegūšanas.

Sākotnējā atmiņas apgabalā ar adresi 0000Н – 07FF ir kontroles programma un demonstrācijas programmas. Šī ir ROM apgabals.

0800 – 0AFF - adreses apgabals pētāmo programmu ierakstīšanai. (RAM).

0В00 – 0ВВ0 - adreses apgabals datu rakstīšanai. (RAM).

0ВВ0 – kaudzes sākuma adrese. (RAM).

Stacks ir īpaši organizēta RAM zona, kas paredzēta datu vai adrešu pagaidu glabāšanai. Pēdējais stekā ierakstītais cipars tiek parādīts pirmais. Steka rādītājs saglabā pēdējās steka šūnas adresi, kurā ir ierakstīta informācija. Kad tiek izsaukta apakšprogramma, galvenās programmas atgriešanās adrese tiek automātiski saglabāta kaudzē. Parasti katras apakšprogrammas sākumā visu tās izpildē iesaistīto reģistru saturs tiek saglabāts stekā, un apakšprogrammas beigās tie tiek atjaunoti no steka.

Asamblejas valodas datu formāts un komandu struktūra

MP KR580VM80 atmiņa ir 8 bitu vārdu masīvs, ko sauc par baitiem.Katram baitam ir sava 16 bitu adrese, kas nosaka tā pozīciju atmiņas šūnu secībā. MP var adresēt 65536 baitus atmiņas, kas var būt gan ROM, gan RAM.

Datu formāts

Dati tiek saglabāti atmiņā kā 8 bitu vārdi:

D7 D6 D5 D4 D3 D2 D1 D0

Vismaznozīmīgākais bits ir 0, bet visnozīmīgākais bits ir 7.

Komandu raksturo tās formāts, t.i., tai piešķirto bitu skaits, kas tiek sadalīti pa baitam noteiktos funkcionālajos laukos.

Komandu formāts

MP KR580VM80 komandām ir viena, divu vai trīs baitu formāts. Vairāku baitu komandas jāievieto blakus valodās. Komandas formāts ir atkarīgs no veicamās darbības specifikas.

Komandas pirmais baits satur operācijas kodu, kas rakstīts mnemoniskā formā.

Tas nosaka komandas formātu un darbības, kas MP jāveic ar datiem to izpildes laikā, un adresācijas metodi, kā arī var saturēt informāciju par datu atrašanās vietu.

Otrajā un trešajā baitā var būt dati, ar kuriem tiek veiktas darbības, vai adreses, kas norāda datu atrašanās vietu. Datus, uz kuriem tiek veiktas darbības, sauc par operandiem.

Viena baita komandas formāts saskaņā ar 2. attēlu

4. attēls

Montāžas valodas komandās darbības kodam ir saīsināta angļu vārdu rakstīšanas forma - mnemonisks apzīmējums. Mnemonika (no grieķu mnemonika — iegaumēšanas māksla) atvieglo komandu iegaumēšanu pēc to funkcionālā mērķa.

Pirms izpildes avota programma tiek pārtulkota, izmantojot tulkošanas programmu, ko sauc par assembler, koda kombināciju valodā - mašīnvaloda, tādā formā tā tiek ievietota MP atmiņā un pēc tam tiek izmantota, izpildot komandu.


Adresācijas metodes

Visiem operandu kodiem (ievadei un izvadei) kaut kur jāatrodas. Tos var atrast MP iekšējos reģistros (ērtākais un ātrs variants). Tās var atrasties sistēmas atmiņā (visbiežāk sastopamā iespēja). Visbeidzot, tās var atrasties I/O ierīcēs (retākais gadījums). Operandu atrašanās vietu nosaka instrukcijas kods. Pastāv dažādas metodes, ar kuru instrukcijas kods var noteikt, kur ņemt ievades operandu un kur novietot izvades operandu. Šīs metodes sauc par adresācijas metodēm.

MP KR580VM80 ir šādas adresācijas metodes:

Tiešs;

Reģistrēties;

Netiešs;

Sakrauts.

Tieša adresēšana pieņem, ka (ievades) operands atrodas atmiņā uzreiz pēc instrukcijas koda. Operands parasti ir konstante, kas kaut kur jānosūta, kaut kam jāpievieno utt. dati ir ietverti komandas otrajā vai otrajā un trešajā baitā, bet zemais datu baits atrodas komandas otrajā baitā, un augstais baits trešajā komandas baitā.

Taisni (aka absolūtā) adresēšana pieņem, ka operands (ievade vai izvade) atrodas atmiņā adresē, kuras kods atrodas programmas iekšienē uzreiz pēc instrukcijas koda. Izmanto trīs baitu komandās.

Reģistrēties adresēšana pieņem, ka operands (ievade vai izvade) atrodas MP iekšējā reģistrā. Izmanto viena baita komandās

Netiešs (netiešā) adresēšana pieņem, ka MP iekšējā reģistrā ir nevis pats operands, bet gan tā adrese atmiņā.

Kaudze adresēšana pieņem, ka komanda nesatur adresi. Atmiņas šūnu adresēšana, izmantojot 16 bitu SP reģistra saturu (steka rādītājs).

Komandu sistēma

MP komandu sistēma ir pilns saraksts ar elementārajām darbībām, kuras MP spēj veikt. Ar šīm komandām vadītais MP veic vienkāršas darbības, piemēram, elementāras aritmētiskās un loģiskās darbības, datu pārsūtīšanu, divu vērtību salīdzināšanu utt. MP KR580VM80 komandu skaits ir 78 (ņemot vērā modifikācijas 244).

Izšķir šādas komandu grupas:

Datu pārraide;

Aritmētika;

Prāta mežģis;

Pārlēkšanas komandas;

Ievades/izvades, vadības un kaudzes komandas.


Simboli un saīsinājumi, ko izmanto, aprakstot komandas un veidojot programmas

Simbols Samazinājums
ADDR 16 bitu adrese
DATI 8 bitu dati
DATI 16 16 bitu dati
PORTA 8 bitu I/O ierīces adrese
2. BAITS Komandas otrais baits
3. BAITS Trešais komandas baits
R, R1, R2 Viens no reģistriem: A, B, C, D, E, H, L
R.P. Viens no reģistru pāriem: B - norāda pāri BC; D - norāda DE pāri; H – norāda HL pāri
RH Pirmais pāra reģistrs
R.L. Otrais pāra reģistrs
Λ Loģiskā reizināšana
V Loģisks papildinājums
Papildinājums modulo two
M Atmiņas šūna, kuras adrese norāda reģistru pāra HL saturu, t.i., M = (HL)



Tops