Scrierea programelor în limba de asamblare

Câmpurile sunt separate separat de file.

Numele datelor, procedurilor, segmentelor sau etichetelor de comandă pot consta nu mai mult de 255 litere sau cifre latine, primul caracter fiind obligatoriu o literă. În mod prestabilit, primele 32 de caractere sunt semnificative în nume. Literele mici și literele mici pot fi distinse sau dezasamblate de asamblor (tastele: / ML, / MU și / MX). Etichetele instrucțiunilor de mașină trebuie să se încheie cu un caracter colon.







La traducere, fiecărui nume i se atribuie un număr de atribute.

Câmpul de operare conține codul mnemonic al instrucțiunilor mașinii, al directivelor sau al macrocomenzilor. Literele mari și minuscule din codul mnemo al operației nu sunt diferențiate de asamblare.

Câmpul operanzilor este folosit pentru a scrie operanzi, dacă sunt necesari.

Dacă sunt mai mulți operanzi, ei sunt de obicei separați de a cincea.

În programele de asamblare sunt permise mai multe tipuri de constante:

· Zecimal - o secvență de cifre de la 0 la 9;

• Hexadecimal - o secvență de cifre hexazecimale de la 0 la 9 și de la A sau a la F sau f, terminând cu litera H sau h, prima trebuie să fie o cifră zecimală;

· Octal - o secvență de numere de la 0 la 7, terminând cu literele Q, q, O sau o;

· Binary - o secvență de cifre 0 sau 1, care se termină cu litera B sau b.

Mai jos este o structură tipică a unui program simplu în asamblare.

QUIT: exitcode 0

Directivele stivă, dataseg și codeseg sunt utilizate pentru a aloca segmente.

Macrocomanda de pornire conține un cod de inițializare care asigură încărcarea registrelor segmentului DS și SS.

Cod macro de ieșire <код возврата> efectuează finalizarea programului și transferul controlului asupra sistemului de operare. Parametru opțional <код возврата> este folosit pentru a returna o valoare care poate fi verificată în fișierele de comandă OS.

Directiva finală <метка точки входа> Ia act de sfârșitul textului programului și indică asamblorului, unde să finalizeze difuzarea. Prin urmare, directiva finală trebuie să fie prezentă în fiecare program. Parametru opțional <метка точки входа> indică instrucțiunile cu care programul ar trebui să înceapă.

<имя> DW <выражение>,<выражение>. și

<имя> DB <выражение>,<выражение>.

servesc pentru a defini date, cuvinte sau octeți, respectiv.

<выражение> poate fi o constantă sau, dacă valoarea nu este definită, puteți utiliza caracterul de marcator de întrebări.

desen <число> dup (<выражение>,<выражение>. ) este folosit pentru a repeta secvența de expresii în paranteze date <число> timp.

Programe de procesare în DOS

Procesarea programelor în limba de asamblare în DOS constă în mai multe etape:

· Traducerea programului folosind asamblorul TASM;

· Porniți și depanați programul.

Pentru a traduce fișierul sursă, introduceți linia de comandă după cum urmează:

TASM [, [] [, [] [, []]]] [<ключи>]

Notă. Numele de fișier NUL înseamnă că fișierul corespunzător nu este generat.

Pentru fișierele de intrare și ieșire, TASM utilizează următoarele valori prestabilite:

· Fișier sursă: extensie - ASM;

· Fișier obiect: numele coincide cu numele fișierului sursă, extensia este OBJ;

· Nume de fișier Listarea - NUL, dacă setați / L sau / LA - numele listării fișierul cu același nume ca și fișierul original, în cazul în care numele este specificat sau setați / L și / LA, extensia implicită - LST;

· Referință încrucișată nume de fișier - NUL, dacă setați tasta / C - numele fișierului referință încrucișată același nume ca și fișierul original în cazul în care este specificat sau definită cheie / C, extensia implicită numele - CRF.

Assembler are diferite moduri de traducere, dat de chei, cele mai frecvent utilizate pot fi considerate următoarele:

· / L și / LA - generează un fișier de listare sau o listă extinsă;

· / C - generează un fișier cu tabela de referință: lista de identificatori a modulului sursă, indicând numerele de linie ale programului în care este menționat identificatorul dat;

· / ZI - introduceți în modulul obiect informații complete pentru depanator: identificatori de date și etichete, numere de linie etc.

