Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Mendime mbi programimin në gjuhën e asamblesë. Zhytja në montues

Sot ka një numër të madh të gjuhëve programuese të nivelit të lartë. Në sfondin e tyre, programimi në një gjuhë të nivelit të ulët - gjuhën e asamblesë - mund të duket në shikim të parë si diçka e vjetëruar dhe joracionale. Megjithatë, duket se është vetëm. Duhet pranuar se asembleri është në të vërtetë gjuha e procesorit, që do të thotë se nuk mund të shpërndahet për sa kohë që ekzistojnë procesorët. Përparësitë kryesore të programimit në gjuhën e asamblesë janë shpejtësia maksimale dhe madhësia minimale e programeve që rezultojnë.

Disavantazhet janë shpesh për shkak të tendencës së tregut modern për të preferuar sasinë mbi cilësinë. Kompjuterët modernë mund të përballen lehtësisht me grumbullin e komandave të funksioneve të nivelit të lartë, dhe nëse nuk është e lehtë - ju lutemi përmirësoni harduerin e makinës suaj! Ky është ligji i programimit komercial. Nëse po flasim për programim për shpirtin, atëherë një program kompakt dhe i shkathët, i shkruar në gjuhën e asamblesë, do të lërë një përshtypje shumë më të këndshme sesa një zhurmë e nivelit të lartë, e ngarkuar me një mori operacionesh të panevojshme. Ekziston një mendim se vetëm disa të përzgjedhur mund të programojnë në gjuhën e asamblesë. Nuk eshte e vertete. Sigurisht, programuesit e talentuar të montimit mund të numërohen nga njëra anë, por ky është rasti pothuajse në çdo fushë të veprimtarisë njerëzore. Nuk ka aq shumë shoferë asistësh, por të gjithë do të jenë në gjendje të mësojnë se si të drejtojnë një makinë - do të kishte një dëshirë. Pasi të keni lexuar këtë seri artikujsh, nuk do të bëheni një haker i ashpër. Sidoqoftë, do të merrni një përmbledhje dhe do të mësoni mënyra të thjeshta për të programuar në gjuhën e asamblesë për Windows duke përdorur funksionet e tij të integruara dhe udhëzimet makro të përpiluesit. Natyrisht, për të zotëruar programimin e Windows, duhet të keni aftësi dhe përvojë në Windows. Në fillim, nuk do të kuptoni shumë, por mos u dekurajoni për shkak të kësaj dhe lexoni më tej: me kalimin e kohës, gjithçka do të bjerë në vend.

Pra, për të filluar programimin, do të na duhet të paktën një përpilues. Një përpilues është një program që përkthen kodin burimor të shkruar nga një programues në kodin e makinës që mund të ekzekutohet nga një procesor. Pjesa më e madhe e mësimeve të gjuhës së asamblesë fokusohet në përdorimin e paketës MASM32 (Microsoft Macro Assembler). Por unë, në formën e shumëllojshmërisë dhe për një sërë arsyesh të tjera, do t'ju njoh me përpiluesin e ri që po fiton popullaritet të shpejtë FASM (Flat Assembler). Ky përpilues është mjaft i lehtë për t'u instaluar dhe përdorur, është kompakt dhe i shpejtë, ka një sintaksë makro të pasur dhe të gjerë që ju lejon të automatizoni shumë detyra rutinë. Ju mund të shkarkoni versionin e tij më të fundit nga faqja e internetit duke zgjedhur assembler të sheshtë për Windows. Për të instaluar FASM, krijoni një dosje, për shembull "D: \ FASM" dhe shpaketoni përmbajtjen e arkivit zip të shkarkuar në të. Ekzekutoni FASMW.EXE dhe mbylleni pa ndryshuar asgjë. Meqë ra fjala, nëse jeni duke përdorur një eksplorues standard dhe zgjerimi i skedarit nuk shfaqet (për shembull, .EXE), unë rekomandoj të ekzekutoni Mjetet -> Opsionet e dosjeve -> Shikoni dhe hiqni kutinë e kontrollit Fshih shtesat për llojet e skedarëve të regjistruar. Pas nisjes së parë të përpiluesit, një skedar konfigurimi duhet të shfaqet në dosjen tonë - FASMW.INI. Hapeni atë me një bllok shënimesh standarde dhe shtoni 3 rreshta në fund:

Fasminc = D: \ FASM \ PËRFSHIJ
Përfshi = D: \ FASM \ PËRFSHIJ

Nëse e keni shpaketuar FASM në një vend tjetër, zëvendësoni "D: \ FASM \" me rrugën tuaj. Ruani dhe mbyllni FASMW.INI. Duke parë përpara, unë do të shpjegoj shkurtimisht se si do ta përdorim përpiluesin:
1. Shkruajmë tekstin e programit, ose hapim tekstin e shkruar më parë të ruajtur në skedarin .asm, ose ngjitim tekstin e programit nga clipboard me një kombinim.
2. Shtypni F9 për të përpiluar dhe ekzekutuar programin, ose Ctrl + F9 vetëm për përpilim. Nëse teksti i programit nuk është ruajtur ende, përpiluesi do t'ju kërkojë ta ruani atë përpara kompilimit.
3. Nëse programi ka filluar, ne e testojmë atë për funksionimin e saktë; nëse jo, ne kërkojmë gabime, më të papërpunuara nga të cilat përpiluesi do të na tregojë ose do të na nënkuptojë me hollësi.
Epo, tani mund të fillojmë praktikën e shumëpritur. Ne lançojmë FASMW.EXE tonë dhe shkruajmë kodin e programit tonë të parë në të:

Përfshi "% fasminc% / win32ax.inc"

Të dhënat
Titulli db "Programi im i parë.", 0
Teksti db "Përshëndetje të gjithëve!", 0

Kodi
filloni:

thirrni ExitProcess, 0

Klikoni Run -> Run ose F9 në tastierën tuaj. Në dritaren e ruajtjes, specifikoni emrin e skedarit dhe dosjen për ruajtje. Këshillohet që të mësoheni të ruani çdo program në një dosje të veçantë, në mënyrë që të mos ngatërroheni në të ardhmen, kur secili program mund të ketë një mori skedarësh: fotografi, ikona, muzikë etj. Nëse përpiluesi gjeneron një gabim, kontrolloni me kujdes rreshtin e specifikuar - ndoshta keni humbur një presje ose një hapësirë. Ju gjithashtu duhet të jeni të vetëdijshëm se përpiluesi është i ndjeshëm ndaj shkronjave të vogla, kështu që të dhënat dhe të dhënat trajtohen si dy udhëzime të ndryshme. Nëse keni bërë gjithçka në mënyrë korrekte, atëherë rezultati do të jetë MessageBox më i thjeshtë (Fig. 1). Tani le të kuptojmë se çfarë kemi shkruar në tekstin e programit. Në rreshtin e parë, me direktivën e përfshirjes, ne kemi përfshirë një tekst të madh nga disa skedarë në programin tonë. Mos harroni, gjatë instalimit, ne kemi shkruar 3 rreshta në skedarin ini FASM? Tani% fasminc% në tekstin e programit do të thotë D: \ FASM \ INCLUDE ose shtegun që keni specifikuar. Direktiva e përfshirjes, si të thuash, fut tekst nga një skedar tjetër në vendndodhjen e specifikuar. Hapni skedarin WIN32AX.INC në dosjen e përfshirjes duke përdorur notepad ose në vetë fasma dhe sigurohuni që të kemi përfshirë (bashkangjitur) automatikisht në programin tonë tekstin nga win32a.inc, macro / if.inc, një mori të pakuptueshme (ende ) udhëzime makro dhe një grup i zakonshëm i bibliotekave të funksioneve të Windows. Nga ana tjetër, secili nga skedarët e përfshirë mund të përmbajë disa skedarë të tjerë të përfshirë dhe ky zinxhir mund të shkojë përtej horizontit. Me ndihmën e skedarëve të përfshirë, ne organizojmë një lloj gjuhe të nivelit të lartë: për të shmangur rutinën e përshkrimit manual të secilit funksion, ne lidhim biblioteka të tëra për përshkrimin e funksioneve standarde të Windows. A është vërtet e nevojshme e gjithë kjo për një program kaq të vogël? Jo, ky është diçka si një "set zotëri për të gjitha rastet". Hakerat e vërtetë, natyrisht, nuk lidhin gjithçka, por ne thjesht po mësojmë, kështu që kjo është e falshme për herë të parë.

Më pas, ne kemi caktuar seksionin e të dhënave - .data. Në këtë seksion, ne po deklarojmë dy variabla - Caption dhe Text. Këto nuk janë komanda speciale, kështu që emrat e tyre mund të ndryshohen sipas dëshirës, ​​edhe nëse a dhe b, qoftë vetëm pa hapësira dhe jo në Rusisht. Epo, nuk mund të telefononi variabla me fjalë të rezervuara, për shembull, kod ose të dhëna, por mund të kodoni_ ose data1. Komanda db do të thotë "përcaktoni bajtin". Natyrisht, i gjithë ky tekst nuk do të futet në një bajt, sepse çdo karakter individual merr një bajt të tërë. Por në këtë rast, ne përcaktojmë vetëm një ndryshore treguese me këtë komandë. Ai do të përmbajë adresën ku ruhet karakteri i parë i vargut. Teksti i vargut tregohet në thonjëza, dhe thonjëzat, nëse dëshironi, mund të vendosen si "të tillë" dhe "të tillë" - nëse vetëm thonjëza fillestare është e njëjtë me atë të fundit. Zero pas presjes shton një bajt null në fund të vargut, i cili tregon fundin e vargut (null-terminator). Mundohuni ta hiqni këtë zero së bashku me presjen në rreshtin e parë dhe shikoni se çfarë merrni. Në rreshtin e dytë në këtë shembull të veçantë, mund të bëni pa zero (ne e heqim atë së bashku me presjen - përndryshe përpiluesi do të tregojë një gabim), por kjo do të funksionojë vetëm sepse në shembullin tonë, seksioni tjetër fillon menjëherë pas të dytës rreshti, dhe përpiluesi automatikisht do të fusë një tufë zerosh që rreshtojnë seksionin e mëparshëm. Në përgjithësi, zero në fund të rreshtave të tekstit janë të nevojshme! Seksioni tjetër është seksioni i kodit të programit të ekzekutueshëm - .code. Në fillim të seksionit ka një fillim: etiketë. Do të thotë që nga ky vend programi ynë do të fillojë të ekzekutohet. Komanda e parë është makroinstruksioni i thirrjes. Ai thërret API-në e integruar të MessageBox të Windows. Funksionet API (ndërfaqja e programimit të aplikacionit) thjeshtojnë shumë punën në sistemin operativ. Ne i kërkojmë sistemit operativ të kryejë një veprim standard, dhe ai kryen dhe pas përfundimit na kthen rezultatin e punës së bërë. Emri i funksionit ndiqet nga parametrat e tij, të ndarë me presje. Funksioni MessageBox ka parametrat e mëposhtëm:

Parametri i parë duhet të përmbajë dorezën e dritares së pronarit. Një dorezë është diçka si një numër personal që lëshohet nga sistemi operativ për çdo objekt (proces, dritare, etj.). 0 në shembullin tonë do të thotë që dritarja nuk ka pronar, është në vetvete dhe nuk varet nga asnjë dritare tjetër.
Parametri i dytë është një tregues për adresën e shkronjës së parë të tekstit të mesazhit, që përfundon me terminatorin e sipërpërmendur null. Për të kuptuar qartë se kjo është vetëm një adresë, le ta zhvendosim këtë adresë me 2 bajt pikërisht në thirrjen e funksionit: thirrni MessageBox, 0, Text + 2, Caption, MB_OK dhe sigurohuni që tani teksti të shfaqet pa dy shkronjat e para. .
3 - treguesi i adresës së shkronjës së parë të kokës së mesazhit.
4 - stili i mesazhit. Ju mund të gjeni një listë të këtyre stileve, për shembull, në INCLUDE \ EQUATES \ USER32.INC. Për ta bërë këtë, është më mirë të përdorni një kërkim në Notepad për të gjetur shpejt MB_OK dhe pjesën tjetër. Atje, për fat të keq, nuk ka përshkrim, por nga emri i stilit zakonisht mund të merret me mend qëllimi i tij. Nga rruga, të gjitha këto stile mund të zëvendësohen me një numër që nënkupton një stil ose një kombinim të tyre, për shembull: MB_OK + MB_ICONEXCLAMATION. USER32.INC përmban vlera heksadecimal. Mund t'i përdorni në këtë formë ose t'i konvertoni në dhjetore në modalitetin inxhinierik të Llogaritësit standard të Windows. Nëse nuk jeni njohur me sistemet e numrave dhe nuk e dini se si ndryshon dhjetori nga heksadecimal, atëherë keni 2 rrugëdalje: ose të njiheni me këtë çështje në internet / në një libër shkollor / pyesni një mik, ose lini këtë sipërmarrje derisa më mirë herë dhe përpiquni të bëni pa këtë informacion. Këtu nuk do të jap as informacion të shkurtër për sistemet e numrave, duke pasur parasysh faktin se edhe pa mua një numër i madh artikujsh dhe faqesh të çdo niveli të imagjinueshëm janë shkruar për to.

Le të kthehemi te deshët tanë. Disa stile nuk mund të përdoren në të njëjtën kohë - për shembull, MB_OKCANCEL dhe MB_YESNO. Arsyeja është se shuma e vlerave të tyre numerike (1 + 4 = 5) do të përputhet me vlerën e një stili tjetër - MB_RETRYCANCEL. Tani eksperimentoni me parametrat e funksionit për ta bërë materialin më praktik dhe ne vazhdojmë. Funksioni MessageBox ndalon ekzekutimin e programit dhe pret veprimin e përdoruesit. Pas përfundimit, funksioni kthen rezultatin e veprimit të përdoruesit në program dhe programi vazhdon të funksionojë. Thirrja në funksionin ExitProcess përfundon procesin e programit tonë. Ky funksion ka vetëm një parametër, kodin e daljes. Zakonisht, nëse programi del normalisht, ky kod është zero. Për të kuptuar më mirë rreshtin e fundit të kodit tonë - .end start - studioni me kujdes kodin ekuivalent: formatoni PE GUI 4.0

