Montāžas valodas instrukciju struktūra satur. IBM-PC Assembler valodas komandu sistēmas vispārīgie raksturlielumi (komandu pamatkopa, operandu adresācijas pamatveidi). Programmas struktūra Assembler valodā. programmas segmenti. pieņemt direktīvu

Tēma 1.4 Assembler mnemonika. Komandu struktūra un formāti. Adresācijas veidi. Mikroprocesora instrukciju komplekts

Plāns:

1 Montāžas valoda. Pamatjēdzieni

2 Montāžas valodas simboli

3 Montētāja paziņojumu veidi

4 Asamblejas direktīvas

5 Procesora instrukciju komplekts

1 Imontāžas valoda. Pamatjēdzieni

montāžas valodair 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.

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

Montāžas paziņojumi ir četru veidu:

1) komandas vai instrukcijas kas ir simboliski mašīnu komandu analogi. Tulkošanas procesā montāžas instrukcijas tiek pārveidotas attiecīgajās mikroprocesora instrukciju kopas komandās;

2) makro -raidījuma teksta teikumus, kas ir noteiktā veidā formalizēti, pārraides laikā aizstāj ar citiem teikumiem;

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

4) komentāru rindas , kas satur visas rakstzīmes, ieskaitot krievu alfabēta burtus. Tulkotājs ignorē komentārus.

­ Montāžas programmas struktūra. montētāja 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ā aprakstīt šādu programmēšanas valodu - sintakses diagrammas un paplašinātās Backus-Naur formas. Priekš praktiska izmantošanaērtāk sintakses diagrammas. Piemēram, montāžas valodas paziņojumu sintaksi var aprakstīt, izmantojot sintakses diagrammas, kas parādītas turpmākajos 10., 11., 12. attēlā.

10. attēls — montāžas teikuma formāts


­ 11. attēls — direktīvu formāts

­ 12. attēls — komandu un makro formāts

Uz šiem zīmējumiem:

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

­ vārds -identifikators, kas atšķir šo direktīvu no citām tāda paša nosaukuma direktīvām. Noteiktas direktīvas montētāja veiktās apstrādes rezultātā šim nosaukumam var piešķirt noteiktas īpašības;

­ darbības kods (COP) un direktīva - tie ir mnemoniski simboli attiecīgajai mašīnas instrukcijai, makro instrukcijai vai kompilatora direktīvai;

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

Sintakses diagrammas palīdz atrodiet un pēc tam šķērsojiet ceļu no diagrammas ievades (pa kreisi) līdz izvadei (pa labi). Ja šāds ceļš pastāv, tad teikums vai konstrukcija ir sintaktiski pareiza. Ja tāda ceļa nav, tad kompilators šo konstrukciju nepieņems.

­ 2 Montāžas valodas simboli

Atļautās rakstzīmes, rakstot programmu tekstu, ir:

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

2) numuri no 0 pirms tam 9 ;

3) zīmes ? , @ , $ , _ , & ;

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

Assembler teikumi tiek veidoti no žetonus, kas ir sintaktiski neatdalāmas derīgu valodas rakstzīmju secības, kas tulkotājam ir jēgpilnas.

žetonus ir:

1) identifikatori - derīgu rakstzīmju secības, ko izmanto, lai apzīmētu programmas objektus, piemēram, opkodus, 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;

2) rakstzīmju virknes - rakstzīmju secības, kas ietvertas vienā vai dubultpēdiņas;

3) veseli skaitļi kādā no šādām skaitļu sistēmām : binārais, decimālais, heksadecimālais. Skaitļu identifikācija, rakstot tos montētāja programmās, tiek veikta saskaņā ar noteiktiem noteikumiem:

4) decimālskaitļiem to identifikācijai nav nepieciešami papildu simboli, piemēram, 25 vai 139. Identifikācijai programmas avota kodā binārie skaitļi pēc to sastāvā iekļauto nulles un vieninieku ierakstīšanas ir jāievieto latīņu " b”, piemēram, 10010101 b.

5) heksadecimālo skaitļu apzīmējumos ir vairāk vienošanos:

Pirmkārt, tie sastāv no skaitļiem. 0...9 , latīņu alfabēta mazie un lielie burti a,b, c,d,e,f vai A,B,C,D,E,F.

Otrkārt, tulkotājam var būt grūtības atpazīt heksadecimālos skaitļus, jo tie var sastāvēt tikai no cipariem 0...9 (piemēram, 190845) vai sākties ar latīņu alfabēta burtu (piemēram, ef15). Lai tulkotājam "izskaidrotu", ka dotā leksēma nav decimālskaitlis vai identifikators, programmētājam speciāli jāpiešķir heksadecimālais skaitlis. Lai to izdarītu, heksadecimālo ciparu secības beigās, kas veido heksadecimālo skaitli, ierakstiet latīņu burtu " h". Tas ir priekšnoteikums. Ja heksadecimālais skaitlis sākas ar burtu, pirms tā ievada nulli: 0 ef15 h.

Gandrīz katrs teikums satur tā objekta aprakstu, ar kuru vai ar kura palīdzību tiek veikta kāda darbība. Šos objektus sauc operandi. Tos var definēt šādi: operandi- tie ir objekti (dažas vērtības, reģistri vai atmiņas šūnas), kurus ietekmē instrukcijas vai direktīvas, vai arī tie ir objekti, kas definē vai precizē instrukciju vai direktīvu darbību.

Ir iespējams veikt šādu operandu klasifikāciju:

­ pastāvīgi vai tūlītēji operandi;

­ adreses operandi;

­ pārvietoti operandi;

adrešu skaitītājs;

­ reģistrēt operandu;

­ bāzes un indeksu operandi;

­ strukturālie operandi;

ieraksti.

Operandi ir elementāras sastāvdaļas, kas veido daļu no mašīnas instrukcijas, apzīmējot objektus, ar kuriem tiek veikta darbība. Vispārīgākā gadījumā operandus var iekļaut kā komponentus sarežģītākos veidojumos, ko sauc izteiksmes.

Izteicieni ir operandus un operatoru kombinācijas, kas aplūkotas kopumā. Izteiksmes novērtēšanas rezultāts var būt kādas atmiņas šūnas adrese vai kāda konstanta (absolūtā) vērtība.

­ 3 Montētāja paziņojumu veidi

Uzskaitīsim iespējamos veidus montētāju paziņojumi un sintaktiskie noteikumi komplektētāja izteiksmju veidošanai:

­ aritmētiskie operatori;

­ maiņu operatori;

­ salīdzināšanas operatori;

­ loģiskie operatori;

­ indeksa operators;

­ tipa ignorēšanas operators;

­ segmenta pārdefinēšanas operators;

­ struktūras tipa nosaukšanas operators;

­ operators izteiksmes adreses segmenta komponentes iegūšanai;

­ izteiksmes nobīde iegūt operatoru.