tasm primer / L / ZI

Fișierul PRIMER.ASM este tradus, fișierul de listare PRIMER.LST este creat și, dacă nu există erori, fișierul obiect PRIMER.OBJ. Fișierul obiect include informațiile complete pentru depanator.

Pentru a conecta un fișier obiect, trebuie să introduceți linia de comandă după cum urmează:

TLINK [, [] [, [] [, [<библиотеки>]]]] [<ключи>]

Pentru fișierele de intrare și ieșire TLINK utilizează următoarele valori prestabilite:

· Fișier obiect: extensie - OBJ;

· Fișier executabil: numele coincide cu numele fișierului obiect, extensia este EXE;

· Fișierul planului de module: numele este NUL dacă este dată cheia / M, numele fișierului modulului este același ca numele fișierului obiect; în cazul în care numele este specificat sau este specificată tasta / M, extensia implicită este MAP.

Constructorul are diferite moduri de traducere, setate de taste, cele mai utilizate în mod obișnuit sunt următoarele:

· / V - introduceți informații complete pentru debugger: identificatori de date și etichete, numere de linie etc.

tlink primer / M / V

Faceți o asamblare a fișierului obiect PRIMER.OBJ. Fișierul executabil va avea un nume - PRIMER.EXE, acesta va include informații pentru depanator. Se va crea un fișier plan de module cu numele PRIMER.MAP.

Puteți rula programul la execuție prin tastarea numelui fișierului de program pe linia de comandă (extensia EXE este opțională):

Pentru a rula sub debugger, trebuie să executați depanatorul cu numele fișierului programului:

Utilizarea programului de depanare TD

Fără a pretinde că este o descriere completă, iată o descriere a funcțiilor și capabilităților de bază ale depanatorului TD.

Cum se execută programul sub debugger

Rulați programul sub debugger introducând linia de comandă

Ce știe și nu poate face depanatorul TD

· Trace (execuție pas-cu-pas) - puteți executa un program pe un singur operator, săriți (sau nu sărind peste) în timp ce apelați proceduri și funcții;

· Puncte de intersecție - executați programul la punctul specificat din program;

· Modificare - puteți schimba conținutul variabilelor;

· Urmărire - puteți selecta unele variabile și puteți urmări modificarea valorilor lor în timp ce programul se execută.







· Nu pot recompila programul. Pentru aceasta, aveți nevoie de un compilator sau de un asamblator (de exemplu, TASM);

· Și cel mai important, debuggerul nu poate înlocui procesul de curățare. Turbo-debuggerul este un instrument puternic, dar în absența gândurilor, nu se economisesc nici timp, nici efort.

În fereastra Module, se afișează textul programului de depanare. Puteți naviga prin text, executa linii de program și vizualiza date și cod.

Fereastra procesorului (CPU) afișează starea curentă a procesorului (CPU). Această fereastră conține cinci panouri (zone) care arată:

Memorie dump (de obicei, un segment de date);

· Conținutul registrelor CPU;

· Conținutul steagurilor CPU.

Meniul local al ferestrei de vizionare (Alt + F10 sau Ctrl + F10) conține următoarele elemente:

• Edit (Editare) vă permite să editați expresia în fereastra Ceasuri. Puteți schimba ceea ce există sau puteți introduce o nouă valoare;

· Remove elimină intrarea selectată în mod curent din fereastra Ceasuri;

· Șterge tot elimină toate intrările din fereastra ceasurilor;

· Inspect deschide o casetă de bifare (fereastra Inspector), care afișează conținutul înregistrării evidențiate în mod curent în fereastra Ceasuri;

· Modificați modificarea valorii înregistrării evidențiate în prezent în fereastra Ceasuri la valoarea pe care o introduceți ca răspuns la solicitare.

În fereastra Dump, conținutul zonei de memorie este afișat în forma sa imediată. (Această fereastră este echivalentă cu aria de memorie a ferestrei procesorului.) Puteți exporta date ca caractere, octeți hexazecimali, cuvinte, cuvinte duble sau în orice format cu puncte în virgulă mobilă. Această fereastră poate fi utilizată pentru vizualizarea unor date direct atunci când nu aveți nevoie de restul ferestrei procesorului. În meniul local al acestei ferestre există comenzi care vă permit să modificați datele de ieșire, să modificați formatul ieșirii și să manipulați blocurile de date.