përfshin "% fasminc% / win32a.inc"

seksioni ".data" të dhëna të lexueshme të shkruhen

Titulli db "Programi ynë i parë.", 0
Teksti db "Mobiluesi FASM është i lehtë!", 0

seksioni ".code" kod i lexueshëm i ekzekutueshëm
filloni:
thirrni MessageBox, 0, Text, Caption, MB_OK
thirrni ExitProcess, 0

seksioni ".idata" importon të dhëna të lexueshme të lexueshme
biblioteka KERNEL32, "KERNEL32.DLL", \
USER32, "USER32.DLL"

importoni KERNEL32, \
Procesi i daljes, "Procesi i daljes"

importo USER32, \
MessageBox, "MessageBoxA"

Për kompajlerin, është pothuajse identik me shembullin e mëparshëm, por për ne ky tekst duket si një program tjetër. Unë citova posaçërisht këtë shembull të dytë, në mënyrë që që në fillim të merrni një ide për përdorimin e makroinstruksioneve dhe tani e tutje, duke kaluar nga një skedar i lidhur në tjetrin, të arrini në mënyrë të pavarur në kodin e vërtetë të programit të fshehur nën velin e makrove. Le të përpiqemi të kuptojmë dallimet. Gjëja e parë, jo shumë e habitshme, por e denjë për vëmendje të veçantë, është se ne po lidhemi me tekstin e programit jo win32ax, por vetëm win32a. Ne kemi braktisur një grup të madh dhe jemi kufizuar në një të vogël. Ne do të përpiqemi të bëjmë pa lidhur gjithçka me radhë nga win32ax, megjithëse ne kemi ende nevojë për një pjesë të saj për momentin. Prandaj, sipas makrove nga win32ax, ne shkruajmë manualisht disa përkufizime. Për shembull, një makro nga skedari win32ax:
makro .data (seksioni ".data" të dhëna të lexueshme të lexueshme)

në kohën e përpilimit, zëvendëson automatikisht.data me seksionin ".data" të dhëna të lexueshme të shkrimshme. Meqenëse nuk e kemi përfshirë këtë makro në tekstin e programit, duhet të shkruajmë vetë një përkufizim të detajuar të seksionit. Për analogji, ju mund të gjeni arsyet për pjesën tjetër të modifikimeve në tekstin e programit në shembullin e dytë. Makrot ju ndihmojnë të shmangni telashet e shkrimit të programeve të mëdha. Prandaj, thjesht duhet të mësoheni me to menjëherë, dhe do t'i doni vetëm më vonë =). Mundohuni të kuptoni vetë ndryshimet midis shembullit të parë dhe të dytë, duke përdorur tekstin e makrove të përdorura në win32ax. Unë thjesht do të them se në thonjëza mund të specifikoni çdo emër tjetër për një seksion ose kod të dhënash - për shembull: kodi i seksionit "virus" i lexueshëm i ekzekutueshëm. Ky është vetëm një emër seksioni dhe nuk është një komandë apo operator. Nëse i kuptoni të gjitha, atëherë tashmë mund të shkruani virusin tuaj. Më besoni, është shumë e lehtë. Thjesht ndryshoni titullin dhe trupin e postimit:
Titulli db "Virus i rrezikshëm.", 0

Teksti db "Përshëndetje, unë jam një virus trojan veçanërisht i rrezikshëm dhe po përhapem në internet.", 13, \
"Meqenëse autori im nuk mund të shkruajë viruse të dëmshme, ju duhet të më ndihmoni.", 13, \
"Ju lutemi bëni sa më poshtë:", ​​13, \
"1.Fshini drejtoritë C: \ Windows dhe C: \ Program skedarët në diskun tuaj", 13, \
"2.Dërgoji këtë skedar të gjithëve që njeh", 13, \
"Faleminderit paraprakisht.", 0

Numri 13 është kodi i karakterit të kthimit të karrocës për sistemet e Microsoft. Karakteri \ përdoret në sintaksën FASM për të kombinuar linja të shumta në një, pa të do të ishte shumë e gjatë një rresht që del nga skaji i ekranit. Për shembull, ne mund të shkruajmë start:, ose mund të shkruajmë st \
ar \
t:

Përpiluesi nuk do të vërejë ndryshimin midis opsionit të parë dhe të dytë.
Epo, për të rritur guximin në "virusin" tonë, mund të zëvendësoni MB_OK me MB_ICONHAND ose thjesht numrin 16. Në këtë rast, dritarja do të ketë stilin e një mesazhi gabimi dhe do të prodhojë një efekt më mbresëlënës tek viktima e "infeksion" (Fig. 2).

Kaq për sot. Ju uroj suksese dhe shihemi së shpejti!
Të gjithë shembujt e dhënë janë testuar për të punuar si duhet në Windows XP dhe ka shumë të ngjarë të funksionojnë në versione të tjera të Windows, megjithatë unë nuk jap asnjë garanci se ata do të funksionojnë siç duhet në kompjuterin tuaj. Në forum mund t'i gjeni kodet burimore të programeve.

Programimi në gjuhën e Asamblesë

Kjo pjesë e kursit mbulon bazat e programimit të gjuhës së asamblesë për arkitekturën Win32.

Të gjitha proceset në një makinë në nivelin më të ulët të harduerit drejtohen vetëm nga komandat (udhëzimet) e gjuhës së makinës. Gjuha e asamblesë është një paraqitje simbolike e një gjuhe makine... Assembler ju lejon të shkruani programe të shkurtra dhe të shpejta. Megjithatë, ky proces kërkon shumë kohë. Për të shkruar programin më efektiv, ju duhet një njohuri e mirë e veçorive të komandave të gjuhës së asamblesë, vëmendjes dhe saktësisë. Prandaj, në realitet, kryesisht programet shkruhen në gjuhën e asamblesë, e cila duhet të sigurojë punë efikase me harduerin. Gjithashtu, pjesët e programit që janë kritike për sa i përket kohës së ekzekutimit ose konsumit të memories shkruhen në gjuhën e asamblesë. Më pas, ato formatohen si nënprograme dhe kombinohen me kodin e gjuhës së nivelit të lartë.

1. Regjistrat

Regjistrat janë lokacione të veçanta memorie të vendosura direkt në procesor. Puna me regjistra është shumë më e shpejtë se puna me qelizat e memories; prandaj, regjistrat përdoren në mënyrë aktive si në programet e gjuhës së asamblesë ashtu edhe nga përpiluesit e gjuhëve të nivelit të lartë.

Regjistrat mund të ndahen në regjistrat e përgjithshëm,treguesi i komandës,regjistrat e flamurit dhe regjistrat e segmenteve.

1.1. Regjistrat për qëllime të përgjithshme

TE regjistrat për qëllime të përgjithshme janë një grup prej 8 regjistrash që mund të përdoren në një program në gjuhën e asamblesë. Të gjithë regjistrat janë me madhësi 32 bit dhe mund të ndahen në 2 ose më shumë pjesë.