1 Asamblejas direktīvas

­ Montāžas norādījumi ir:

1) Segmentācijas direktīvas. Iepriekšējās diskusijas gaitā noskaidrojām visus pamatnoteikumus instrukciju un operandu rakstīšanai montāžas valodas programmā. Atklāts paliek jautājums, kā pareizi formatēt komandu secību, lai tulkotājs tās varētu apstrādāt un mikroprocesors izpildīt.

Apsverot mikroprocesora arhitektūru, mēs uzzinājām, ka tam ir seši segmentu reģistri, caur kuriem tas var darboties vienlaikus:

­ ar vienu koda segmentu;

­ ar vienu kaudzes segmentu;

­ ar vienu datu segmentu;

­ ar trīs papildu datu segmentiem.

Fiziski segments ir atmiņas apgabals, ko aizņem komandas un (vai) dati, kuru adreses tiek aprēķinātas attiecībā pret vērtību attiecīgajā segmentu reģistrā. Segmenta sintaktiskais apraksts montāžētājā ir 13. attēlā parādītā konstrukcija:


­ 13. attēls. Segmenta sintaktiskais apraksts komplektētājā

Ir svarīgi atzīmēt, ka segmenta funkcionalitāte ir nedaudz plašāka nekā vienkārši programmas sadalīšana koda, datu un steka blokos. Segmentācija ir daļa no vispārīgāka mehānisma, kas saistīts ar modulārās programmēšanas koncepcija. Tas ietver kompilatora izveidoto objektu moduļu, tostarp dažādu programmēšanas valodu, dizaina apvienošanu. Tas ļauj apvienot dažādās valodās rakstītas programmas. Tieši šādas savienības dažādu variantu ieviešanai ir paredzēti operandi SEGMENT direktīvā.

2) Saraksta kontroles direktīvas. Sarakstu kontroles direktīvas ir iedalītas šādās grupās:

­ vispārīgas saraksta kontroles direktīvas;

­ izvades direktīvas, lai iekļautu failu sarakstu;

­ izvades direktīvas nosacījuma montāžas blokiem;

­ izvada direktīvas makro sarakstam;

­ norādījumi informācijas parādīšanai par savstarpējām atsaucēm sarakstā;

­ uzskaitot formāta maiņas direktīvas.

2 Procesora instrukciju komplekts

Procesora instrukciju kopa ir parādīta 14. attēlā.

Apsveriet galvenās komandu grupas.

­ 14. attēls – montāžas instrukciju klasifikācija

Komandas ir:

1 Datu pārsūtīšanas komandas. Šīs instrukcijas ieņem ļoti svarīgu vietu jebkura procesora instrukciju komplektā. Viņi veic šādas būtiskas funkcijas:

­ procesora iekšējo reģistru satura saglabāšana atmiņā;

­ satura kopēšana no vienas atmiņas apgabala uz citu;

­ rakstīšana uz I/O ierīcēm un lasīšana no I/O ierīcēm.

Dažos procesoros visas šīs funkcijas veic ar vienu instrukciju MOV (baitu pārsūtīšanai - MOVB ) bet ar dažādām operandu adresācijas metodēm.

Citos procesoros, izņemot instrukciju MOV uzskaitīto funkciju veikšanai ir vēl vairākas komandas. Datu pārsūtīšanas komandas ietver arī informācijas apmaiņas komandas (to apzīmējums ir balstīts uz vārdu Apmaiņa ). Var būt iespējams nodrošināt informācijas apmaiņu starp iekšējiem reģistriem, starp divām viena reģistra pusēm ( MAIŅA ) vai starp reģistru un atmiņas vietu.

2 Aritmētiskās komandas. Aritmētiskās instrukcijas apstrādā operandu kodus kā ciparu bināros vai BCD kodus. Šīs komandas var iedalīt piecās galvenajās grupās:

­ komandas operācijām ar fiksētu punktu (saskaitīšana, atņemšana, reizināšana, dalīšana);

­ peldošā komata instrukcijas (saskaitīšana, atņemšana, reizināšana, dalīšana);

­ tīrīšanas komandas;

­ palielināšanas un samazināšanas komandas;

­ salīdzināšanas komanda.

3 Fiksēta punkta instrukcijas darbojas ar kodiem procesora reģistros vai atmiņā tāpat kā ar parastajiem binārajiem kodiem. Peldošā komata (punkta) instrukcijās tiek izmantots skaitļu attēlojuma formāts ar eksponentu un mantisu (parasti šie skaitļi aizņem divas secīgas atmiņas vietas). Mūsdienu valodā jaudīgi procesori peldošā komata instrukciju kopa neaprobežojas tikai ar četrām aritmētiskām operācijām, bet satur arī daudzas citas sarežģītākas instrukcijas, piemēram, trigonometrisko funkciju aprēķinus, logaritmiskās funkcijas, kā arī skaņas un attēla apstrādē nepieciešamās sarežģītas funkcijas.

4 Clear komandas ir paredzētas nulles koda ierakstīšanai reģistrā vai atmiņas šūnā. Šīs komandas var aizstāt ar nulles koda pārsūtīšanas instrukcijām, taču īpašas skaidras instrukcijas parasti ir ātrākas nekā pārsūtīšanas instrukcijas.

5 Palielināšanas (palielināt par vienu) un samazināšanas komandas

(samazinājumi par vienu) arī ir ļoti ērti. Principā tos varētu aizstāt ar pievienošanas un atņemšanas instrukcijām, taču palielināšana un samazināšana ir ātrāka nekā pievienošana un atņemšana. Šīm instrukcijām ir nepieciešams viens ievades operands, kas ir arī izvades operands.

6 Salīdzināšanas instrukcija ir paredzēta divu ievades operandu salīdzināšanai. Faktiski tas aprēķina šo divu operandu starpību, bet neveido izvadoperandu, bet tikai maina bitus procesora statusa reģistrā, pamatojoties uz šīs atņemšanas rezultātu. Instrukcija, kas seko salīdzināšanas instrukcijai (parasti lēciena instrukcija), analizēs bitus procesora statusa reģistrā un veiks darbības, pamatojoties uz to vērtībām. Daži procesori nodrošina instrukcijas divu operandu secību salīdzināšanai atmiņā.

7 Loģiskās komandas. Loģiskās instrukcijas veic loģiskas (bitu) operācijas ar operandiem, tas ir, tās uzskata operanda kodus nevis kā vienu skaitli, bet gan par atsevišķu bitu kopu. Ar to tie atšķiras no aritmētiskie norādījumi. Loģiskās komandas veic šādas pamata darbības:

­ loģiskais UN, loģiskais VAI, modulo 2 pievienošana (XOR);

­ loģiskās, aritmētiskās un cikliskās nobīdes;

­ bitu un operandu pārbaude;