Meniul local al ferestrei Dump (Alt + F10 sau Ctrl + F10) conține elementele:

· Afișare ca - setează modul de ieșire a dumpării: octeți, cuvinte etc.

Ecranul utilizatorului este ecranul pentru afișarea programului dvs. Acest ecran va avea exact același aspect ca atunci când va executa programul fără un program de depanare (direct sub DOS).

Puteți utiliza acest ecran pentru a verifica ce afișează programul dvs. și dacă acesta corespunde cu ceea ce ar trebui să fie afișat pe ecran. Pentru a comuta la ecranul utilizatorului, selectați Fereastră + Ecran utilizator (sau apăsați Alt + F5).

Comanda Executare (F9) pornește programul pentru execuție. Când apare unul dintre următoarele evenimente, controlul este transferat la depanator:

· Programul dvs. a finalizat execuția;

· Se detectează un punct de întrerupere cu acțiunea de întrerupere;

· Ați întrerupt executarea cu tastele Ctrl + Break.

Mergeți la comanda Cursor

Comanda Go to Cursor rulează programul pe linia unde este localizat cursorul (în fereastra curentă a modulului sau în zona Cod a ferestrei CPU).

Comanda Trace Into

Comanda Trace Into (Direcție în profunzime, F7) execută o linie de instrucțiuni de cod sursă sau mașină. Dacă linia curentă conține un apel de procedură sau funcție, debuggerul efectuează o urmă a acestei proceduri. Cu toate acestea, dacă fereastra curentă este fereastra procesorului, se execută o instrucțiune de mașină.

Comanda Step Over (Pasul de trecere, F8) execută o linie de instrucțiuni de cod sursă sau mașină, ocolind următoarea procedură sau funcție chemată. În acest caz, se execută de obicei o singură linie a codului sursă al programului. Cu toate acestea, dacă fereastra curentă este o fereastră a procesorului, este executată o singură instrucțiune de mașină.

Când această comandă este executată pentru o singură instrucțiune de mașină, TurboBuster interpretează unele instrucțiuni ca unul, chiar dacă acestea conduc la mai multe instrucțiuni:

· Apelați - apelați subrutina;

· Întrerupeți întreruperea;

· Loop, loopz, loopnz - control buclă;

Rep, repnz sau repz, urmat de cmps, boats, movs, scas, stos.

Instrucțiuni de echipă Trace

Instrucțiunea Trace (Instrucțiune Trace, Alt + F7) execută o instrucțiune. Acesta poate fi utilizat atunci când doriți să urmărească întrerupe, sau când vă aflați în modulul fereastră și doriți să urmărească procedura sau funcția, care este situat în modulul fără informații de depanare (de exemplu, rutine de bibliotecă).

Comanda de resetare a programului

Comanda Resetare program (Reset program, Ctrl + F2) reîncarcă programul pe care îl debugați de pe disc.

EXEMPLU DE PERFORMANȚĂ

Se dă o serie de zece cuvinte care conțin numere întregi. Este necesar să găsiți valoarea maximă.

MASS dw 10h, 20h, 30h, 5h, 40h, 15h, 20h, 70h, 35h, 34h

ÖÈÊËÈ×ÅÑÊÈÅ È ÐÀÇÂÅÒÂËßÞÙÈÅÑß ÏÐÎÃÐÀÌÌÛ

Scopul acestei lucrări este de a dezvolta abilități în dezvoltarea de programe ciclice simple în limba de asamblare.

Pentru a genera codul de condiție, puteți folosi comenzile cmp, test. În plus, codurile condițiilor sunt generate de comenzi aritmetice și logice.

Pentru organizarea calculelor ciclice, puteți utiliza și instrucțiuni ramificate condiționate, cu toate acestea, în cazul organizării unei buclă pe un contor, este mai convenabil să utilizați comenzi buclă buclă.

EXEMPLU DE PERFORMANȚĂ

Se dă o serie de zece cuvinte care conțin numere întregi. Este necesar să găsiți valoarea maximă.

MASS dw 10h, 20h, 30h, 5h, 40h, 15h, 20h, 70h, 35h, 34h

Exemple de utilizare a comenzilor logice

Setați cei 3 și 0 biți din registrul AL, restul de biți nu se schimbă

sau AL, 00001001b.