Siç mund ta shihni nga figura, regjistrat ESI, EDI, ESP dhe EBP ju lejojnë të aksesoni 16 bitet më të ulët me emrat SI, DI, SP dhe BP, përkatësisht, ndërsa regjistrat EAX, EBX, ECX dhe EDX ju lejojnë për të hyrë në 16 bitët më të ulët (me emrat AX , BX, CX dhe DX), dhe në dy bajtë më pak të rëndësishëm veçmas (me emrat AH / AL, BH / BL, CH / CL dhe

Emrat e regjistrave vijnë nga qëllimi i tyre:

EAX / AX / AH / AL (regjistri akumulator) - akumulator;

EBX / BX / BH / BL (regjistri bazë) - regjistri bazë;

ECX / CX / CH / CL (regjistri i sportelit) - numërues;

EDX / DX / DH / DL (regjistri i të dhënave) - regjistri i të dhënave;

ESI / SI (regjistri i indeksit të burimit) - indeksi i burimit;

EDI / DI (regjistri i indeksit të destinacionit) - indeksi i marrësit (marrësit);

ESP / SP (regjistri i treguesit të stivës) - regjistri i treguesve të stivës;

EBP / BP (regjistri i treguesit bazë) - regjistri i treguesit bazë të kornizës së pirgut.

Pavarësisht specializimit ekzistues, të gjithë regjistrat mund të përdoren në çdo operim makinerie. Megjithatë, duhet marrë parasysh fakti se disa komanda funksionojnë vetëm me regjistra të caktuar. Për shembull, udhëzimet e shumëzimit dhe pjesëtimit përdorin regjistrat EAX dhe EDX për të ruajtur të dhënat origjinale dhe rezultatin e operacionit. Udhëzimet e kontrollit të ciklit përdorin regjistrin ECX si numërues të ciklit.

Një nuancë tjetër është përdorimi i regjistrave si bazë, d.m.th. adresat e ruajtjes së RAM-it. Çdo regjistër mund të përdoret si regjistra bazë, por është e dëshirueshme të përdoren regjistrat EBX, ESI, EDI ose EBP. Në këtë rast, madhësia e instruksionit të makinës është zakonisht më e vogël.

Fatkeqësisht, numri i regjistrave është katastrofikisht i vogël dhe shpesh është e vështirë të gjesh mënyrën më të mirë për t'i përdorur ato.

1.2. Treguesi i komandës

Regjistri EIP ( treguesi i komandës) përmban kompensimin e komandës tjetër që do të ekzekutohet. Ky regjistër nuk është drejtpërdrejt i aksesueshëm nga programuesi, por ngarkimi dhe ndryshimi i vlerës së tij kryhet nga komanda të ndryshme kontrolli, të cilat përfshijnë komanda për kërcime të kushtëzuara dhe të pakushtëzuara, thirrje procedurash dhe kthim nga procedura.

1.3. Regjistri i flamurit

Një flamur është një bit që merr vlerën 1 ("flamuri është vendosur") nëse plotësohet një kusht i caktuar, dhe një vlerë 0 ("flamuri është pastruar") përndryshe. Procesori ka një regjistër flamuri që përmban një grup flamujsh që pasqyrojnë gjendjen aktuale të procesorit.

Emërtimi

Emri

Flamuri i mbartur

Rezervuar

Flamuri i barazisë

Rezervuar

Auxiliary Carry Flag

Ndihmës

Rezervuar

Flamuri zero

Nënshkruani flamurin

Flamuri gjurmues

Interrupt Aktivizo Flamurin

Flamuri i rezolutës

Flamuri është i drejtuar

Flamuri repo

Niveli i Privilegjit I/O

Niveli në

Flamuri i folezuar

Rezervuar

Flamuri u ringjall

Modaliteti Virtual-8086

Modaliteti virtual

Ju kontrolloni

Flamuri i ndërprerjes virtuale

Virtual

Ndërprerja virtuale në pritje

Në pritje

Duke kontrolluar për

Rezervuar

Flamujt CF, DF dhe IF mund të ndryshohen drejtpërdrejt në regjistrin e flamujve duke përdorur udhëzime speciale (për shembull, CLD për të pastruar flamurin e drejtimit), por nuk ka udhëzime që ju lejojnë t'i referoheni regjistrit të flamujve si një regjistër i rregullt. Megjithatë, ju mund të kurseni

flamujt regjistrohen në pirg ose në regjistrin AH dhe rivendosni regjistrin e flamujve prej tyre duke përdorur udhëzimet LAHF, SAHF, PUSHF, PUSHFD, POPF dhe POPFD.

1.3.1. Flamujt e statusit

Flamujt e statusit (bitët 0, 2, 4, 6, 7 dhe 11) pasqyrojnë rezultatin e ekzekutimit të udhëzimeve aritmetike si ADD, SUB, MUL, DIV.

Flamuri i bartjes CF vendoset në transferimin nga MSB / huazim në MSB dhe tregon praninë e një tejmbushjeje në aritmetikën e numrave të plotë të panënshkruar. Përdoret gjithashtu në aritmetikën e gjatë.

Flamuri i barazisë PF vendoset nëse bajt më pak i rëndësishëm i rezultatit përmban një numër çift prej një bitesh. Fillimisht, ky flamur ishte menduar për përdorim në programet e komunikimit: gjatë transmetimit të të dhënave përmes linjave të komunikimit, një bit i barazisë gjithashtu mund të transmetohej për kontroll, dhe udhëzimet për kontrollimin e flamurit të barazisë e bënë më të lehtë kontrollimin e integritetit të të dhënave.

Helper Carry Flag AF është vendosur në kryerjen e një bit 3 rezultat / hua në 3 pak rezultat. Ky flamur është synuar për përdorim në dhjetore binare (Binar i koduar dhjetor, BCD) aritmetikë.

Flamuri zero ZF vendoset nëse rezultati është zero.

Flamuri i shenjës SF është i barabartë me vlerën e bitit më domethënës të rezultatit, që është biti i shenjës në aritmetikën e nënshkruar.

Flamuri i tejmbushur OF vendoset nëse rezultati i numrit të plotë është shumë i gjatë për t'u përshtatur në operandin e synuar (vendndodhja e regjistrit ose e kujtesës). Ky flamur tregon praninë e një tejmbushjeje në aritmetikën me numra të plotë të nënshkruar.

Nga flamujt e listuar, vetëm flamuri CF mund të ndryshohet drejtpërdrejt duke përdorur udhëzimet STC, CLC dhe CMC.

Flamujt e statusit lejojnë të njëjtin udhëzim aritmetik të prodhojë tre lloje të ndryshme rezultati: numër i plotë i panënshkruar, i nënshkruar dhe binar-decimal (BCD). Nëse rezultati konsiderohet një numër i panënshkruar, atëherë flamuri CF tregon gjendjen e tejmbushjes (mbart ose huazoj), për një rezultat të nënshkruar, bartja ose huamarrja tregon flamurin OF dhe për rezultatin BCD, bartja / huamarrja tregon AF flamuri. Flamuri SF pasqyron shenjën e një rezultati të nënshkruar, flamuri ZF pasqyron si rezultatin null të panënshkruar dhe të nënshkruar.

Në aritmetikën me numra të gjatë të plotë, flamuri CF përdoret në lidhje me udhëzimet e mbledhjes dhe bartjes (ADC) dhe zbritjes dhe huazimit (SBB) për të përhapur një transferim ose huazim nga një bit i llogaritur i një numri të gjatë në tjetrin.

udhëzime

kushtëzuar

tranzicioni Jcc (tranzicioni

kushti cc), SETcc (i vendosur

kuptimi

bajt rezultati

varësitë

termat cc), LOOPcc (organizatë

dhe CMOVcc (e kushtëzuar

kopje)

përdorni

një ose më shumë

shënon statusin për të kontrolluar gjendjen. Për shembull, një instruksion kërcimi JLE (kërcim nëse më pak ose i barabartë) teston kushtin "ZF = 1 ose SF ≠ OF".

Flamuri PF u prezantua për pajtueshmërinë me arkitekturat e tjera të mikroprocesorëve dhe përdoret rrallë për qëllimin e tij të synuar. Është më e zakonshme ta përdorim atë në lidhje me flamujt e tjerë të statusit në aritmetikën me pikë lundruese: udhëzimet e krahasimit (FCOM, FCOMP, etj.) në bashkëprocesorin e matematikës vendosin flamujt e kushteve C0, C1, C2 dhe C3 në të, dhe këta flamuj mund të kopjohet në regjistrin e flamujve. Për ta bërë këtë, rekomandohet të përdorni udhëzimin FSTSW AX për të ruajtur fjalën e statusit të bashkëprocesorit në regjistrin AX dhe udhëzimin SAHF për kopjimin e mëvonshëm të përmbajtjes së regjistrit AH në 8 bitet e poshtme të regjistrit të flamujve, me C0. duke futur flamurin CF, C2 në PF dhe C3 në ZF. Flamuri C2 vendoset, për shembull, në rastin e argumenteve të pakrahasueshëm (NaN ose formati i pambështetur) në deklaratën e krahasimit FUCOM.

1.3.2. Flamuri i kontrollit

Flamuri i drejtimit DF (biti 10 në regjistrin e flamujve) kontrollon instruksionet e vargut (MOVS, CMPS, SCAS, LODS dhe STOS) - vendosja e flamurit detyron adresat të ulen (linjat e procesit nga adresat e larta në ato të ulëta), zeroimi shkakton rritjen e adresave. Deklaratat STD dhe CLD vendosin dhe pastrojnë përkatësisht flamurin DF.

1.3.3. Flamujt e sistemit dhe fusha IOPL

Flamujt e sistemit dhe fusha IOPL kontrollojnë mjedisin e funksionimit dhe nuk synohen të përdoren nga programet e aplikacionit.

Interrupt Aktivizo Flamurin IF - Pastrimi i këtij flamuri çaktivizon përgjigjen ndaj kërkesave për ndërprerje të maskuara.

Flamuri i gjurmës TF - vendosja e këtij flamuri mundëson korrigjimin hap pas hapi, kur pas çdo ekzekutimi

udhëzimet, programi ndërpritet dhe thirret një mbajtës special i ndërprerjeve.

Fusha IOPL tregon nivelin e përparësisë I/O të programit ose detyrës së ekzekutueshme: që një program ose detyrë të ekzekutojë instruksionet I/O ose të ndryshojë flamurin IF, niveli i tij aktual i prioritetit (CPL) duhet të jetë ≤ IOPL.

Flamuri i folezimit të detyrave NT - Ky flamur vendoset kur detyra aktuale është "mbivendosur" në një detyrë tjetër të ndërprerë dhe segmenti i gjendjes TSS i detyrës aktuale jep reagime për TSS të detyrës së mëparshme. Flamuri NT kontrollohet nga një instruksion IRET për të përcaktuar nëse lloji i kthimit është ndër-detyrë ose brenda-detyrë.

Flamuri i rifillimit RF përdoret për të maskuar gabimet e korrigjimit.

VM - vendosja e këtij flamuri në modalitetin e mbrojtur shkakton kalimin në modalitetin virtual 8086.

Flamuri i kontrollit të shtrirjes AC - vendosja e këtij flamuri së bashku me bitin AM në regjistrin CR0 mundëson kontrollin e shtrirjes së operandit gjatë akseseve në memorie: qasja në një operand të padrejtuar krijon një përjashtim.

VIF - kopje virtuale e flamurit IF; përdoret në lidhje me flamurin VIP.

VIP - vendoset për të treguar praninë e një ndërprerjeje në pritje.

ID - aftësia për të ndryshuar në mënyrë programore këtë flamur në regjistrin e flamujve tregon mbështetje për udhëzimin CPUID.

1.4. Regjistrat e segmenteve

Procesori ka 6 të ashtuquajtur regjistra segment: CS, DS, SS, ES, FS dhe GS. Ekzistenca e tyre është për shkak të specifikave të organizimit dhe përdorimit të RAM-it.

Regjistrat 16-bit mund të adresonin vetëm 64 KB RAM, gjë që nuk mjafton qartë për një program pak a shumë të mirë. Prandaj, memoria iu nda programit në formën e disa segmenteve, të cilat ishin 64 KB në madhësi. Në këtë rast, adresat absolute ishin 20-bit, gjë që bëri të mundur adresimin e tashmë 1 MB RAM. Shtrohet pyetja - si të ruani adresat 20-bit me regjistra 16-bit? Për të zgjidhur këtë problem, adresa u prish në bazë të kompensimit. Baza është adresa e fillimit të segmentit, dhe kompensimi është numri i bajtit brenda segmentit. U vendos një kufizim në adresën e fillimit të segmentit - duhej të ishte shumëfish i 16. Në këtë rast, 4 bitet e fundit ishin të barabartë me 0 dhe nuk u ruajtën, por nënkuptoheshin. Kështu, u morën dy pjesë 16-bitëshe të adresës. Për marrjen

e adresës absolute, katër bit zero u shtuan në bazë dhe vlera që rezulton u shtua me një kompensim.

Regjistrat e segmenteve u përdorën për të ruajtur adresën e fillimit të një segmenti kodi (CS - segmenti i kodit), një segment të dhënash (DS - segmenti i të dhënave) dhe një segment i stivit (SS - segmenti i stivës). Regjistrat ES, FS dhe GS u shtuan më vonë. Kishte disa modele memorie, secila prej të cilave nënkuptonte ndarjen e një ose më shumë segmenteve të kodit dhe një ose më shumë segmenteve të të dhënave në program: të vogla, të vogla, të mesme, kompakte, të mëdha dhe të mëdha. Ekzistojnë disa konventa për udhëzimet e gjuhës së asamblesë: adresat e kërcimit u segmentuan nga regjistri CS, akseset e të dhënave u segmentuan nga regjistri DS dhe thirrjet e stivës u segmentuan nga regjistri SS. Nëse një programi i janë ndarë disa segmente për kod ose të dhëna, atëherë vlerat në regjistrat CS dhe DS duhet të ndryshohen për të hyrë në një segment tjetër. Kishte të ashtuquajturat kalime "afër" dhe "larg". Nëse komanda në të cilën do të bëhej kërcimi ishte në të njëjtin segment, atëherë për kërcimin mjaftonte të ndryshonte vetëm vlerën e regjistrit IP. Një tranzicion i tillë u quajt "i afërt". Nëse komanda në të cilën do të bëhej kërcimi ishte në një segment tjetër, atëherë për kërcimin ishte e nevojshme të ndryshoni vlerën e regjistrit CS dhe vlerën e regjistrit IP. Ky tranzicion u quajt në distanca të gjata dhe zgjati më shumë.

Regjistrat 32-bit ju lejojnë të adresoni 4 GB memorie, e cila tashmë është e mjaftueshme për çdo program. Windows ekzekuton çdo program Win32 në një hapësirë ​​të veçantë virtuale. Kjo do të thotë se çdo program Win32 do të ketë një hapësirë ​​adrese prej 4 GB, por kjo nuk do të thotë se çdo program ka 4 GB memorie fizike, por vetëm se programi mund të aksesojë çdo adresë brenda këtij diapazoni. Dhe Windows do të bëjë gjithçka që është e nevojshme që memoria që programi po akseson të "ekzistojë". Sigurisht, programi duhet t'u përmbahet rregullave të vendosura

Windows, përndryshe ndodh një gabim i përgjithshëm i mbrojtjes.

Sipas arkitekturës Win32, nuk kishte nevojë të ndahej adresa në bazë dhe offset, dhe nevoja për modele memorie. në 32 -

përdoren ndryshe1. Më parë, ishte e nevojshme të lidheshin pjesë individuale të programit me një ose një tjetër regjistër segmenti dhe të ruani / rivendosnin regjistrin DS kur kaloni në një segment tjetër të të dhënave, ose në mënyrë eksplicite segmentoni të dhënat në një regjistër tjetër. Me një arkitekturë 32-bit, kjo nuk është më e nevojshme, dhe në rastin më të thjeshtë, mund të harroni regjistrat e segmenteve.

1.5. Duke përdorur pirgun

Çdo program ka një zonë memorie të quajtur stack. Stack përdoret për të kaluar parametra në procedura dhe për të ruajtur të dhënat lokale për procedurat. Siç e dini, pirgu është një zonë memorie, kur punoni me të cilën duhet të respektohen disa rregulla, përkatësisht: të dhënat që hynë së pari në pirg merren së fundi. Nga ana tjetër, nëse programit i ndahet pak memorie, atëherë nuk ka kufizime fizike në lexim dhe shkrim. Si përshtaten së bashku këto dy parime kontradiktore?

Supozoni se kemi një funksion f1 që thërret funksionin f2, dhe funksioni f2, nga ana tjetër, thërret funksionin f3. Kur thirret funksioni f1, atij i caktohet një vend i caktuar në rafte për të dhënat lokale. Kjo hapësirë ​​ndahet duke zbritur nga regjistri ESP një vlerë të barabartë me madhësinë e memories së kërkuar. Madhësia minimale e memories së alokuar është 4 bajt, d.m.th. edhe nëse procedura ka nevojë për 1 bajt, ajo duhet të marrë 4 bajt.

Funksioni f1 kryen disa veprime dhe më pas thërret

funksioni f2 thërret funksionin f3, i cili gjithashtu ndan hapësirën në pirg. Funksioni f3 nuk thërret asnjë funksion tjetër dhe pas përfundimit të punës së tij duhet të lirojë hapësirë ​​në rafte duke shtuar në regjistrin ESP vlerën që u zbrit kur u thirr funksioni. Nëse funksioni f3 nuk rikthen vlerën e regjistrit ESP, atëherë funksioni f2, duke vazhduar të punojë, nuk do të ketë akses në të dhënat e tij, pasi Ajo është në kërkim

që ishte para se ajo të thirrej.

Kështu, në nivelin e procedurave, është e nevojshme të ndiqen rregullat për të punuar me pirgun - procedura që zinte hapësirën e fundit në pirg duhet së pari ta çlirojë atë. Nëse ky rregull nuk respektohet, programi nuk do të funksionojë siç duhet. Por çdo procedurë mund të hyjë në zonën e vet të stivës në një mënyrë arbitrare. Nëse do të detyroheshim të ndiqnim rregullat për të punuar me stack brenda secilës procedurë, do të duhej të transferonim të dhënat nga staku në një zonë tjetër memorie, dhe kjo do të ishte jashtëzakonisht e papërshtatshme dhe do të ngadalësonte jashtëzakonisht ekzekutimin e programit.

Çdo program ka një zonë të dhënash ku ndodhen variablat globale. Pse ruhen të dhënat lokale në pirg? Kjo bëhet për të zvogëluar sasinë e memories së zënë nga programi. Nëse programi është në mënyrë të vazhdueshme thirrni disa procedura, atëherë në çdo moment të kohës do të ndahet hapësira vetëm për të dhënat e një procedure, pasi pirgu është i zënë dhe i lëshuar. Zona e të dhënave ekziston gjatë gjithë kohës që programi po funksionon. Nëse të dhënat lokale do të ndodheshin në zonën e të dhënave, do të ishte e nevojshme të ndahej hapësirë ​​për të dhënat lokale për të gjitha procedurat e programit.

Të dhënat lokale nuk inicializohen automatikisht. Nëse në shembullin e mësipërm funksioni f2 pas funksionit f3 thërret funksionin f4, atëherë funksioni f4 do të zërë vendin në pirg që më parë ka qenë i zënë nga funksioni f3, kështu që funksioni f4 do të trashëgojë funksionin f3. Prandaj, çdo procedurë duhet të kujdeset për inicializimin e të dhënave të saj lokale.

2. Konceptet bazë të gjuhës së asamblesë

2.1. Identifikuesit

Koncepti i një identifikuesi në gjuhën e asamblesë nuk është i ndryshëm nga koncepti i një identifikuesi në gjuhët e tjera. Ju mund të përdorni shkronja latine, numra dhe shenja _. ? @ $, ku pika mund të jetë vetëm karakteri i parë i një identifikuesi. Shkronjat e mëdha dhe të vogla konsiderohen ekuivalente.

2.2. Numrat e plotë

V Në programet e gjuhës së asamblesë, numrat e plotë mund të shkruhen në sisteme binar, oktal, dhjetor dhe heksadecimal. Për të vendosur sistemin e numrave në fund të një numri

Pas shumë vitesh që kam bërë diçka pa e goditur, vendosa të kthehem në bazat. Tek programimi. Përsëri, duke pasur parasysh morinë e "përparimeve moderne" në këtë fushë, ishte e vështirë të përcaktohej se çfarë mungonte në të vërtetë, çfarë të merrej për ta bërë atë sa të këndshëm dhe të dobishëm. Pasi provova paksa shumë gjëra, vendosa të kthehem në vendin ku më kishin tërhequr që në ditët e para të njohjes sime me një kompjuter (madje edhe me një kopje të krijimit të Sir Sinclair) - te programimi në gjuhën e asamblesë. Në fakt, dikur e njihja mjaft mirë Assembler-in (në këtë rast e kam fjalën për x86), por për gati 15 vjet nuk kam shkruar asgjë në të. Kështu, ky është një lloj rikthimi i “birit plangprishës”.
Por këtu priste zhgënjimi i parë. Librat, manualet dhe librat e tjerë të referencës mbi asembler-in që gjenden në internet, për keqardhjen time të thellë, përmbajnë një minimum informacioni se si të programohet në asembler, pse është kështu dhe çfarë jep.

Një shembull nga një zonë tjetër

Nëse marrim boksin si shembull, atëherë të gjitha manualet e tilla mësojnë se si të ekzekutoni një grusht, të lëvizni duke qëndruar në dysheme, por ajo që bën boksi mungon absolutisht - boksi, dhe jo "goditja e ligjshme". Kjo do të thotë, puna kombinuese, veçoritë e përdorimit të unazës, veprimet mbrojtëse, struktura taktike e betejës dhe, për më tepër, strategjia e betejës nuk merren parasysh fare. Ata mësuan një burrë të godiste "dardhën" dhe menjëherë të futej në ring. Kjo është thelbësisht e gabuar. Por kështu janë të strukturuara pothuajse të gjithë "tekstet" dhe "manualet" mbi programimin në montim.


Sidoqoftë, librat normalë duhet të jenë, me shumë mundësi nën malin e "skorjes" thjesht nuk i gjeta. Prandaj, para se të plotësojmë njohuritë me një përshkrim global të arkitekturës, mnemonikës dhe lloj-lloj marifetesh "si të verbosh një fiq nga dy gishta", le t'i qasemi çështjes së programimit në montim nga një këndvështrim "ideologjik".

Idil?

Një shënim i vogël, më tej në tekst do të përdoret një klasifikim që ndryshon nga ai i përhapur aktualisht. Sidoqoftë, kjo nuk është një arsye për "mosmarrëveshje për ngjyrën e së vërtetës", thjesht në këtë formë është më e lehtë të shpjegohet këndvështrimi i autorit për programimin.

Pra, sot, me sa duket, ka ardhur epoka e lumturisë për programuesit. Një përzgjedhje e madhe fondesh për të gjitha rastet dhe dëshirat. Ka miliona "korniza" / "modele" / "shabllone" / "biblioteka" dhe mijëra mjete për të "lehtësuar" programimin, qindra gjuhë dhe dialekte, dhjetëra metodologji dhe qasje të ndryshme ndaj programimit. Merre - nuk dua. Por nuk “merret”. Dhe çështja nuk është në besimet fetare, por në faktin se e gjithë kjo duket si një përpjekje për të ngrënë diçka pa shije. Me dëshirë dhe zell, sigurisht që mund të përshtateni me këtë. Por, duke iu rikthyer programimit, në pjesën më të madhe të asaj që propozohet, bukuria teknike nuk është e dukshme – duken vetëm shumë “paterica”. Si rezultat, kur përdoren këto "arritje", në vend të peizazheve magjepsëse, në vend të peizazheve magjepsëse, një "abstraksion" solid ose printime popullore del nga "furça e artistëve" - ​​nëse jeni me fat. A janë shumica e programuesve të tillë mediokritet, injorantë dhe kanë probleme në nivelin e gjenetikës? Jo unë nuk mendoj kështu. Pra, cila është arsyeja?
Sot ka shumë ide dhe mënyra programimi. Le të konsiderojmë më "në modë" prej tyre.

  • Programimi imperativ - në këtë qasje, programuesi vendos sekuencën e veprimeve që çojnë në zgjidhjen e problemit. Ai bazohet në ndarjen e programit në pjesë që kryejnë operacione logjikisht të pavarura (module, funksione, procedura). Por ndryshe nga qasja e shtypur (shih më poshtë), ekziston një veçori e rëndësishme këtu - mungesa e variablave "shtypje". Me fjalë të tjera, koncepti i "llojit të një ndryshoreje" mungon; në vend të kësaj, përdoret kuptimi që vlerat e së njëjtës ndryshore mund të kenë një lloj tjetër. Përfaqësues të gjallë të kësaj qasjeje janë Basic, REXX, MUMPS.
  • Programimi i shtypur është një modifikim i programimit imperativ, kur programuesi dhe sistemi kufizojnë vlerat e mundshme të variablave. Gjuhët më të famshme janë Pascal, C.
  • Programimi funksional është një mënyrë më matematikore e zgjidhjes së një problemi, kur zgjidhja konsiston në "ndërtimin" e një hierarkie funksionesh (dhe, në përputhje me rrethanat, krijimin e atyre që mungojnë), duke çuar në zgjidhjen e problemit. Si shembuj: Lisp, Forth.
  • Programimi automatik është një qasje ku një programues ndërton një model / rrjet të përbërë nga objekte / elemente ekzekutive që shkëmbejnë mesazhe, si duke ndryshuar / ruajtur "gjendjen" e tyre të brendshme dhe të aftë për të bashkëvepruar me botën e jashtme. Me fjalë të tjera, kjo është ajo që zakonisht quhet "programim i objekteve" (jo i orientuar drejt objektit). Kjo metodë programimi është prezantuar në Smalltalk.
Por çfarë ndodh me shumë gjuhë të tjera? Si rregull, këta janë tashmë "mutantë". Për shembull, përzierja e qasjeve të shtypura dhe automatike i dha shkas "programimit të orientuar nga objekti".

Siç mund ta shihni, secila prej qasjeve (edhe pa marrë parasysh kufizimet e zbatimeve specifike) imponon kufizimet e veta në vetë teknikën e programimit. Por nuk mund të jetë ndryshe. Fatkeqësisht, këto kufizime shpesh krijohen artificialisht për të "mbajtur pastër idenë". Si rezultat, programuesi duhet të "çorodit" zgjidhjen e gjetur fillimisht në një formë që përputhet disi me ideologjinë e gjuhës së përdorur ose "shabllonin" e përdorur. Kjo edhe pa marrë parasysh teknikat dhe metodat e reja të projektimit dhe zhvillimit.

Duket se gjatë programimit në gjuhën e asamblesë, ne jemi të lirë të bëjmë gjithçka në mënyrën që dëshirojmë dhe që na lejon hardueri. Por, sapo duam të përdorim një "drejtues gjenerik" për çdo lloj pajisjeje, jemi të detyruar të ndryshojmë lirinë e "krijimtarisë" për qasjet dhe mënyrat e përshkruara (të standardizuara) të përdorimit të drejtuesit. Sapo na duhej mundësia për të shfrytëzuar zhvillimet e kolegëve të tjerë ose për t'u dhënë atyre mundësinë për të bërë të njëjtën gjë me frytet e punës sonë, ne jemi të detyruar të ndryshojmë lirinë e zgjedhjes së ndërveprimit midis pjesëve të programit për disa të rënë dakord / mënyra të standardizuara.

Kështu, "liria" për të cilën njerëzit shpesh nxitojnë për të montuar shpesh rezulton të jetë një "mit". Dhe kësaj (të kuptuarit e kufizimeve dhe mënyrave të organizimit të tyre), për mendimin tim, duhet t'i kushtohet vëmendje më e madhe. Programuesi duhet të kuptojë arsyen e kufizimeve të paraqitura dhe, që e dallon asemblerin nga shumë gjuhë të nivelit të lartë, të jetë në gjendje t'i ndryshojë ato nëse lind nevoja. Megjithatë, tani programuesi asembler është i detyruar të durojë kufizimet e vendosura nga gjuhët e nivelit të lartë, duke mos pasur "karrota" në dispozicion të programuesve në to. Nga njëra anë, sistemet operative ofrojnë shumë funksione tashmë të implementuara, ka biblioteka të gatshme dhe shumë më tepër. Por mënyrat e përdorimit të tyre, si të thuash, zbatohen pa marrë parasysh thirrjen e tyre nga programet e shkruara në asembler, apo edhe në përgjithësi në kundërshtim me logjikën e programimit për arkitekturën x86. Si rezultat, në ditët e sotme programimi në gjuhën e asamblesë me thirrje drejt funksioneve të OS ose bibliotekave të jashtme të gjuhëve të nivelit të lartë është "frikë" dhe "tmerr".

Sa më larg në pyll, aq më i trashë

Pra, kuptuam se megjithëse montuesi është shumë i thjeshtë, ju duhet të jeni në gjendje ta përdorni atë. Dhe konsistenca kryesore është nevoja për të bashkëvepruar me mjedisin e kohës së ekzekutimit ku është nisur programi ynë. Nëse programuesit në gjuhët e nivelit të lartë tashmë kanë akses në bibliotekat, funksionet, nënprogramet e nevojshme për shumë raste dhe ata kanë akses në mënyrat e ndërveprimit me botën e jashtme, në një formë në përputhje me idenë e gjuhës, atëherë programuesi i montimit duhet të kalojë nëpër grumbullin e të gjitha llojeve të pengesave të montuara në hapësirën boshe. Kur shikoni se cilat gjuhë të nivelit të lartë gjenerojnë gjatë përpilimit, ju krijohet përshtypja se ata që kanë shkruar përpilues ose nuk e kanë idenë se si funksionon një procesor me arkitekturë x86, "ose një nga dy" (q).

Pra, le të fillojmë me radhë. Programimi është, para së gjithash, inxhinieri, domethënë krijimtari shkencore që synon zgjidhjen efikase (për sa i përket besueshmërisë, përdorimit të burimeve në dispozicion, kohës së zbatimit dhe lehtësisë së përdorimit) të problemeve praktike. Dhe, në zemër të çdo inxhinierie është një qasje sistemore. Kjo do të thotë, çdo zgjidhje nuk mund të konsiderohet si një lloj kutie e zezë "të pandashme", që funksionon në një vakum të plotë dhe ideal.

Një shembull tjetër nga një zonë tjetër

Prodhimi i kamionëve në Shtetet e Bashkuara mund të citohet si një shembull i gjallë i një qasjeje sistematike. Në këtë rast, prodhuesi i kamionit është thjesht prodhuesi i kornizës dhe kabinës + montuesi i konstruktorit. Çdo gjë tjetër (motori, transmisioni, suspensioni, pajisjet elektrike, etj.) merret në bazë të dëshirave të klientit. Një klient donte të merrte vetë një Kenworth me një motor nga Detroit Diesel, kuti ingranazhesh manuale Fuller, suspension fletësh nga disa Dana - ju lutem. Një miku i këtij klienti kishte nevojë për të njëjtin model Kenworth, por me motorin vendas Paccar, transmetimin automatik Allison dhe pezullimin ajror nga një prodhues tjetër - e lehtë! Dhe kjo është ajo që bëjnë të gjithë ndërtuesit e kamionëve në SHBA. Kjo do të thotë, një kamion është një sistem në të cilin çdo modul mund të zëvendësohet me një tjetër të të njëjtit qëllim dhe të lidhet pa probleme me ato ekzistuese. Për më tepër, metoda e lidhjes së moduleve është bërë me shkathtësinë maksimale të disponueshme dhe komoditetin e zgjerimit të mëtejshëm të funksionalitetit. Kjo është ajo për të cilën inxhinieri duhet të përpiqet.

Fatkeqësisht, ne do të duhet të jetojmë me atë që kemi, por në të ardhmen kjo duhet të shmanget. Pra, një program është, në fakt, një grup modulesh (nuk është e rëndësishme se si quhen dhe si "sillen"), duke i montuar të cilat arrijmë një zgjidhje për detyrën në fjalë. Për efikasitet, është shumë e dëshirueshme që këto module të mund të ripërdoren. Dhe jo thjesht përdorni me çdo kusht, por përdorni atë në një mënyrë të përshtatshme. Dhe këtu na pret një tjetër “surprizë” e pakëndshme. Shumica e gjuhëve të nivelit të lartë funksionojnë në njësi të tilla strukturore si "funksioni" dhe "procedura". Dhe, si një mënyrë për t'u marrë me to, përdoret "kalimi i parametrave". Kjo është mjaft logjike dhe këtu nuk lind asnjë pyetje. Por si gjithmonë, "nuk është e rëndësishme ajo që bëhet - e rëndësishme është se si bëhet" (c). Dhe këtu fillon më e pakuptueshmja. Sot, ekzistojnë 3 mënyra të zakonshme të organizimit të transferimit të parametrave: cdecl, stdcall, thirrje të shpejtë... Pra, asnjë nga këto metoda nuk është "vendase" për x86. Për më tepër, ato janë të gjitha me të meta nga pikëpamja e zgjerimit të funksionalitetit të nënprogrameve të quajtura. Domethënë, duke rritur numrin e parametrave të kaluar, ne jemi të detyruar të ndryshojmë të gjitha pikat e thirrjes së këtij funksioni/nënprogrami, ose të prodhojmë një nënprogram të ri me funksionalitet të ngjashëm, i cili do të thirret në një mënyrë paksa të ndryshme.

Metodat e mësipërme të kalimit të parametrave funksionojnë relativisht mirë në procesorë me 2 rafte të ndara (stiva e të dhënave dhe grumbulli i adresave/kontrollit) dhe udhëzimet e përparuara të manipulimit të stivit (të paktën indeksoni aksesin në elementët e stivës). Por kur programoni në x86, së pari duhet të jeni të çoroditur kur kaloni / merrni parametra, dhe më pas mbani mend t'i hiqni "strukturalisht" ato nga pirgja. Gjatë rrugës, duke u përpjekur të hamendësoni / llogaritni thellësinë maksimale të pirgut. Kujtoni që x86 (modaliteti 16/32 bit) është një procesor që ka:

  • regjistrat e specializuar (RON-të janë regjistra për qëllime të përgjithshme - si të tillë mungojnë: domethënë, ne nuk mund të shumëzojmë përmbajtjen e regjistrit GS me vlerën nga EDI me një komandë dhe të marrim rezultatin në çiftin EDX: ECX, ose të ndajmë vlerën nga EDI: çifti i regjistrave ESI në regjistrin e përmbajtjes EAX);
  • pak regjistra;
  • një pirg;
  • vendndodhja e memories nuk jep asnjë informacion për llojin e vlerës së ruajtur atje.
Me fjalë të tjera, teknikat e programimit të përdorura për përpunuesit me një skedar të madh regjistri, mbështetje për pirgje të shumta të pavarura, etj. kryesisht nuk zbatohet për programimin x86.

Tipari tjetër i ndërveprimit me modulet e gatshme të shkruara në "gjuhë të nivelit të lartë" është "lufta" me "llojet e variablave". Nga njëra anë, arsyeja e shfaqjes së llojeve të ndryshueshme është e qartë - programuesi e di se cilat vlera përdoren brenda nënprogramit / modulit të tij. Nisur nga kjo, duket mjaft logjike që duke vendosur llojin e vlerave të ndryshores, mund të “thjeshtojmë” shkrimin e programit duke vendosur kontrollin e llojeve/kufijve të vlerave në përkthyesin e gjuhës. Por edhe atëherë foshnja u hodh jashtë me ujë. Sepse çdo program është shkruar jo për gjenerimin e kuajve sferikë në vakum, por për punë praktike me të dhënat e përdoruesit. Kjo do të thotë, një shkelje e dukshme e qasjes së sistemeve - sikur zhvilluesit e gjuhëve të nivelit të lartë të merrnin parasysh sistemet e tyre pa marrë parasysh ndërveprimin me botën e jashtme. Si rezultat, kur programon në një gjuhë të shtypur, zhvilluesi duhet të parashikojë të gjitha llojet e mundshme të të dhënave hyrëse "të pasakta" dhe të kërkojë mënyra për të zgjidhur paqartësitë. Dhe këtu hyjnë në lojë sistemet monstruoze për mbështetjen e shprehjeve të rregullta, trajtimin e përjashtimeve, nënshkrimet e metodave/procedurave për lloje të ndryshme vlerash dhe gjenerime të tjera patericash.

Siç u përmend më lart, për arkitekturën x86, vetë vlera e ruajtur në një vendndodhje memorie nuk ka asnjë lloj. Programuesi i gjuhës së asamblesë është i privilegjuar dhe një përgjegjësi për përcaktimin se si të trajtohet pikërisht kjo vlerë. Dhe si të përcaktoni llojin e vlerës dhe si ta përpunoni atë - ka shumë mundësi për të zgjedhur. Por, le të theksojmë sërish, të gjitha kanë të bëjnë vetëm me vlerat e marra nga përdoruesi. Siç vunë re saktë zhvilluesit e gjuhëve të shtypura, llojet e vlerave të variablave të brendshëm dhe të shërbimit dihen pothuajse gjithmonë paraprakisht.

Kjo arsye (kalimi i çoroditur i parametrave në modulet e shkruara në gjuhë të nivelit të lartë dhe nevoja për të monitoruar rreptësisht llojet e parametrave të kaluar në të njëjtat module) duket të jetë kryesore, për shkak të së cilës programimi në gjuhën e asamblesë është jashtëzakonisht i vështirë. . Dhe shumica preferon të kuptojë xhunglën e "gjuhëve të nivelit të lartë" për të përfituar nga ajo që tashmë është zhvilluar nga të tjerët, sesa të vuajë, fus të njëjtat paterica "standarde" për të korrigjuar ato që nuk kanë bërë. Dhe një përkthyes i rrallë asembler disi "shkarkon" programuesin nga kjo rutinë.

Çfarë duhet bërë?

Përfundime paraprake, duke marrë parasysh 15-fluturimin thyej në programimin e montimit.
Së pari, në lidhje me modulet ose pjesët e një programi. Në rastin e përgjithshëm, vlen të theksohen dy lloje të njësive të ekzekutimit të një programi në gjuhën e asamblesë - "operacioni" dhe "nënrutinë".
  • Një "operacion" është një modul që kryen një veprim "atomik" dhe nuk kërkon shumë parametra për ekzekutimin e tij (për shembull, operacioni i pastrimit të të gjithë ekranit, ose operacioni i llogaritjes së mesatares së një serie numrash, etj.) .
  • Një "nënrutinë" është një modul funksional që kërkon shumë parametra hyrës (më shumë se 2x-3x) për funksionimin e duhur.
Dhe këtu ia vlen të vlerësohet përvoja e gjuhëve urdhërore dhe funksionale. Ata na dhanë 2 mjete të vlefshme që ia vlen të përdoren: "struktura e të dhënave" (ose, për shembull, REXX - variabla të përbëra / të shtuara) dhe "pandryshueshmëria e të dhënave".

Është gjithashtu e dobishme të ndiqni rregullin e pandryshueshmërisë - domethënë pandryshueshmërinë e parametrave të kaluar. Nënprogrami nuk mund (nuk duhet) të ndryshojë vlerat në strukturën e kaluar tek ajo dhe rezultati kthehet ose në regjistra (jo më shumë se parametra 2x-3x), ose gjithashtu në një strukturë të re, të krijuar. Kështu, ne lirohemi nga nevoja për të bërë kopje të strukturave në rast të një ndryshimi "të harruar" të të dhënave nga nënprogramet dhe mund të përdorim një strukturë tashmë të krijuar në tërësinë e saj ose pjesën kryesore të saj për të thirrur disa nënprograme që funksionojnë me të njëjtën / të ngjashme. grup parametrash. Për më tepër, praktikisht "automatikisht" vijmë te rregulli tjetër "funksional" - konteksti i brendshëm-pavarësia e nënprogrameve dhe operacioneve. Me fjalë të tjera, ndaj ndarjes së gjendjes / të dhënave nga metoda / nënprogrami i përpunimit të tyre (në krahasim me modelin automatik). Në rastet e programimit paralel, si dhe përdorimi i përbashkët i një nënprogrami, ne heqim qafe nevojën për të prodhuar shumë kontekste ekzekutimi dhe për të monitoruar "mos-prerjen" e tyre, dhe nga krijimi i shumë rasteve të një nënprogrami me "gjendje" të ndryshme. “, në rastin e thirrjeve të shumta të saj.

Sa i përket "llojeve" të të dhënave, atëherë ose mund të lini "gjithçka ashtu siç është", ose gjithashtu nuk mund të rishpikni timonin dhe të përfitoni nga ajo që zhvilluesit e përkthyesve të gjuhëve imperative kanë përdorur për një kohë të gjatë. - "identifikuesi i llojit të vlerës". Kjo do të thotë, analizohen të gjitha të dhënat që vijnë nga bota e jashtme dhe secilës vlerë të marrë i caktohet një identifikues i llojit të përpunuar (numër i plotë, pikë lundruese, BCD e paketuar, kodi i karakterit, etj.) dhe madhësia e fushës / vlerës. Duke pasur këtë informacion, programuesi, nga njëra anë, nuk e detyron përdoruesin në një kornizë të ngushtë të panevojshme "rregullash" për futjen e vlerave dhe nga ana tjetër, ai ka aftësinë të zgjedhë mënyrën më efikase të përpunimit të të dhënave të përdoruesit. në proces. Por, do ta përsëris edhe një herë, kjo vlen vetëm për të punuar me të dhënat e përdoruesit.

Këto ishin konsiderata të përgjithshme për programimin në gjuhën e asamblesë, që nuk lidheshin me dizajnin, korrigjimin dhe trajtimin e gabimeve. Shpresoj që zhvilluesit e OS që i shkruajnë ato nga e para (dhe aq më tepër në assembler) do të kenë diçka për të menduar dhe ata do të zgjedhin (edhe nëse nuk përshkruhen më lart, por çdo tjetër) mënyra për ta bërë programimin në asembler më të sistematizuar, të përshtatshëm dhe të këndshme, dhe nuk do të kopjojë verbërisht opsionet e njerëzve të tjerë, shpesh "të shtrembër" pa shpresë.

Assembler (Assembly) është një gjuhë programimi, konceptet e së cilës pasqyrojnë arkitekturën e një kompjuteri elektronik. Gjuha e Asamblesë është një formë simbolike e shkrimit të kodit të makinës, përdorimi i së cilës thjeshton shkrimin e programeve të makinës. Gjuhë të ndryshme asambleje mund të zhvillohen për të njëjtin kompjuter. Ndryshe nga gjuhët e një niveli të lartë abstraksioni, në të cilat shumë probleme të zbatimit të algoritmeve janë të fshehura nga zhvilluesit, gjuha e asamblesë është e lidhur ngushtë me grupin e udhëzimeve të mikroprocesorit. Për një mikroprocesor ideal grupi i udhëzimeve të të cilit përputhet saktësisht me gjuhën e programimit, asembleri gjeneron një kod makine për çdo deklaratë në gjuhë. Në praktikë, mikroprocesorët real mund të kërkojnë udhëzime të shumta makinerike për të zbatuar një deklaratë të vetme në gjuhë.

Gjuha e Asamblesë siguron akses në regjistra, duke specifikuar metodat e adresimit dhe duke përshkruar operacionet në terma të udhëzimeve të procesorit. Gjuha e asamblesë mund të përmbajë mjete të një niveli më të lartë abstraksioni: makro të integruara dhe të përcaktuara që korrespondojnë me disa instruksione makinerie, zgjedhje automatike të komandave në varësi të llojeve të operandëve, mjete për përshkrimin e strukturave të të dhënave. Avantazhi kryesor i gjuhës assembly është "afërsia" me procesorin, i cili është baza e kompjuterit të përdorur nga programuesi, dhe disavantazhi kryesor është ndarja shumë e vogël e operacioneve tipike, e cila perceptohet me vështirësi nga shumica e përdoruesve. Sidoqoftë, gjuha e asamblesë është shumë më tepër një reflektim i vetë funksionimit të një kompjuteri sesa çdo gjuhë tjetër.

Dhe megjithëse drejtuesit dhe sistemet operative janë shkruar tani në C, C, me të gjitha avantazhet e saj, është një gjuhë abstraksioni i nivelit të lartë që fsheh nga programuesi hollësi dhe nuanca të ndryshme të harduerit, dhe assembler është një gjuhë abstraksioni e nivelit të ulët që pasqyron drejtpërdrejt të gjitha këto hollësi dhe nuanca.

Tre gjëra nevojiten për të përdorur me sukses assembler:

  • njohuri për sintaksën e përkthyesit asembler që përdoret (për shembull, sintaksa e MASM, FASM dhe GAS është e ndryshme), qëllimi i direktivave të gjuhës së asamblesë (operatorët e përpunuar nga përkthyesi gjatë përkthimit të kodit burimor të programit) ;
  • të kuptuarit e udhëzimeve të makinës të ekzekutuara nga procesori ndërsa programi është duke u ekzekutuar;
  • aftësia për të punuar me shërbimet e ofruara nga sistemi operativ - në këtë rast, kjo do të thotë njohuri për funksionet e Win32 API. Kur punoni me gjuhë të nivelit të lartë, programuesi shumë shpesh nuk i referohet drejtpërdrejt API-së së sistemit; ai mund të mos jetë as i vetëdijshëm për ekzistencën e tij, pasi biblioteka e gjuhës fsheh detajet specifike të sistemit nga programuesi. Për shembull, në Linux, Windows dhe çdo sistem tjetër në një program C / C ++, mund të nxirrni një varg në tastierë duke përdorur funksionin printf () ose rrjedhën cout, domethënë, nuk ka asnjë ndryshim për një programues që përdor këto mjete, sipas të cilit sistem bëhet programi, megjithëse zbatimi i këtyre funksioneve do të jetë i ndryshëm në sisteme të ndryshme, sepse API-ja e sistemeve është shumë e ndryshme. Por nëse një person shkruan në gjuhën e asamblesë, ai nuk ka më funksione të gatshme si printf (), në të cilat ai ka menduar se si të "komunikojë" me sistemin për të dhe duhet ta bëjë vetë.
Si rezultat, rezulton se shkrimi edhe i një programi të thjeshtë në asembler kërkon një sasi shumë të madhe njohurish paraprake - "pragu i hyrjes" këtu është shumë më i lartë sesa për gjuhët e nivelit të lartë.

Optimale mund të mendoni për një program që funksionon siç duhet, sa më shpejt që të jetë e mundur dhe merr sa më pak memorie. Për më tepër, është e lehtë për t'u lexuar dhe kuptuar; është e lehtë të ndryshohet; krijimi i tij kërkon pak kohë dhe kosto të ulët. Në mënyrë ideale, gjuha e asamblesë duhet të ketë një sërë karakteristikash që do t'ju lejojnë të merrni programe që plotësojnë sa më shumë nga këto cilësi të jetë e mundur.

Programet ose fragmentet e tyre shkruhen në gjuhën e asamblesë në rastet kur ato janë jashtëzakonisht të rëndësishme:

  • sasia e memories së përdorur (programe ngarkuese, programe të integruara, programe për mikrokontrollues dhe procesorë me burime të kufizuara, viruse, mbrojtje softuerike, etj.);
  • shpejtësia (programet e shkruara në gjuhën e asamblesë funksionojnë shumë më shpejt se programet analoge të shkruara në gjuhë programimi të një niveli të lartë abstraksioni. si rezultat, programi fillon të funksionojë më shpejt, por humbet transportueshmërinë dhe shkathtësinë).
Përveç kësaj, njohja e gjuhës së asamblesë e bën më të lehtë të kuptuarit e arkitekturës së një kompjuteri dhe funksionimit të harduerit të tij, diçka që njohuritë nuk mund ta japin. gjuhë abstraksioni të nivelit të lartë(JAVU). Aktualisht, shumica e programuesve zhvillojnë programe në mjedise të projektimit të shpejtë(Rapid Application Development) kur krijohen të gjithë elementët e nevojshëm të dizajnit dhe kontrollit duke përdorur komponentë vizualë të gatshëm. Kjo thjeshton shumë procesin e programimit. Sidoqoftë, shpesh na duhet të përballemi me situata të tilla kur funksionimi më i fuqishëm dhe më efikas i moduleve individuale të softuerit është i mundur vetëm nëse ato janë të shkruara në gjuhën e asamblesë (insertet e asemblerit). Në veçanti, në çdo program që lidhet me ekzekutimin e procedurave ciklike të përsëritura, qofshin ato cikle llogaritjesh matematikore ose prodhimi i imazheve grafike, këshillohet që të grupohen operacionet që kërkojnë më shumë kohë në nënmodule të programuara në gjuhën e asamblesë. Të gjitha paketat e gjuhëve moderne të programimit të një niveli të lartë abstraksioni e lejojnë këtë, dhe rezultati është gjithmonë një rritje e konsiderueshme e performancës së programit.

Gjuhët e programimit të një niveli të lartë abstraksioni u zhvilluan me qëllim që metoda e shkrimit të programeve të jetë sa më afër formave të zakonshme të shkrimit për përdoruesit e kompjuterit, në veçanti shprehjet matematikore, dhe gjithashtu në mënyrë që të mos merren parasysh veçoritë teknike specifike të kompjuterëve individualë në programe. Gjuha e asamblesë zhvillohet duke marrë parasysh specifikat e procesorit, prandaj, për të shkruar saktë një program në gjuhën e asamblesë, në përgjithësi duhet të dini arkitekturën e procesorit të kompjuterit të përdorur. Sidoqoftë, duke pasur parasysh shpërndarjen mbizotëruese të kompjuterëve personalë të pajtueshëm me PC dhe paketave të gatshme softuerike për ta, nuk duhet menduar për këtë, pasi shqetësime të tilla merren përsipër nga kompanitë-zhvillues të softuerëve të specializuar dhe universal.

2. Rreth përpiluesve

Cili montues është më i mirë?

Për procesorin x86-x64, ekzistojnë mbi një duzinë përpilues të ndryshëm të montimit. Ato ndryshojnë në grupe të ndryshme karakteristikash dhe sintaksë. Disa përpilues janë më të përshtatshëm për fillestarët, të tjerët për programues të avancuar. Disa përpilues janë mjaft mirë të dokumentuar, të tjerët nuk kanë fare dokumentacion. Për disa përpilues, janë zhvilluar shumë shembuj programimi. Ka udhëzime dhe libra të shkruar për disa montues që hyjnë në sintaksë në detaje, të tjerët nuk kanë asgjë. Cili montues është më i mirë?

Duke pasur parasysh dialektet e shumta të montuesve për x86-x64 dhe kohën e kufizuar për t'i studiuar ato, ne do të kufizohemi në një përmbledhje të shkurtër të përpiluesve të mëposhtëm: MASM, TASM, NASM, FASM, GoASM, Gas, RosAsm, HLA.

Çfarë sistemi operativ do të dëshironit të përdorni?

Kjo është pyetja e parë që duhet t'i përgjigjeni. Asambleri më i pasur me veçori nuk do t'ju bëjë asgjë nëse nuk është krijuar për të punuar me sistemin operativ që planifikoni të përdorni.
Dritaret DOS Linux BSD QNX MacOS po funksionon
Procesor Intel / AMD
FASM x x x x
GAZI x x x x x x
GoAsm x
HLA x x
MASM x x
NASM x x x x x x
RosAsm x
TASM x x

Mbështetje 16 bit

Nëse assembler mbështet DOS, atëherë ai gjithashtu mbështet udhëzimet 16-bit. Të gjithë asamblerët ofrojnë mundësinë për të shkruar kodin që përdor operandë 16-bit. Mbështetja 16-bit do të thotë që ju mund të krijoni kod që funksionon në një model memorie të copëtuar 16-bit (përkundrejt modelit të memories së sheshtë 32-bit të përdorur nga shumica e sistemeve operative moderne).

Mbështetje 64 bit

Me përjashtim të TASM, për të cilin Borland humbi interesin në mesin e viteve 2000 dhe që nuk mbështet plotësisht as programet 32-bit, të gjitha dialektet e tjera mbështesin zhvillimin e aplikacioneve 64-bit.

Transportueshmëria e programeve

Natyrisht, nuk do të shkruani kodin e montimit x86-x64 që funksionon në ndonjë procesor tjetër. Megjithatë, edhe në një procesor të vetëm, mund të hasni në probleme transportueshmërie. Për shembull, nëse keni ndërmend të përpiloni dhe përdorni programet tuaja në gjuhën e asamblesë nën sisteme të ndryshme operative. NASM dhe FASM mund të përdoren në sistemet operative që ata mbështesin.

A keni ndërmend të shkruani një aplikacion në asembler dhe më pas ta transferoni atë aplikacion nga një OS në tjetrin me kodin burimor "të rikompiluar"? Kjo veçori mbështetet nga dialekti HLA. A prisni të jeni në gjendje të krijoni aplikacione Windows dhe Linux në asembler me përpjekje minimale për ta bërë këtë? Megjithëse, nëse jeni duke punuar me një sistem operativ dhe absolutisht nuk planifikoni të punoni në ndonjë OS tjetër, atëherë ky problem nuk ju shqetëson.

Mbështetje për konstruktet gjuhësore të nivelit të lartë

Disa asamblerë ofrojnë sintaksë të zgjeruar që ofron struktura kontrolli të nivelit të lartë specifik për gjuhën (si p.sh. IF, WHILE, FOR, e kështu me radhë). Konstruksione të tilla mund ta bëjnë më të lehtë mësimin e asemblerit dhe t'ju ndihmojnë të shkruani kode më të lexueshme. Disa montues kanë "konstruksione të nivelit të lartë" të integruar me aftësi të kufizuara. Të tjerët ofrojnë konstruksione të nivelit makro të nivelit të lartë.

Asnjë montues nuk ju detyron të përdorni ndonjë strukturë kontrolli të nivelit të lartë ose lloj të dhënash nëse preferoni të punoni në nivelin e kodimit të udhëzimeve të makinës. Konstruktet e nivelit të lartë janë një zgjatim i gjuhës bazë të makinës që mund t'i përdorni nëse i gjeni të rehatshme.

Cilësia e dokumentacionit

Përdorshmëria e montimit lidhet drejtpërdrejt me cilësinë e dokumentacionit të tij. Duke marrë parasysh sasinë e punës që shpenzohet për krijimin e një dialekti montues, autorët e përpiluesit vështirë se shqetësohen të krijojnë dokumentacion për këtë dialekt. Autorët, duke zgjeruar gjuhën e tyre, harrojnë të dokumentojnë këto shtesa.

Tabela e mëposhtme përshkruan cilësinë e manualit të referencës së montimit që vjen me produktin:

Dokumentacioni Komentet (1)
FASM Mirë Autori ia kushton shumicën e kohës së tij të lirë zhvillimit të një FASMG inovative. Megjithatë, autori ofron mbështetje për FASM herë pas here, përditëson manualet dhe përshkruan funksione të reja në forumin e tij. Dokumentacioni është mjaft i mirë. Faqja e internetit e dokumentacionit.
Gazi
E keqe
është i dokumentuar dobët dhe dokumentacioni është mjaft "i përgjithshëm". gazi është një montues që është krijuar për ta bërë të lehtë shkrimin e kodit për procesorë të ndryshëm. Dokumentacioni që ekziston kryesisht përshkruan pseudokodet dhe direktivat e montimit. Praktikisht nuk ka asnjë dokumentacion në modalitetin e funksionimit "intel_syntax". Libra që përdorin sintaksën AT&T: Programimi nga e para nga Jonathon Bartlett dhe Gjuha e Asamblesë Profesionale nga Richard Blum, Konstantin Boldyshev.
GoAsm
I dobët
Shumica e sintaksës mbulohet në manual dhe një përdorues me përvojë do të gjejë atë që kërkon. Shumë mësime dhe të postuara në faqen (http://www.godevtool.com/). Disa udhëzime GoAsm:
  • Manuali i Patrick Ruiz
HLA
Pastrim
HLA ka një manual referencë prej 500 faqesh. Faqja përmban dhjetëra artikuj dhe dokumentacion HLA.
MASM
Mirë
Microsoft ka shkruar një sasi të konsiderueshme dokumentacioni për MASM, ka një numër të madh librash referencë të shkruar për këtë dialekt.
NASM
Mirë
Autorët e NASM shkruajnë më shumë softuer për këtë dialekt, duke e lënë shkrimin manual për më vonë. NASM ka ekzistuar për një kohë të gjatë, kështu që disa autorë shkruan një manual për NASM Jeff Duntemann "Gjuha e montimit hap pas hapi: Programimi me Linux", Jonathan Leto "Shkrimi i një programi të dobishëm me NASM", në Rusisht ekziston një libër nga Stolyarov (faqja e internetit e A.V. Stolyarov).
RosAsm
I dobët
"tutoriale online" jo shumë interesante.
TASM
Mirë
Borland ka prodhuar udhërrëfyes të shkëlqyer referimi në një kohë, dhe udhëzues referimi janë shkruar për TASM nga autorë entuziastë që nuk kanë lidhje me Borland. Por Borland nuk e mbështet më TASM, kështu që një pjesë e madhe e dokumentacionit për TASM nuk është e shtypur dhe po bëhet gjithnjë e më e vështirë për t'u gjetur.

Tekste dhe materiale mësimore

Dokumentacioni i gjuhës së asamblesë është sigurisht shumë i rëndësishëm. Me interes edhe më të madh për fillestarët dhe të tjerët që mësojnë gjuhën e asamblesë (ose veçoritë e avancuara të një gjuhe të caktuar asambleje) është disponueshmëria e dokumentacionit jashtë manualit të referencës për gjuhën. Shumica e njerëzve duan një tutorial që shpjegon se si të programohet në montim që bën më shumë sesa thjesht të sigurojë sintaksën e udhëzimeve të makinës dhe presin që lexuesit t'i thuhet se si t'i kombinojë këto udhëzime për të zgjidhur problemet e botës reale.

MASM është lider midis një vëllimi të madh librash që përshkruajnë se si të programohet në këtë dialekt. Ka dhjetëra libra që përdorin MASM si montuesin e tyre për mësimin e montimit.

Shumica e teksteve shkollore të montimit MASM / TASM vazhdojnë të mësojnë programimin MS-DOS. Megjithëse, gradualisht shfaqen mësime që mësojnë programimin në Windows dhe Linux.

Komentet (1)
FASM Disa mësime që përshkruajnë programimin FASM:
  • S.A. Norseev "Zhvillimi i aplikacioneve për dritare në FASM"
  • Ruslan Ablyazov "Programimi në gjuhën e asamblesë në platformën x86-64"
Gazi
Tutorial duke përdorur sintaksën AT&T
Një tutorial Linux Assembler për programuesit C
HLA
Versioni 32-bit i "The Art of Assembly Language Programming" (ekziston si në formë elektronike ashtu edhe në formë të shtypur), programim për Windows ose Linux
MASM
një numër i madh librash për mësimdhënien e programimit DOS. Nuk ka shumë libra në lidhje me programimin Win32 / 64 Pirogov, Yurov, Zubkov, Flinov
NASM
shumë libra kushtuar programimit në DOS, Linux, Windows. Libri i Jeff Dunteman Gjuha e Kuvendit Hap pas hapi: Programimi me Linux përdor NASM për Linux dhe DOS. Tutoriali i Paul Carter përdor NASM (DOS, Linux).
TASM
Ashtu si me MASM, një numër i madh librash të bazuar në DOS janë shkruar për TASM. Por meqenëse Borland nuk e mbështet më këtë produkt, ata ndaluan së shkruari libra për përdorimin e TASM. Tom Swann shkroi një tutorial mbi TASM me disa kapituj mbi programimin e Windows.

3. Literatura dhe burimet e internetit

Fillestare

  1. Abel P. Gjuha Assembler për IBM PC dhe programim. - M .: Shkolla e lartë, 1992 .-- 447 f.
  2. Bradley D. Programimi në gjuhën e asamblesë për kompjuterët personal nga IBM. - M .: Radio dhe komunikimi, 1988. - 448 f.
  3. Galiseev G.V. Assembler IBM PC. Libër vetë-udhëzimi .: - M .: Shtëpia botuese "Williams", 2004. - 304 f.: ill.
  4. Dao L. Programimi i mikroprocesorit 8088 .-- M .: Mir, 1988 .-- 357 f.
  5. Zhukov A.V., Avdyukhin A.A. montues. - SPb .: BHV-Petersburg, 2003 .-- 448 f.: ill.
  6. Zubkov S.V., Assembler për DOS, Windows dhe UNIX. - M .: DMK Press, 2000 .-- 608 f.: ill. (Seria "Për programuesit").
  7. Irwin K. Gjuha e Kuvendit për procesorët Intel, botimi i 4-të .: përkth. nga anglishtja - M .: Shtëpia botuese "Williams", 2005. - 912 f.: ill. - Paralelisht. cicë. anglisht (shih gjithashtu botimin e fundit të 7-të në origjinal)
  8. Norton P., Souhe D. Gjuha e asamblesë për IBM PC. - M .: Computer, 1992. - 352 f.
  9. Pil'shchikov V.N. Programimi në gjuhën e asamblesë së IBM PC - M .: DIALOG-MEPhI, 1994–2014 288 f.
  10. Sklyarov I.S. Asambleri mësimor në 7 ditë www.sklyaroff.ru

E avancuar

  1. Kaspersky K. Bazat e hakerimit. Arti i çmontimit. - M .: SOLON-Press, 2004.448 f. - (Seriali "Kodokopatel")
  2. Kaspersky K. Teknika për korrigjimin e programeve pa kode burimore. - SPb .: BHV-Petersburg, 2005 .-- 832 f.: ill.
  3. Kaspersky K. Viruset kompjuterike brenda dhe jashtë. - SPb .: Peter, 2006 .-- 527 f.: ill.
  4. Kaspersky K. Shënime të një studiuesi të viruseve kompjuterike. - SPb .: Peter, 2006 .-- 316 f.: ill.
  5. Knut D. Arti i Programimit, Vëllimi 3. Renditja dhe Kërkimi, Botimi i 2-të: përkth. nga anglishtja - M .: Shtëpia botuese "Williams", 2003. - 832 f.: ill. - Paralelisht. cicë. anglisht
  6. Kolisnichenko D.N. Rootkits për Windows. Teoria dhe praktika e programimit të "kapave të padukshme", duke lejuar fshehjen e të dhënave, proceseve, lidhjeve të rrjetit nga sistemi. - SPb .: Nauka i Teknika, 2006 .-- 320 f.: ill.
  7. Lyamin L.V. Makro assembler MASM.– M .: Radio dhe komunikim, 1994.– 320 f.: ill.
  8. Magda Y. Assembler për procesorët Intel Pentium. - SPb .: Peter, 2006 .-- 410 f.: ill.
  9. Mayko G.V. Assembler për IBM PC - M .: Business-Inform, Sirin, 1997. - 212 f.
  10. Warren G. Tricks Algorithmic for Programmers, 2nd ed .: trans. nga anglishtja - M .: Shtëpia botuese "Williams", 2004. - 512 f.: ill. - Paralelisht. cicë. anglisht
  11. Sklyarov I.S. Arti i mbrojtjes dhe hakerimit të informacionit. - SPb .: BHV-Petersburg, 2004 .-- 288 f.: ill.
  12. Weatherrell C. Studime për programues: Per. nga anglishtja - M .: Mir, 1982 .-- 288 f., Ill.
  13. Biblioteka elektronike e vëllezërve Frolov www.frolov-lib.ru
  14. A.A. Chekatov Përdorimi i Turbo Assembler në zhvillimin e softuerit - Kiev: Dialectics, 1995. - 288 f.
  15. Yurov V. Assembler: një libër i veçantë referimi.- SPb .: Peter, 2001.- 496 f.: ill.
  16. Yurov V. Asambler. Punëtori. 2nd ed. - SPb .: Peter, 2006 .-- 399 f.: ill.
  17. Yurov V. Asambler. Libër mësuesi për universitetet. 2nd ed. - SPb .: Peter, 2007 .-- 637 f.: ill.
  18. Kursi i trajnimit për Assembler Pirogov V.. 2001 Dituria
  19. Kursi i trajnimit Pirogov V. ASSEMBLER 2003 Knowledge-BHV
  20. V. Pirogov Montues për dritare
    Botimi i parë - M .: Shtëpia botuese Molgachev S.V., 2002
    Edicioni i 2-të - SPb.:. BHV-Petersburg, 2003 - 684 f.: ill.
    Edicioni i 3-të - SPb.:. BHV-Petersburg, 2005 - 864 f.: ill.
    Edicioni i 4-të - SPb.:. BHV-Petersburg, 2012 - 896 f.: ill.
  21. V. Pirogov Assembler sipas shembujve. - SPb.:. BHV-Petersburg, 2012 - 416 f.: ill.
  22. V. Pirogov MONTETRI dhe çmontimi. - SPb.:. BHV-Petersburg, 2006 .-- 464 f.: ill.
  23. Pirogov V. punoi në librin "Programimi 64-bit në gjuhën e asamblesë (Windows, Unix)". Libri mbulon programimin me fasm në Windows 64-bit dhe Unix
  24. Yurov V., Khoroshenko S. Assembler: kurs trajnimi.- SPb .: Peter, 1999. - 672 f.
  25. Yu-Zheng Liu, Gibson G. 8086/8088 Mikroprocesorët. Arkitektura, programimi dhe projektimi i sistemeve mikrokompjuterike - M .: Radio dhe komunikimi, 1987. - 512 f.
  26. Agner Fog: Burimet e optimizimit të softuerit (montim / c ++) 1996 - 2017.

Polyakov Andrey Valerievich

http://info-master.su

[email i mbrojtur]

av-inf.blogspot.ru

Në kontakt me:

vk.com/id185471101

facebook.com/100008480927503

Një faqe e një libri:

http://av-assembler.ru/asm/afd/assembler-for-dummy.htm

KUJDES!

Të gjitha të drejtat e këtij libri i përkasin Andrey V. Polyakov. Asnjë pjesë e këtij libri nuk mund të riprodhohet në asnjë formë pa pëlqimin e autorit.

Informacioni që përmban ky libër është marrë nga burime që autori i konsideron të besueshme. Megjithatë, duke pasur parasysh gabimet e mundshme njerëzore ose teknike, autori nuk mund të garantojë saktësinë dhe plotësinë absolute të informacionit të dhënë dhe nuk është përgjegjës për gabimet dhe dëmet e mundshme që vijnë nga përdorimi i këtij dokumenti.

1. LEJET

Lejohet përdorimi i librit për qëllime informative dhe edukative (vetëm për përdorim personal). Lejohet shpërndarja falas e librit.

2. KUFIZIMET

Ndalohet përdorimi i librit për qëllime tregtare (shitje, vendosje në burime me akses të paguar, etj.). Ndalohet të bëhen ndryshime në tekstin e librit. Atribuimi është i ndaluar.

Shiko gjithashtu MARRËVESHJA E LICENCËS.

Polyakov A.V.

Montues për Dummies

Polyakov A.V. Montues për dummies.

PARATHËNIE ..................................................... ................................................ ................................................ ...........

PREZANTIMI ................................................. ................................................ ................................................ .....................

N SHUMË PËR PROCESORËT.......................................................................................................................................................

1. FILLIM I SHPEJTË ................................................ ................................................ ................................................ .......

1.1. PROGRAMI I PARE ..................................................... ................................................ ................................................ .....

1.1.1. Emu8086 ..................................................... ................................................ ................................................ ...........

1.1.2. Korrigjimi ................................................ ................................................ ................................................ .............

1.1.3. MASM, TASM dhe WASM .............................................. ................................................ ................................................

1.1.3.1. Montimi në TASM ..................................................... ................................................ ................................................

1.1.3.2. Montimi në MASM ..................................................... ................................................ ................................................

1.1.3.3. Montimi në WASM ..................................................... ................................................ ................................................

1.1.3.4. Ekzekutimi i programit ................................................ ................................................ ................................................

1.1.3.5. Përdorimi i skedarëve BAT ................................................. ................................................ . ................................................

1.1.4. Redaktori heksadecimal ................................................ ................................................ .....................

përmbledhje..................................................... ................................................ ................................................ ......................

2. HYRJE NË MONTITORIN ............................................ ................................................ ................................................

2.1. TE AK KA KOMPJUTER...............................................................................................................................................

2.1.1. Struktura e procesorit ..................................................... ................................................ ......................................

2.1.2. Regjistrat e procesorëve ................................................ ................................................ .....................................

2.1.3. Cikli i ekzekutimit të komandës ..................................................... ................................................ ............................

2.1.4. Organizimi i memories ..................................................... ................................................ ................................................

2.1.5. Modaliteti real ..................................................... ................................................ ................................................

2.1.6. Modaliteti i mbrojtur ................................................ ................................................ ......................................

2.2. ME SISTEMET LLOGARITES.....................................................................................................................................................

2.2.1. Sistemi binar i numrave ..................................................... ................................................ ................................

2.2.2. Sistemi i numrave heksadecimal ..................................................... ................................................ ....

2.2.3. Sisteme të tjera ................................................ ................................................ ................................................

2.3. P EDITIMI I TË DHËNAVE NË KUJTETIN E KOMPJUTERIT.............................................................................................................

2.3.1. Numrat pozitiv ..................................................... ................................................ ................................

2.3.2. Numrat negativ ..................................................... ................................................ ................................

2.3.3. Çfarë është tejmbushja ..................................................... ................................................ ................................

2.3.4. Regjistri i flamujve ................................................ ................................................ ................................................

2.3.5. Kodet e karaktereve ..................................................... ................................................ .....................................................

2.3.6. Numrat real ..................................................... ................................................ ................................................

2.3.6.1. Provo së pari ................................................ ................................................ ................................................ ..........

2.3.6.2. Regjistrimi i numrave të normalizuar ................................................... ................................................ ................................

2.3.6.3. Shndërrimi i pjesës thyesore në binare ................................................. ................................................ . ...

2.3.6.4. Paraqitja e numrave realë në memorien e kompjuterit .......................................... ..........................................

2.3.6.5. Numrat e pikave fikse ................................................ . ................................................ . ......................................

2.3.6.6. Numrat me pikë lundruese ................................................ . ................................................ . ................................................

MARRËVESHJA E LICENCËS................................................ ................................................ ......................................

PARATHËNIE

Assembler është një fjalë magjike që zgjon programuesit fillestarë. Kur komunikojnë me njëri-tjetrin, ata domosdoshmërisht thonë se diku dikush ka një "djalë" të njohur që mund të lexojë kodet burimore në gjuhën e asamblesë si një tekst libri. Në të njëjtën kohë, si rregull, gjuha e asamblesë perceptohet si diçka e paarritshme për njerëzit e thjeshtë.

Kjo është pjesërisht e vërtetë. Ju mund të mësoni disa komanda të thjeshta dhe madje të shkruani një lloj programi, por mund të bëheni një guru i vërtetë (në çdo biznes) vetëm nëse një person i njeh shumë mirë bazat teorike dhe e kupton se çfarë dhe pse po bën.

Në ekstremin tjetër, programuesit me përvojë të nivelit të lartë janë të bindur se gjuha e asamblesë është një relike e së shkuarës. Po, mjetet e zhvillimit kanë bërë përparime të mëdha gjatë 20 viteve të fundit. Tani mund të shkruani një program të thjeshtë pa ditur asnjë gjuhë programimi fare. Megjithatë, mos harroni për gjëra të tilla si mikrokontrolluesit. Dhe në programimin kompjuterik, disa detyra janë më të lehta dhe më të shpejta për t'u zgjidhur duke përdorur gjuhën e asamblesë.

Ky libër është menduar për ata që tashmë kanë aftësi programimi të nivelit të lartë, por dëshirojnë të lëvizin "më afër harduerit" dhe të kuptojnë se si ekzekutohen udhëzimet e procesorit, si shpërndahet memoria, si menaxhohen pajisjet e ndryshme harduerike si disqet e diskut, etj. ..P.

Libri është i ndarë në disa pjesë. Seksioni i parë është një fillim i shpejtë. Ai përshkruan shumë shkurt parimet bazë të programimit në gjuhën e asamblesë, vetë asemblerët (përpiluesit) dhe metodat e punës me asemblerët. Nëse ndiheni të sigurt në programimin në një nivel të lartë, por dëshironi të zotëroni bazat e programimit të nivelit të ulët, atëherë ndoshta do t'ju duhet vetëm të lexoni këtë seksion.

Seksioni i dytë përshkruan gjëra të tilla si sistemet e numrave, paraqitjet e të dhënave në kujtesën e kompjuterit, etj., domethënë gjëra që nuk lidhen drejtpërdrejt me programimin, por pa të cilat programimi profesional është i pamundur. Gjithashtu, pjesa e dytë diskuton në mënyrë më të detajuar parimet e përgjithshme të programimit në gjuhën e asamblesë.

Pjesa tjetër e seksioneve përshkruajnë disa shembuj specifikë të programimit të gjuhës së asamblesë, përmbajnë materiale referimi, etj.

Bazat e programimit nuk përshkruhen fare në këtë libër, kështu që për fillestarët ju rekomandoj fuqimisht që të njiheni me librin Si të bëheni programues, ku parimet e përgjithshme të programimit shpjegohen "në gishta" dhe shembujt e krijimit të programeve të thjeshta nga programet për kompjuterë në programet për makinat CNC janë shqyrtuar në detaje.

PREZANTIMI

Le të fillojmë me terminologjinë.

Kodi i makinës është një sistem udhëzimesh të një kompjuteri (procesori) specifik, i cili interpretohet drejtpërdrejt nga procesori. Një instruksion është zakonisht një numër i plotë që shkruhet në një regjistër procesor. Procesori lexon këtë numër dhe kryen operacionin që përputhet me këtë instruksion. Kjo përshkruhet gjerësisht në libër Si të bëheni programues.

Gjuhë programimi e nivelit të ulët(gjuhë programimi të nivelit të ulët) është një gjuhë programimi që është sa më afër programimit në kodet e makinës. Ndryshe nga kodet e makinerisë, në një gjuhë të nivelit të ulët, çdo komandë nuk korrespondon me një numër, por me një emër të shkurtuar komande (mnemonik). Për shembull, ADD është një shkurtim për ADDITION. Prandaj, përdorimi i një gjuhe të nivelit të ulët thjeshton shumë shkrimin dhe leximin e programeve (krahasuar me programimin në kodet e makinës). Një gjuhë e nivelit të ulët është specifike për procesorin. Për shembull, nëse keni shkruar një program të nivelit të ulët për procesorin PIC, mund të jeni i sigurt se ai nuk do të funksionojë me procesorin AVR.

Gjuhë programimi të nivelit të lartëËshtë një gjuhë programimi që është sa më afër të jetë e mundur me një gjuhë njerëzore (zakonisht në anglisht, por ka gjuhë programimi në gjuhët kombëtare, për shembull, gjuha 1C bazohet në Rusisht). Një gjuhë e nivelit të lartë praktikisht nuk është e lidhur me një procesor specifik ose me një sistem operativ (përveç nëse përdoren direktiva specifike).

Gjuha Asamble është një gjuhë programimi e nivelit të ulët në të cilën ju shkruani programet tuaja. Çdo procesor ka gjuhën e vet të montimit.

Asambleri është një program i veçantë që konverton (bashkon, d.m.th. mbledh) kodin burimor të programit tuaj të shkruar në gjuhën e asamblesë në një skedar të ekzekutueshëm (skedar me shtesën EXE ose COM). Për të qenë të saktë, programe shtesë kërkohen për të krijuar një skedar të ekzekutueshëm, jo ​​vetëm një asembler. Por më shumë për këtë më vonë...

Në shumicën e rasteve, ata thonë "asembler", por do të thotë "gjuhë e asamblesë". Tani ju e dini se këto janë gjëra të ndryshme dhe nuk është plotësisht e saktë të thuhet kjo. Edhe pse të gjithë programuesit do t'ju kuptojnë.

Ndryshe nga gjuhët e nivelit të lartë si Pascal, BASIC, etj., CDO ASEMBLER ka GJUHËN E VETËN E ASSEMBLE. Ky rregull e dallon thelbësisht gjuhën e asamblesë nga gjuhët e nivelit të lartë. Kodet burimore të një programi (ose thjesht "burimet") të shkruara në një gjuhë të nivelit të lartë, në shumicën e rasteve mund t'i përpiloni me përpilues të ndryshëm për procesorë të ndryshëm dhe sisteme të ndryshme operative. Do të jetë shumë më e vështirë për ta bërë këtë me burimet e montimit. Sigurisht, ky ndryshim është pothuajse i padukshëm për montues të ndryshëm që janë krijuar për të njëjtët procesorë. Por fakti i çështjes është se për CDO PROCESOR ka MONTITORËT E VETËN dhe GJUHËN E VETET MONTITORË. Në këtë kuptim, programimi në gjuhë të nivelit të lartë është shumë më i lehtë. Megjithatë, ju duhet të paguani për të gjitha kënaqësitë. Në rastin e gjuhëve të nivelit të lartë, mund të hasim gjëra të tilla si madhësia më e madhe e skedarit të ekzekutueshëm, performanca më e keqe, etj.

Në këtë libër, ne do të flasim vetëm për programimin për kompjuterë me procesorë Intel (ose të pajtueshëm). Për të kontrolluar në praktikë të dhënën

v Në librin e shembujve, do t'ju nevojiten programet e mëposhtme (ose të paktën disa prej tyre):

1. Emu8086. Program i këndshëm, veçanërisht për fillestarët. Përfshin një redaktues burimi dhe disa gjëra të tjera të dobishme. Punon në Windows, megjithëse programet shkruhen nën DOS. Fatkeqësisht, programi kushton para (por ia vlen))). Shikoni http://www.emu8086.com për detaje.

2. TASM - Turbo Assembler nga Borland. Ju mund të krijoni programe si për DOS ashtu edhe për Windows. Gjithashtu kushton para dhe nuk mbështetet më për momentin (dhe Borland nuk ekziston më). Në përgjithësi, është një gjë e mirë.

3. MASM - Assembler nga Microsoft (që do të thotë MACRO assembler, jo Microsoft Assembler, siç mendojnë shumë njerëz të pa iniciuar). Ndoshta montuesi më i popullarizuar për procesorët Intel. Ajo është ende e mbështetur. Program shareware. Kjo do të thotë, nëse e blini veçmas, atëherë do të kushtojë para. Por është i disponueshëm falas për abonentët e MSDN dhe përfshihet në paketën Visual Studio të Microsoft.

4. WASM - montues nga Watcom. Si gjithë të tjerët, ai ka avantazhe dhe disavantazhe.

5. Debug - ka veçori modeste, por ka një plus të madh - është i përfshirë në grupin standard të Windows. Kërkojeni në dosjen WINDOWS \ COMMAND ose WINDOWS \ SYSTEM32. Nëse nuk e gjeni, atëherë në dosjet e tjera të drejtorisë WINDOWS.

6. Është gjithashtu e dëshirueshme që të ketë ndonjë redaktor hex... Mos e lëndoni dhe menaxherin e skedarëve DOS, për shembull Volkov Commander (VC) ose Norton Commander (NC). Ato mund të përdoren gjithashtu për të parë kodet heksadecimal të skedarit, por nuk mund të modifikohen. Ka mjaft redaktues heksadecimal falas në internet. Këtu është një: McAfee FileInsight v2.1. I njëjti redaktues mund të përdoret për të punuar me kodet burimore të programeve. Sidoqoftë, më pëlqen ta bëj më mirë me redaktorin e mëposhtëm:

7. Redaktori i tekstit... Është e nevojshme për të shkruar kodin burimor të programeve tuaja. Unë mund të rekomandoj redaktuesin falas të PSPad, i cili mbështet shumë gjuhë programimi, duke përfshirë Asamblenë.

Të gjitha programet (dhe programet mostër) të paraqitura në këtë libër janë testuar për funksionueshmëri. Dhe janë këto programe që përdoren për të zbatuar programet shembull në këtë libër.

E megjithatë - kodi burimor i shkruar, për shembull, për Emu8086, do të ndryshojë pak nga kodi i shkruar, për shembull, për TASM. Këto dallime do të diskutohen.

Shumica e programeve në libër janë shkruar për MASM. Së pari, sepse ky montues është më i popullarizuari dhe ende i mbështetur. Së dyti, sepse dërgohet me MSDN dhe paketën Visual Studio të Microsoft. Dhe së treti, sepse jam pronar krenar i një kopjeje të licencuar të MASM.

Nëse tashmë keni ndonjë asembler që nuk është përfshirë në listën e mësipërme, atëherë do t'ju duhet të kuptoni vetë sintaksën e tij dhe të lexoni manualin e përdoruesit në mënyrë që të mësoni se si të punoni me të saktë. Por rekomandimet e përgjithshme të dhëna në këtë libër do të jenë të vlefshme për çdo montues (mirë, ose pothuajse çdo).

Pak për procesorët

Procesori është truri i kompjuterit. Fizikisht, ky është një mikroqark i veçantë me disa qindra kunja që futet në motherboard. Nëse vështirë se mund ta imagjinoni se çfarë është, ju rekomandoj të lexoni artikullin Idetë për kompjuterët.

Ka mjaft procesorë edhe në botën e kompjuterëve. Por përveç kompjuterëve, ka edhe televizorë, lavatriçe, kondicionerë, sisteme kontrolli për motorët me djegie të brendshme etj., ku përdoren shumë edhe procesorët (mikroprocesorët, mikrokontrolluesit).

Çdo procesor ka grupin e vet të regjistrave. Regjistrat e procesorit janë vendndodhje të veçanta të memories që qëndrojnë drejtpërdrejt në çipin e procesorit. Regjistrat përdoren për qëllime të ndryshme (më shumë detaje rreth regjistrave do të shkruhen më poshtë).

Çdo procesor ka grupin e vet të udhëzimeve. Instruksioni i procesorit shkruhet në një regjistër specifik dhe më pas procesori e ekzekuton këtë instruksion. Ne do të flasim për udhëzimet dhe regjistrat e procesorit shumë dhe shpesh gjatë gjithë librit. Për fillestarët, unë rekomandoj librin Si të bëheni programues, ku, në terma më të përgjithshëm, por në një gjuhë të kuptueshme, tregohet për parimet e ekzekutimit të një programi nga një kompjuter.

Çfarë është një komandë përsa i përket procesorit? Është vetëm një numër. Sidoqoftë, procesorët modernë mund të kenë disa qindra udhëzime. Do të jetë e vështirë t'i mbani mend të gjitha. Atëherë, si i shkruani programet? Për të thjeshtuar punën e programuesit, u shpik gjuha Asamble, ku çdo komandë korrespondon me një kod kujtimor. Për shembull, numri 4 korrespondon me ADD-në kujtese. Ndonjëherë gjuha e asamblesë quhet edhe gjuha e udhëzimeve mnemonike.

1. FILLIM I SHPEJTË

1.1. Programi i parë

Në mënyrë tipike, shembulli i parë është një program që printon vargun "Hello World!" Sidoqoftë, për një person që sapo ka filluar të mësojë Assembler, një program i tillë do të jetë shumë i ndërlikuar (do të qeshni, por është me të vërtetë - veçanërisht në mungesë të informacionit të kuptueshëm). Prandaj, programi ynë i parë do të jetë edhe më i thjeshtë - do të shfaqim vetëm një karakter - shkronjën angleze "A". Dhe në përgjithësi - nëse tashmë keni vendosur të bëheni programues - vendosni urgjentisht paraqitjen e parazgjedhur të tastierës angleze. Për më tepër, disa montues dhe përpilues nuk pranojnë shkronja ruse. Pra, programi ynë i parë do të shfaqë shkronjën angleze "A". Tjetra, ne do të shikojmë krijimin e një programi të tillë duke përdorur asamblerë të ndryshëm.

Nëse keni shkarkuar dhe instaluar emulatorin e procesorit 8086 (shih seksionin HYRJE), atëherë mund ta përdorni për të krijuar programet tuaja të para të gjuhës së asamblesë. Aktualisht (nëntor 2011) versioni 4.08 është i disponueshëm. Ju mund të gjeni ndihmë në Rusisht këtu: http://www.avprog.narod.ru/progs/emu8086/help.html.

Programi Emu8086 paguhet. Sidoqoftë, mund ta përdorni falas për 30 ditë.

Pra, ju keni shkarkuar dhe instaluar programin Emu8086 në kompjuterin tuaj. Ekzekutoni atë dhe krijoni një skedar të ri përmes menysë FILE - NEW - COM TEMPLATE (Skedar - I ri - shabllon i skedarit COM). Në redaktorin e burimit, pas kësaj, do të shohim sa vijon:

Oriz. 1.1. Krijimi i një skedari të ri në Emu8086.

Duhet të theksohet këtu se programet e krijuara duke përdorur Assemblers për kompjuterët me Windows janë dy llojesh: COM dhe EXE. Ne do t'i shikojmë ndryshimet midis këtyre skedarëve më vonë, por tani për tani ju vetëm duhet të dini se për herë të parë do të krijojmë skedarë të ekzekutueshëm me shtesën COM, pasi ato janë më të thjeshta.

Pas krijimit të skedarit në Emu8086 siç përshkruhet më sipër, në redaktuesin burimor do të shihni rreshtin "add your code listen" - "add your code here" (Fig. 1.1). Ne e fshijmë këtë rresht dhe në vend të kësaj fusim tekstin e mëposhtëm:

Kështu, teksti i plotë i programit do të duket si ky:

Përveç kësaj, ka komente në pjesën e sipërme (në Fig. 1.1 - ky është teksti i gjelbër). Një koment në gjuhën e asamblesë fillon me një karakter; (pikëpresje) dhe vazhdon deri në fund të rreshtit. Nëse nuk e dini se çfarë janë komentet dhe pse nevojiten, shihni librin Si të bëheni programues... Siç thashë tashmë, këtu nuk do të shpjegojmë bazat e programimit, pasi libri që po lexoni tani është krijuar për njerëzit që janë të njohur me bazat e programimit.

Vini re gjithashtu se gjuha e asamblesë nuk është e ndjeshme ndaj shkronjave të vogla. Mund të shkruani RET, ret ose Ret - ato do të jenë e njëjta komandë.

Ju mund ta ruani këtë skedar diku në disk. Por ju nuk keni për të. Për të ekzekutuar programin, shtypni butonin EMULATE (me një trekëndësh të gjelbër) ose tastin F5. Do të hapen dy dritare: dritarja e emulatorit dhe dritarja e kodit burimor (Fig. 1.2).

V dritarja e emulatorit shfaq regjistrat dhe butonat e kontrollit të programit. Dritarja e burimit shfaq burimin e programit tuaj, duke theksuar linjën që po ekzekutohet aktualisht. E gjithë kjo është shumë e përshtatshme për studimin dhe korrigjimin e programeve. Por ne nuk kemi nevojë për të ende.

V Në dritaren e emulatorit, mund ta ekzekutoni programin tuaj për ekzekutim në tërësi (butoni RUN) ose në modalitetin hap pas hapi (butoni SINGLE HAPI). Modaliteti hap pas hapi është i përshtatshëm për korrigjimin e gabimeve. Epo, tani do të fillojmë programin për ekzekutim me butonin RUN. Pas kësaj (nëse nuk keni bërë asnjë gabim në tekstin e programit), do të shihni një mesazh për përfundimin e programit (Fig. 1.3). Këtu jeni të informuar se programi ka transferuar kontrollin në sistemin operativ, domethënë programi ka përfunduar me sukses. Klikoni OK në këtë dritare dhe më në fund do të shihni rezultatin e programit tuaj të parë në gjuhën e asamblesë (Fig.

Oriz. 1.2. Dritarja e emulatorit Emu8086.

Oriz. 1.3. Mesazh për përfundimin e programit.

Oriz. 1.4. Programi juaj i parë ka përfunduar.

Artikujt kryesorë të lidhur