­ procesora statusa reģistra bitu (karodziņu) iestatīšana un dzēšana ( PSW).

Loģiskās instrukcijas ļauj pa bitiem aprēķināt loģiskās pamatfunkcijas no diviem ievades operandiem. Turklāt operācija UN tiek izmantota, lai piespiestu notīrīt dotos bitus (viens no operandiem ir maskas kods, kurā biti, kuriem nepieciešama dzēšana, ir iestatīti uz nulli). Operāciju VAI izmanto, lai piespiestu iestatītos bitus (kā viens no operandiem tiek izmantots maskas kods, kurā biti, kuriem nepieciešams iestatīt vienu, ir vienādi ar vienu). XOR operācija tiek izmantota doto bitu invertēšanai (kā viens no operandiem tiek izmantots maskas kods, kurā apgriežamie biti ir iestatīti uz vienu). Instrukcijām ir nepieciešami divi ievades operandi, un tie veido vienu izejas operandu.

8 Shift komandas ļauj pārvietot operanda kodu pa bitiem pa labi (virzienā uz zemākajiem bitiem) vai pa kreisi (virzienā uz augstākajiem bitiem). Nobīdes veids (būla, aritmētiskā vai cikliskā) nosaka, kāda būs jaunā nozīmīgākā bita vērtība (ja tiek pārvietota pa labi) vai vismazāk nozīmīga bita vērtība (ja tiek nobīdīta pa kreisi), kā arī nosaka, vai nozīmīgākā bita vecā vērtība bits tiks kaut kur saglabāts (ja tiek pārvietots pa kreisi) vai vismazāk nozīmīgais bits (ja tiek pārvietots pa labi). Rotācijas nobīdes ļauj pārvietot operanda koda bitus aplī (pulksteņrādītāja virzienā, pārslēdzot pa labi, vai pretēji pulksteņrādītāja virzienam, mainot pa kreisi). Šajā gadījumā pārslēgšanas gredzenā var būt vai var nebūt pārvadāšanas karoga. Pārnēsāšanas karoga bits (ja tiek izmantots) ir iestatīts uz visnozīmīgāko bitu pagriešanai pa kreisi un vismazāk nozīmīgo bitu pagriešanai pa labi. Attiecīgi pārnēsāšanas karoga bita vērtība tiks pārrakstīta uz vismazāk nozīmīgo bitu cikliskā nobīdē pa kreisi un uz visnozīmīgāko bitu cikliskās nobīdes pa labi.

9 Pārlēkšanas komandas. Pārlēkšanas komandas ir paredzētas visu veidu cilpu, zaru, apakšprogrammu izsaukumu utt. organizēšanai, tas ir, tās traucē programmas secīgo plūsmu. Šīs instrukcijas ieraksta jaunu vērtību instrukciju skaitītāja reģistrā un tādējādi liek procesoram pāriet nevis uz nākamo instrukciju pēc kārtas, bet uz jebkuru citu instrukciju programmas atmiņā. Dažas lēciena komandas ļauj atgriezties vietā, no kuras tika veikts lēciens, bet citas ne. Ja tiek nodrošināta atdeve, pašreizējie procesora parametri tiek saglabāti stekā. Ja netiek nodrošināta atdeve, pašreizējie procesora parametri netiek saglabāti.

Pārlēkšanas komandas bez atkāpšanās ir sadalītas divās grupās:

­ beznosacījuma lēcienu komandas;

­ nosacījuma lēciena instrukcijas.

Šīs komandas izmanto vārdus Branch (zars) un Jump (lēciens).

Beznosacījuma lēciena komandas izraisa lēcienu uz jauna adrese lai vai kas. Tie var izraisīt lēcienu uz norādīto nobīdes vērtību (uz priekšu vai atpakaļ) vai uz norādīto atmiņas adresi. Nobīdes vērtība vai jaunā adrese ir norādīta kā ievades operands.

Nosacīta lēciena komandas ne vienmēr izraisa lēcienu, bet tikai tad, ja ir izpildīti norādītie nosacījumi. Šādi nosacījumi parasti ir procesora statusa reģistrā esošo karogu vērtības ( PSW ). Tas ir, pārejas nosacījums ir iepriekšējās darbības rezultāts, kas maina karogu vērtības. Kopumā šādi lēciena nosacījumi var būt no 4 līdz 16. Daži nosacījuma lēciena komandu piemēri:

­ lēkt, ja vienāds ar nulli;

­ lēkt, ja nav nulle;

­ lēkt, ja ir pārplūde;

­ lēkt, ja nav pārplūdes;

­ lēkt, ja tas ir lielāks par nulli;

­ lēkt, ja mazāks par nulli vai vienāds ar to.

Ja pārejas nosacījums ir izpildīts, instrukciju skaitītāja reģistrā tiek ielādēta jauna vērtība. Ja lēciena nosacījums nav izpildīts, instrukciju skaitītājs tiek vienkārši palielināts, un procesors secīgi izvēlas un izpilda nākamo instrukciju.

Konkrēti, lai pārbaudītu atzaru nosacījumus, tiek izmantota salīdzināšanas instrukcija (CMP), kas ir pirms nosacījuma lēciena instrukcijas (vai pat vairākām nosacītā lēciena instrukcijām). Bet karogus var iestatīt ar jebkuru citu komandu, piemēram, datu pārsūtīšanas komandu, jebkuru aritmētisko vai loģisko komandu. Ņemiet vērā, ka pašas lēciena komandas nemaina karogus, kas tikai ļauj ievietot vairākas lēciena komandas vienu pēc otras.

Pārtraukšanas komandas ieņem īpašu vietu starp lēciena komandām ar atgriešanos. Šīm instrukcijām kā ievades operands ir nepieciešams pārtraukuma numurs (vektora adrese).

Secinājums:

Montāžas valoda ir mašīnvalodas simbolisks attēlojums. Montāžas valoda katram datora veidam ir atšķirīga. Montāžas valodas programma ir atmiņas bloku kolekcija, ko sauc par atmiņas segmentiem. Katrs segments satur valodas teikumu kopumu, no kuriem katrs aizņem atsevišķu programmas koda rindiņu. Montāžas paziņojumi ir četru veidu: komandas vai instrukcijas, makro, direktīvas, komentāru rindas.

Derīgās rakstzīmes, rakstot programmu tekstu, ir visi latīņu burti: A–Z,a-z. Šajā gadījumā lielie un mazie burti tiek uzskatīti par līdzvērtīgiem; skaitļi no 0 pirms tam 9 ; zīmes ? , @ , $ , _ , & ; atdalītāji , . () < > { } + / * % ! " " ? = # ^ .

Tiek piemēroti šādi montētāja priekšrakstu veidi un sintakses kārtulas montētāja izteiksmju veidošanai. aritmētiskie operatori, maiņas operatori, salīdzināšanas operatori, loģiskie operatori, indeksa operators, tipa pārdefinēšanas operators, segmenta atkārtotas definēšanas operators, struktūras tipa nosaukšanas operators, izteiksmes adreses segmenta iegūšanas operators, izteiksmes nobīdes iegūšanas operators.

Komandu sistēma ir sadalīta 8 galvenajās grupās.

­ Testa jautājumi:

1 Kas ir montāžas valoda?

2 Kādus simbolus var izmantot, lai rakstītu komandas montētājā?

3 Kas ir etiķetes un kāds ir to mērķis?

4 Izskaidrojiet montāžas instrukcijas struktūru.

5 Uzskaitiet 4 montētāja paziņojumu veidus.

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 instrukciju struktūra.

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

COM faila struktūra.

Kā vīruss darbojas un izplatās.

Demontētājs.

Programmas.

Priekšvārds

Programmētāja profesija ir pārsteidzoša un unikāla. Mūsu laikā zinātne un dzīve nav iedomājama bez jaunākajām tehnoloģijām. Bez visa, kas saistīts ar cilvēka darbību, neiztikt datorzinātne. Un tas veicina tā augsto attīstību un pilnību. Pat ja personālo datoru izstrāde sākās ne tik sen, bet šajā laikā programmatūras produktos tika sperti kolosāli soļi un ilgu laiku šie produkti tiks plaši izmantoti. Ar datoru saistīto zināšanu joma ir strauji paplašinājusies, tāpat kā ar to saistītā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 nodarbojas ar programmu izstrādi nevis peļņas vai peļņas gūšanai, bet pēc savas 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īva izpildījuma, pēc 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 bitu ietilpības un iebūvēto sistēmas komandu ziņā. Visizplatītākie ir: Intel, IBM, Celeron, AMD utt. Visi šie procesori ir saistīti ar Intel procesoru uzlaboto arhitektūru. Mikrodatoru izplatība ir izraisījusi divu galveno iemeslu dēļ attieksmes pret montāžas valodu pārdomāšanu. Pirmkārt, programmām, kas rakstītas montāžas valodā, ir nepieciešams ievērojami mazāk atmiņas un izpildlaika. Otrkārt, montāžas valodas un no tā izrietošā mašīnkoda zināšanas sniedz izpratni par mašīnas arhitektūru, kas diez vai tiek nodrošināta, strādājot augsta līmeņa valodā. Lai gan lielākā daļa programmatūras inženieru izstrādā augsta līmeņa valodas, piemēram, Pascal, C vai Delphi, kurās ir vieglāk rakstīt programmas, visspēcīgākais un efektīvākais. programmatūra pilnībā vai daļēji uzrakstī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 uzrakstītu montāžas valodas programmu konkrētam datoram, ir jāzina tās arhitektūra. Mūsdienās skats uz galveno programmatūras produkts ir EXE fails. Ņemot vērā pozitīvās puses par to programmas autors var būt drošs par tās neaizskaramību. Bet bieži vien tas ir tālu no tā. Ir arī demontētājs. Ar demontāžas palīdzību 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. Iespējams, no tā rodas visneatrisināmākā problēma - vīruss. Kāpēc cilvēki raksta vīrusus? Kāds uzdod šo jautājumu ar izbrīnu, kāds ar dusmām, bet tomēr joprojām ir cilvēki, kurus šis uzdevums interesē nevis no kāda kaitējuma nodarīšanas viedokļa, bet gan kā interese par sistēmas programmēšanu. Uzrakstiet vīrusus dažādi iemesli. Dažiem patīk sistēmas izsaukumi, citi uzlabo savas zināšanas montētājā. 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.

^ Montāžas valoda.

Interesanti ir sekot līdzi, sākot ar pirmo datoru parādīšanās laiku un beidzot ar mūsdienām, kā programmētāju vidū mainās priekšstats par montāžas valodu.

Kādreiz montētājs bija valoda, kuru nezinot, nebija iespējams likt datoram darīt kaut ko 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 viņš 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āžā, un idejas, kuras šī valoda atspoguļo.

Bez montētāja zināšanām nav iespējams īsti atrisināt ar aparatūru saistītas problēmas (vai pat, turklāt ar aparatūru saistītas, piemēram, programmas ātruma uzlabošana).

Programmētājs vai jebkurš cits lietotājs var izmantot jebkādus augsta līmeņa rīkus, līdz pat virtuālo pasauļu veidošanas programmām, un, iespējams, pat nenojauš, ka dators patiesībā izpilda nevis tās valodas komandas, kurā tā programma ir uzrakstīta, bet gan tās komandas. pārveidots attēlojums garlaicīgas un blāvas pilnīgi citas valodas - mašīnvalodas - komandu secību veidā. Tagad iedomāsimies, ka šādam lietotājam ir nestandarta problēma vai vienkārši kaut kas nogāja greizi. Piemēram, viņa programmai jādarbojas ar kādu neparastu ierīci vai jāveic citas darbības, kas prasa zināšanas par datora aparatūras 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 moduļu savienošanai ar moduļiem montētājā vai atbalsta piekļuvi montētāja programmēšanas līmenim.

Protams, datoru vagonu laiks jau pagājis. Kā 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. Personālā datora blokshēma

No attēla (1. attēls) var redzēt, 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. Loģiski, ka ir skaidrs, ka tas spēlē kādas koordinācijas ierīces lomu. Ieskatīsimies iekšā sistēmas bloks(nav jāmēģina tikt iekšā monitorā - nekā interesanta tur nav, turklāt tas ir bīstami): atveram korpusu un redzam kaut kādus 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 tā mērķis ir tikai parādīt 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ā.
Cilvēka dabā ir, tiekoties ar kaut ko jaunu, meklēt kādas asociācijas, kas viņam varētu palīdzēt izzināt nezināmo. Kādas asociācijas rada dators? Man, piemēram, dators bieži asociējas ar pašu cilvēku. Kāpēc?

Cilvēks, kas veido datoru kaut kur savā dziļumā, domāja, ka rada kaut ko līdzīgu sev. Datoram ir ārpasaules informācijas uztveršanas orgāni - tastatūra, pele, magnētiskie diskdziņi. Uz att. 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 izsniedz apstrādes rezultātus. Šīs ir arī dažas no labajā pusē esošajām ierīcēm.

Mūsdienu datori, protams, tālu no cilvēka. Tos var salīdzināt ar būtnēm, kas mijiedarbojas ar ārpasauli liela, bet ierobežota beznosacījumu refleksu kopuma līmenī.
Šis refleksu kopums veido mašīnas instrukciju sistēmu. Neatkarīgi no tā, cik augstā līmenī jūs sazināties ar datoru, galu galā tas viss izpaužas garlaicīgā un vienmuļā mašīnas instrukciju secībā.
Katra mašīnas komanda ir sava veida stimuls tā vai cita beznosacījuma refleksa ierosināšanai. Reakcija uz šo stimulu vienmēr ir nepārprotama un ir “iekļauta” mikrokomandu blokā mikroprogrammas veidā. Šī mikroprogramma realizē darbības mašīnas komandas izpildei, bet jau noteiktām doto 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 tie visi patiesībā ir tikai trauks, uz kura pārtika (programmas) tiek piegādāta saskaņā ar noteiktiem noteikumiem kuņģis (dators). Tikai datora kuņģis mīl diētisku, monotonu ēdienu - sniedziet tam strukturētu informāciju stingri organizētu nulles un vieninieku secību veidā, kuru kombinācijas veido mašīnu valodu.

Tādējādi, ārēji būdams 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 izdomāt dažādu bināro skaitļu kombināciju nozīmi, jo jau 50. gados programmētāji programmēšanai sāka izmantot mašīnvalodas simbolisko 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 iepriekš minētā varam secināt, ka, tā kā datora montāžas valoda ir “dzimtā”, visefektīvāko programmu var rakstīt tikai tajā (ar nosacījumu, ka to ir 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ā montētājs raksta galvenokārt programmas, kurām vajadzētu nodrošināt efektīvs darbs ar aparatūru. Dažreiz svarīgākās programmas daļas izpildes laika vai atmiņas patēriņa ziņā tiek ierakstītas montāžā. Pēc tam tie tiek veidoti 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ā ir 32 reģistri, kas vairāk vai mazāk ir pieejami programmētāja lietošanai.

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

^16 pielāgoti reģistri;

16 sistēmas reģistri.

Montāžas 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ģistri tiek saukti, jo programmētājs tos var izmantot, rakstot savas programmas. Šajos reģistros ietilpst (3. attēls):

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

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

statusa un kontroles reģistri:

Karogi reģistrē karogus/karodziņus;

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

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ītru? 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ākajiem Intel 16 bitu mikroprocesoru modeļiem rakstīto programmu darbību, 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 (sk. 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 tiek darīts, kā minēts iepriekš, lai nodrošinātu saderību ar jaunākiem Intel 16 bitu 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žās komandās 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.
To 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, cilpas organizācijas komanda 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žām komandām ir nepieciešams to izmantot; 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 avota ķēdes elementa pašreizējo adresi;

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

Mikroprocesora arhitektūrā aparatūras un programmatūras līmenī tiek atbalstīta tāda datu struktūra kā steks. Lai strādātu ar steku mikroprocesora instrukciju sistēmā, ir īpašas komandas un iekšā programmas modelisŠim mikroprocesoram 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 īslaicīgi saglabātajam datiem ir jāizveido atsevišķa nosaukta atmiņas šūna, kas palielina programmas izmēru un izmantoto nosaukumu skaitu. Steka ērtība ir tāda, ka tās apgabals tiek izmantots atkārtoti, un datu glabāšana stekā un to ienešana no turienes tiek veikta, izmantojot efektīvas 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 nopludināts no steka pēc atgriešanās no apakšprogrammas. 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 ņemt un izmantot savā izpildē. Atšķirīga iezīme steka ir sava veida tajā ietverto datu izlases secība: jebkurā laikā stekā ir pieejams tikai augšējais elements, t.i. pēdējais elements, kas ielādēts kaudzē. 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 (ti, 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ā jebkura cita programmas atmiņas joma, kaudze ir jāiekļauj kādā segmentā 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 pieejamās steka šūnas adresi: SS saglabā steka segmenta adresi, bet SP saglabā pēdējo stekā saglabāto datu nobīdi (4. att., a). Pievērsīsim uzmanību tam, 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 ar īpašu push steck komandu. Šī 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 jāizpilda komanda

Kaudze pāriet uz stāvokli, kas parādīts attēlā. 1.10, dz. Var redzēt, ka steka rādītājs tiek pārvietots par diviem baitiem uz augšu (pret zemākām adresēm), un šajā adresē tiek ierakstīts push komandā norādītais operands. Šāda komanda, lai ielādētu kaudzē, piemēram,

pārvietos kaudzi stāvoklī, kas parādīts attēlā. 1.10, c. Kaudzīte tagad saturēs divus elementus, piekļūstot tikai augšējam, uz kuru norāda steka rādītājs SP. Ja pēc kāda laika mums ir jāatjauno stekā saglabāto reģistru sākotnējais saturs, mums ir jāizpilda pop komandas (pop) 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, 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 pārtraukuma komandu int 21h. Ar šo komandu procesors vispirms nospiež atgriešanas adresi stekā, un pēc tam DOS nospiež tur 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ākiem desmitiem vārdu. Pirmajā piemērā mēs ievietojām steksā 128 vārdus, kas noteikti ir pietiekami.

^ Montāžas 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 no šiem bloka segmentiem. Katrs segments satur valodas teikumu kopumu, no kuriem katrs aizņem atsevišķu programmas koda rindiņu.

Montāžas paziņojumi ir četru veidu:

komandas vai instrukcijas, kas ir simboliski mašīnas instrukciju ekvivalenti. Tulkošanas procesā montāžas instrukcijas tiek pārveidotas attiecīgajās mikroprocesora instrukciju kopas komandās;

makrokomandas - programmas teksta teikumi, kas ir izstrādāti noteiktā veidā un tulkošanas laikā tiek aizstāti ar citiem teikumiem;

direktīvas, kas liek montētāja kompilatoram veikt kādu darbību. 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 valodas 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. Praktiskai lietošanai ērtākas ir sintakses diagrammas. 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. Assembler teikuma formāts

Rīsi. 6. Formatēt norādījumus

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

Uz šiem zīmējumiem:

etiķetes nosaukums - identifikators, kura vērtība ir tā apzīmētā programmas pirmkoda teikuma pirmā baita adrese;

nosaukums - identifikators, kas atšķir šo direktīvu no citām tāda paša nosaukuma direktīvām. Noteiktas direktīvas montētāja veiktās apstrādes rezultātā šim nosaukumam var piešķirt noteiktas īpašības;

darbības kods (COP) un direktīva ir atbilstošās mašīnas instrukcijas, makroinstrukcijas vai tulkotāja direktīvas mnemoniski apzīmējumi;

operandi - komandu, makro vai asamblera direktīvu daļas, kas apzīmē objektus, ar kuriem tiek veiktas darbības. Assembler operandi tiek aprakstīti ar izteiksmēm ar ciparu un teksta konstantēm, mainīgo etiķetēm un identifikatoriem, izmantojot darbības 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 (pa kreisi) līdz tās izvadei (pa labi). 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 apvedceļa virzienam, jo ​​starp ceļiem var būt tie, kuriem var sekot no labās uz kreiso pusi. Faktiski sintaktiskās diagrammas atspoguļo tulkotāja loģiku, analizējot programmas ievades teikumus.

Atļautās rakstzīmes, rakstot programmu tekstu, ir:

Visi latīņu burti: 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,. ()< > { } + / * % ! " " ? \ = # ^.

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

Tokeni ir:

identifikatori ir derīgu rakstzīmju secības, ko izmanto, lai apzīmētu programmas objektus, piemēram, opkodus, 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ā rakstzīmes varat izmantot latīņu alfabēta burtus, ciparus un dažas īpašā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 rakstzīmes un ignorē pārējās. Izmantojot opciju, varat pielāgot iespējamo identifikatoru garumu komandrinda mv. Turklāt ir iespējams likt tulkotājam atšķirt lielos un mazos burtus vai ignorēt to atšķirību (kas tiek darīts pēc noklusējuma).

^ Montāžas valodas komandas.

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

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ā ir norādītas karodziņu vērtības pēc komandas izpildes. Šajā gadījumā 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 lieluma baita, vārda vai dubultvārda reģistriem;

m8, m16, m32, m48 - operands atmiņas lielumā baiti, vārds, dubultvārds vai 48 biti;

i8, i16, i32 - tūlītējs operandi ar lieluma baitu, vārdu vai dubultvārdu;

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

^ Komandas izklāsts:

pievienot galamērķi, avotu

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

Darba algoritms:

pievienot avota un mērķa operandus;

ierakstiet uztvērējam pievienošanas rezultātu;

uzstādīt karogus.

Karogu statuss 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 mērķa operanda robežas (notiek pārpilde), tad šī situācija ir jāņem vērā, analizējot cf karogu un pēc tam, iespējams, izmantojot komandu adc. Piemēram, pievienosim vērtības reģistrā ax un atmiņas apgabalā ch. Pievienojot, jāņem vērā pārplūdes iespēja.

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

|000000dw|modregr/rm|

Reģistrēt AX (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

^ Komandas izklāsts:

Mērķis:

vadības pāreja uz tuvu vai tālu procedūru ar atgriešanas punkta adreses saglabāšanu stekā;

uzdevumu pārslēgšana.

Darba algoritms:
nosaka pēc operanda veida:

Etiķete ir tuvu - eip / ip komandas rādītāja saturs tiek uzspiests uz steku un tajā pašā reģistrā tiek ielādēta jauna etiķetei atbilstoša adreses vērtība;

Tāls apzīmējums — eip/ip un cs komandu rādītāja saturs tiek uzspiests uz steku. Pēc tam jaunās adreses vērtības, kas atbilst tālākajai atzīmei, tiek ielādētas tajos pašos reģistros;

R16, 32 vai m16, 32 - definējiet reģistru vai atmiņas šūnu, kas satur nobīdes pašreizējā instrukciju segmentā, kur 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 izsaucamo 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 slēdzi):

komandas izpilde neietekmē karogus

Pārslēdzot uzdevumu, 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īdziniet operandus)

Operandu salīdzinājums

^ Komandas izklāsts:

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, nesaglabājiet rezultātu).

Pielietojums:
Šī komanda izmanto, lai salīdzinātu divus operandus ar atņemšanu, kamēr operandi nemainās. Karogi tiek iestatīti komandas izpildes rezultātā. CMP instrukcija tiek izmantota ar nosacījuma lēciena instrukcijām un iestatīto baitu pēc vērtības instrukciju setcc.

Objekta kods (trīs formāti):

Reģistrācija vai reģistrētā atmiņa:

|001110dw|modreg/m|

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

|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

^ Komandas izklāsts:

dec operands

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

Darba algoritms:
instrukcija no operanda atņem 1. Karogu statuss pēc komandas izpildes:

Pielietojums:
Dec komandu izmanto, lai samazinātu baita, vārda, dubultvārda vērtību atmiņā vai reģistrā par vienu. Ņ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)

Nodaļa neparakstīta

Komandu shēma:

div dalītājs

Mērķis: veikt dalīšanas operāciju ar divām binārām neparakstītām vērtībām.

^ Darba 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 baitos, tad dividendei jāatrodas reģistra ax. Pēc operācijas koeficientu ievieto al un atlikušo daļu ah;

ja dalītājs ir vārds, tad dividendei jāatrodas reģistru pārī dx:ax, dividendes zemajai daļai ir jābūt ax. Pēc operācijas koeficientu ievieto axē un atlikumu dx;

ja dalītājs ir dubultvārds, tad dividendei jāatrodas reģistru pārī edx:eax, ar apakšējo dividendes daļu 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, atgriežot dalīšanas rezultātu kā koeficientu un dalījuma atlikumu. 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

^ Komandas izklāsts:

int pārtraukuma_numurs

Mērķis: izsaukt pārtraukuma pakalpojuma rutīnu ar pārtraukuma numuru, kas norādīts instrukcijas operandā.

^ Darba algoritms:

iespiediet karodziņu/karogu reģistru un atgriešanas adresi uz steku. Rakstot atgriešanas adresi, vispirms tiek ierakstīts cs segmenta reģistra saturs, pēc tam komandas eip/ip rādītāja saturs;

atiestatīt if un tf karogus uz nulli;

pārsūtīt vadību uz pārtraukumu apstrādātāju 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 operācijas kods 0cch un aizņem vienu baitu. Šis apstāklis ​​padara to ļoti ērtu izmantošanu dažādos programmatūras atkļūdoņos, lai iestatītu pārtraukuma punktus, aizstājot jebkuras instrukcijas pirmo baitu. Mikroprocesors, sastopoties ar komandu ar opkodu 0cch komandu secībā, izsauc pārtraukumu apstrādātāju ar vektora numuru 3, kas kalpo saziņai ar programmatūras atkļūdotāju.

Otrā instrukcijas forma ir divus baitus gara, 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 nodoš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|

AKK
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

^ Komandas izklāsts:

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

Mērķis: pāreja pašreizējā komandu 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 dodieties uz operanda norādīto šūnu;

ja pārbaudāmais nosacījums ir nepatiess, nododiet vadību nākamajai komandai.

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

ja pārbaudīts stāvoklis

Programmēšana mašīnas instrukciju līmenī ir minimālais līmenis, kurā ir iespējama programmēšana. Mašīnas instrukciju sistēmai jābūt pietiekamai, lai veiktu nepieciešamās darbības, izdodot instrukcijas datora aparatūrai.

Katra mašīnas instrukcija sastāv no divām daļām:

  • operāciju zāle - "ko darīt" noteikšana;
  • operands - apstrādes objektu definēšana, “ko darīt”.

Mikroprocesora mašīnas instrukcija, kas rakstīta montāžas valodā, ir viena rinda ar šādu sintaktisko formu:

etiķetes komanda/direktīva operands(-i) ;komentāri

Šajā gadījumā obligāts lauks rindā ir komanda vai direktīva.

Iezīme, komanda/direktīva un operandi (ja tādi ir) ir atdalīti ar vismaz vienu atstarpi vai tabulēšanas rakstzīmi.

Ja komanda vai direktīva jāturpina nākamajā rindā, tad tiek izmantota atpakaļvērstā slīpsvītra: \.

Pēc noklusējuma montāžas valoda komandās vai direktīvās neatšķir lielos un mazos burtus.

Koda rindu piemēri:

Countdb 1 ;Vārds, direktīva, viens operands
mov eax,0 ;Komanda, divi operandi
cbw ; Komanda

Tagi

Etiķete montāžas valodā var saturēt šādus simbolus:

  • 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, taču daži kompilatori attur šo rakstzīmi. Rezervēto montāžas valodu nosaukumus (direktīvas, operatorus, komandu nosaukumus) nevar izmantot kā etiķetes.

Etiķetes pirmajai rakstzīmei ir jābūt burtam vai speciālajai rakstzīmei (nevis ciparam). Maksimālais garums etiķetes - 31 rakstzīme. Visām etiķetēm, kas ir rakstītas uz rindas, kas nesatur montāžas direktīvu, jābeidzas ar kolu: .

Komandas

Komanda norāda tulkotājam, kāda darbība jāveic mikroprocesoram. Datu segmentā komanda (vai direktīva) definē lauku, darbvietu vai konstanti. Koda segmentā instrukcija definē darbību, piemēram, pārvietošanu (mov) vai pievienošanu (pievienošanu).

direktīvas

Montētājam ir vairāki operatori, kas ļauj kontrolēt saraksta salikšanas un ģenerēšanas procesu. Šos operatorus sauc direktīvas . Tie darbojas tikai programmas salikšanas procesā un atšķirībā no instrukcijām neģenerē mašīnkodus.

operandi

Operands – objekts, uz kura tiek izpildīta mašīnas komanda vai programmēšanas valodas operators.
Instrukcijā var būt viens vai divi operandi vai vispār nav operandu. Operandu skaitu netieši norāda instrukcijas kods.
Piemēri:

  • Nav operandu ret ;Atgriezties
  • Viens operands inc ecx ;Increment ecx
  • Divi operandi pievieno eax,12 ;Pievieno 12 to eax

Etiķetei, komandai (direktīvai) un operandam nav jāsākas nevienā noteiktā virknes pozīcijā. Tomēr ieteicams tos rakstīt kolonnā, lai nodrošinātu labāku programmas lasāmību.

Operandi var būt

  • identifikatori;
  • rakstzīmju virknes vienpēdiņās vai dubultpēdiņās;
  • veseli skaitļi binārā, oktālā, decimālā vai heksadecimālā veidā.
Identifikatori

Identifikatori – 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 noteikumi.

  • Identifikators var sastāvēt no vienas vai vairākām rakstzīmēm.
  • Kā rakstzīmes varat izmantot latīņu alfabēta burtus, ciparus un dažas īpašās rakstzīmes: _, ?, $, @.
  • Identifikators nevar sākties ar cipara rakstzīmi.
  • ID var būt līdz 255 rakstzīmēm garš.
  • Tulkotājs pieņem pirmās 32 identifikatora rakstzīmes un ignorē pārējās.
komentāri

Komentāri ir atdalīti no izpildāmās rindas ar rakstzīmi; . Šajā gadījumā viss, kas rakstīts aiz semikola rakstzīmes un līdz rindas beigām, ir komentārs. Komentāru izmantošana programmā uzlabo tās skaidrību, īpaši, ja instrukciju kopas mērķis ir neskaidrs. Komentārā var būt jebkuras drukājamas rakstzīmes, tostarp atstarpes. Komentārs var aptvert visu rindiņu vai sekot komandai tajā pašā rindā.

Montāžas programmas struktūra

Programma, kas rakstīta montāžas valodā, var sastāvēt no vairākām daļām, ko sauc moduļi . Katrs modulis var definēt vienu vai vairākus datu, steku un koda segmentus. Jebkurai pilnīgai montāžas valodas programmai ir jāietver viens galvenais vai galvenais modulis, no kura sākas tās izpilde. Modulis var saturēt kodu, datus un steka segmentus, kas deklarēti ar atbilstošām direktīvām. Pirms segmentu deklarēšanas ir jānorāda atmiņas modelis, izmantojot direktīvu .MODEL.

Programmas "neko nedarīšanas" piemērs montāžas valodā:

686P
.MODEL FLAT, STDCALL
.DATI
.CODE
SĀKT:

RET
BEIGAS SĀKT

Šajā programmā ir tikai viena mikroprocesora instrukcija. Šī komanda ir RET. Tas nodrošina pareizu programmas pārtraukšanu. Parasti šī komanda tiek izmantota, lai izietu no procedūras.
Pārējā programmas daļa ir saistīta ar tulka darbību.
.686P — 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. Burts P direktīvas beigās norāda tulkotājam, ka procesors darbojas aizsargātā režīmā.
.MODEL FLAT, stdcall ir plakanas atmiņas modelis. Šis atmiņas modelis tiek izmantots operētājsistēmā Windows. stdcall
.DATA ir programmas segments, kas satur datus.
.CODE ir programmas bloks, kas satur kodu.
START ir etiķete. Assembleerā liela loma ir etiķetēm, ko nevar teikt par mūsdienu augsta līmeņa valodām.
END START - programmas beigas un ziņojums tulkotājam, ka programma jāsāk no etiķetes START .
Katrā modulī ir jābūt END direktīvai, kas iezīmē beigas avota kods programmas. Visas rindas, kas seko END direktīvai, tiek ignorētas. Izlaižot END direktīvu, rodas kļūda.
Etiķete pēc direktīvas END norāda kompilatoram 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 instrukciju struktūra Programmēšana mašīnas instrukciju līmenī ir minimālais līmenis, kurā ir iespējama datorprogrammēšana. Mašīnas instrukciju sistēmai jābūt pietiekamai, lai veiktu nepieciešamās darbības, izdodot instrukcijas mašīnas aparatūrai. Katra mašīnas instrukcija sastāv no divām daļām: darbības daļas, kas definē “ko darīt”, un operanda, kas definē apstrādes objektus, tas ir, “ko darīt”. Mikroprocesora mašīnas instrukcija, kas rakstīta montāžas valodā, ir viena rinda, kuras forma ir šāda: etiķetes instrukcija/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. Instrukciju operandi ir atdalīti ar komatiem.

Montāžas valodas instrukcijas struktūra Asamblejas valodas instrukcija norāda kompilatoram, 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 jādarbojas ar instrukciju (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ā, tad tiek izmantota atpakaļvērstā slīpsvītra: "" . Pēc noklusējuma montētājs komandās un direktīvās neatšķir lielos un mazos burtus. 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 identifikatora garums ir 255 rakstzīmes, bet tulkotājs pieņem pirmās 32 rakstzīmes 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ā noteiktā virknes pozīcijā. 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ā noteiktā virknes pozīcijā. 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 instrukciju 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āri. Komentārā var būt jebkuras drukājamas rakstzīmes, tostarp "atstarpe". Komentārs var aptvert visu rindiņu vai sekot komandai tajā pašā rindā.

Asamblejas valodas programmas struktūra Montāžas valodas programma 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 montāžas valodas programmai ir jāietver viens galvenais vai galvenais modulis, no kura sākas tās izpilde. Modulis var saturēt programmu, datus un steka segmentus, kas deklarēti ar atbilstošām direktīvām.

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 Pamata montāžas valodas atmiņas modeļi: Atmiņas modelis Koda adresēšana Datu adresēšana Operētājsistēma Atļauta kodu un datu savstarpēja iejaukšana MAZĀ TĀLU MS-DOS, Windows nav VIDĒJI TĀLU MS-DOS, Windows nav KOMPAKTA TĀLU MS-DOS, Windows nav LIELU TĀLU MS-DOS, Windows nav MILZĪGI TĀLU MS-DOS, Windows NĒ TUVUMĀ Windows 2000, Windows XP, Windows atļauts 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. Dati un kods, izmantojot šo modeli, tiek adresēti kā tuvu (tuvu). Vides modelis atbalsta vairākus koda segmentus un vienu datu segmentu, un visas saites koda segmentos pēc noklusējuma tiek uzskatītas par tālu (tālu), un saites datu segmentā tiek uzskatītas par tuvu (tuvu). Kompaktais modelis atbalsta vairākus datu segmentus, kas izmanto tālu datu adresēšanu (tālu) un vienu koda segmentu, kas izmanto tuvu datu adresēšanu (tuvu). Lielais modelis atbalsta vairākus koda segmentus un vairākus datu segmentus. Pēc noklusējuma visas kodu un datu atsauces 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 ne-segmentē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 tajā pašā 32 bitu segmentā. 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 komandu 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, kā parametri tiek nodoti, 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_param ir iestatīts uz: NEARSTACK (SS reģistrs ir vienāds ar DS, dati un steka reģioni atrodas vienā fiziskajā segmentā) FARSTACK (SS reģistrs nav vienāds ar DS, dati un steka reģioni atrodas dažādos fiziskajos segmentos). Noklusējums ir NEARSTACK.

Programmas "neko nedarīšanas" piemērs. 686 P. MODELIS DZĪVOKLIS, STDCALL. DATI. CODE START: RET END START RET - mikroprocesora komanda. Tas nodrošina pareizu programmas pārtraukšanu. Pārējā programmas daļa ir saistīta ar 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 ir procedūra, kas izmanto izsaukšanas konvenciju.

Programmas "neko nedarīšanas" piemērs. 686 P. MODELIS DZĪVOKLIS, STDCALL. DATI. KODA SĀKUMS: RET END START START . DATA - programmas segments, kas satur datus. Šī programma neizmanto steku, tāpēc segmentējiet. Trūkst STACK. . KODS - programmas segments, kas satur kodu. START - etiķete. END START - programmas beigas un ziņojums kompilatoram, ka programma jāsāk no etiķetes START. Katrā programmā ir jābūt END direktīvai, kas iezīmē programmas pirmkoda beigas. Visas rindas, kas seko direktīvai END, tiek ignorētas.Etiķete pēc direktīvas END norāda kompilatoram 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 ir programma vai tehniskajiem līdzekļiem A, kas pārvērš programmu vienā no programmēšanas valodām par programmu 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 kopums, kas bieži vien nav saderīgs ar neko citu. Galvenie montāžas valodas tulkotāju veidi ir: 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) - a. Bezmaksas montāžas programmu Intel x arhitektūrai 86 izveidoja Saimons Tehems kopā ar Džulianu Holu, un pašlaik to izstrādā neliela Source izstrādes komanda. Kalts. tīkls.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="(!LANG:Programmas tulkošana programmā Microsoft Visual Studio 2005 1) Izveidojiet projektu, atlasot Fails->Jauns->Projekts 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="(!LANG:Programmas tulkošana programmā Microsoft Visual Studio 2005 2) Projekta kokā (View->Solution Explorer) pievienojiet"> Трансляция программы в 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 opcijas. Labajā pogā projekta faila izvēlnē atlasiet Pielāgoti veidošanas noteikumi…

Programmas tulkošana programmā Microsoft Visual Studio 2005 un parādītajā logā atlasiet Microsoft Macro Assembler.

Programmas tulkojums programmā Microsoft Visual Studio 2005 Pārbaudiet ar labo pogu failā hello. projekta koka asm no izvēlnes Rekvizīti un iestatiet General-> Tool: Microsoft Macro Assembler.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="(!LANG: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 Programmēšana operētājsistēmā Windows balstās uz API funkciju izmantošanu (Application Program Interface, t.i., programmatūras lietojumprogrammas interfeiss). To skaits sasniedz 2000. Programma Windows lielā mērā 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 vietas adresi noteiks viena 32 bitu reģistra saturs. Operētājsistēmai Windows ir 3 veidu programmu struktūras: dialogs (galvenais logs ir dialogs), konsole jeb bezlogu struktūra, klasiskā struktūra (logs, rāmis).

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

Windows API funkciju izsaukšana ziņojumā. Kaste (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 virknes rādītājs, UINT ir 32 bitu vesels skaitlis. Sufikss "A" bieži tiek pievienots funkciju nosaukumiem, lai pārietu uz jaunākām funkciju versijām.

Windows API funkciju izsaukšana ziņojumā. Kaste (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 reiz 4 (baiti katrā argumentā): N=4*n. Lai izsauktu funkciju, tiek izmantota montētāja instrukcija CALL. Šajā gadījumā visi funkcijas argumenti tiek nodoti tai caur steku (PUSH komanda). Argumenta nodošanas virziens: NO KREISĀS UZ LABĀJĀM — APAKŠU AUGŠU. Arguments u vispirms tiks ievietots kaudzē. veids. Norādītās funkcijas izsaukšana izskatīsies šādi: CALL Message. kaste. [aizsargāts ar e-pastu]

Windows API funkciju izsaukšana ziņojumā. Kaste (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 ir "segmenta nobīde" vai augsta līmeņa valodas terminos "rādītājs" uz virknes sākumu. EQU direktīva, tāpat kā #define C, definē konstanti. EXTERN direktīva norāda kompilatoram, 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ĒJĀ ziņa. kaste. [aizsargāts ar e-pastu]: TUVUMĀ. KODA SĀKUMS: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Ziņojums. kaste. [aizsargāts ar e-pastu] RET END START START

Direktīva INVOKE Valodas MASM tulkotājs arī ļauj vienkāršot funkcijas izsaukumu, 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ā. tulkotāja makro nospiež parametrus stekā. 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




Tops