Resetați cei 4 și 6 biți din registrul AL, restul de biți nu se modifică

și AL, 10101111b.

Pentru a inversa 4 și 2 biți în registrul AL, biții rămași nu se schimbă

xor AL, 00010100b.

Accesați eticheta LAB dacă sunt setate 4 biți din registrul AL, în caz contrar continuați executarea programului

test AL, 00010000b
jnz LAB
; continua
.
LAB:

Numără numărul celor din registrul de octeți AL

mov CX, 8
xor BX, BX
LL: shl AL, 1
jnc NO
inc BX
NR: buclă LL

EXEMPLU DE PERFORMANȚĂ

Se dă o serie de 10 octeți. Toți octeții au zero biți de ordin înalt. Acesta ar trebui să fiecare octet conținând 1 în bitul 0th, extins la un număr par de unități ale instalației de octeti bit 7-lea, fiecare octet conținând 0 în bitul 0th, pentru a adăuga la un număr impar de unități ale instalației de octeti bit 7-lea.

MB db 04h, 07h, 11h, 23h, 04h, 38h, 3Fh, 2h, 0hh, 34h

mov CX, 10; Contorul CX al numărului de iterații

mov AL, [BX]; citiți următorul octet al matricei

test AL, 00000001b; Este setat bitul 0?

jz BIT0CLR; nu, bitul 0 este șters

; bitul 0 este setat

test AL, 0FFh; un număr par de unități?

jp OK; da, nu face nimic altceva

sau AL, 80h; ciudat, adăugați până la eveniment

BIT0CLR :; bit 0 eliminat

test AL, 0FFh; un număr par de unități?

jnp OK; nu, nu face nimic altceva

sau AL, 80h; chiar, adăugați până la ciudat

mov [BX], AL; scrieți byte modificat de matrice

QUIT: exitcode 0

1. Având o serie de 10 octeți. Numără numărul de octeți în care sunt șterse 6 și 4 biți.

2. Având o serie de 8 octeți. Considerându-l ca o serie de 64 de biți, numărați numărul de unități.

3. Având o serie de 8 octeți. Considerând aceasta ca o serie de 64 de biți, se calculează lungimea celei mai lungi secvențe a celor doi.

4. Având o serie de 8 octeți. Considerând aceasta ca o matrice de valori logice x0 x1 x2 x3 x4 x5 x6 x7 (adevărat - există biți non-zero în byte, false - toți biții sunt zero), se calculează formula logică f = (x7

x6x3x1) V (x6x4x2x1

5. Se dă o serie de 5 octeți. Considerându-l ca o serie de 10 tetraduri, găsiți "exclusiv" sau "toate" din 10 tetraduri.

6. Se dă o serie de 10 octeți. Numără numărul de octeți în care se resetează 5 sau 1 biți.

7. Luați în considerare octetul ca un set de valori logice x7 x6 x5 x4 x3 x2x1x0 (true - 1, false - 0), calculați formula logică f = (x7

x6x3x1) V (x6x4x2x1

8. Având o serie de 10 octeți. Numără numărul de octeți în care sunt setați 3 și 7 biți.

1. Care este diferența dintre comenzile de test DST, SRC și DST, SRC?

2. Cum să resetați a șasea biți a unei variabile - BY byte?

3. Cum se stabilește bitul 5 al variabilei BY byte?

4. Cum inversez bitul 5 al unui BB cu octet variabil?

5.Cum pot verifica dacă bitul 5 al variabilei este setat la BY byte?

6. Cum să verificați dacă numărul de biți stabilit în octetul BB este egal sau impar?

7. Care steaguri de condiție sunt modificate după executarea comenzilor și, sau, xor?

8. Care este diferența principală dintre comenzile schimbărilor logice și aritmetice?

9. Specificați numărul maxim de biți la care puteți deplasa operandu-se folosind o comandă cu o singură trecere?

10. Într-o pereche de linii
mov CL, 8
"schimbare" BL, CL
Ce comenzi pot fi înlocuite în loc de "schimbare", astfel încât conținutul BL să nu se schimbe?

11. Într-o pereche de linii
"schimbare la stânga" BL, 1
"schimbare dreapta" BL, 1
Ce comenzi pot fi înlocuite cu "schimbare stânga" și "schimbare dreapta" astfel încât conținutul BL să nu se schimbe?







Articole similare

Trimiteți-le prietenilor: