Lecții de asamblare

Vreme de zi, dragi prieteni!

Deci, continuați să studiați limba. Voi publica din nou textul programului:

  • .286
    Segmentul CSEG
    presupune cs: CSEG, ds: CSEG, es: CSEG, ss: CSEG






    org 100h
    începe:
    Tot ceea ce este scris mai sus este omis.

    mov ah, 9; Încărcați în registrul ah numărul 9 (specificați funcția).
    mov dx, offset helloworld; Specificați ce vom scoate pentru frază.
    int 21h; Afișați fraza.

    int 20h; Ieșiți la DOS.

    helloworld db 'Bună ziua, lume!'; Definiți variabila helloworld, octet disponibil, cu fraza
    "Bună ziua, lumea!". În citate unice, după "!" pune
    , semnul "$".

    ; Terminați programul.
    CSEG se încheie
    sfârșitul începe

    O grămadă de mov ah, 9 și int 21h și există, în esență, o comandă, dacă se compară cu limbile de nivel înalt, desigur.
    Cu toate acestea, în limbajul de asamblare, prima comandă specificată se numește o funcție, iar ultima se numește o întrerupere. O întrerupere execută o comandă cu o funcție specificată. Există întreruperi și fără funcții, de exemplu, același int 20h. Poate că, în timp ce acest lucru este oarecum dificil de percepție, această formă de compilare a programului trebuie să fie amintită.

    În același exemplu, am întâlnit și alte noțiuni cheie ale asamblorului, cum ar fi registrele și notația hexazecimală. Să începem în ordine.

    Așa sa întâmplat că în computerele moderne, unitatea minimă de memorie este un byte de 8 biți, valori care sunt convenabil scrise în două cifre hexazecimale. Pentru a indica numărul hexazecimal, vom folosi litera "h", pe care o vom pune în spatele unei astfel de figuri. Această desemnare este acceptată în general, deși unele platforme, de exemplu, spectrul ZX preferat, în asamblorii lor au folosit o înregistrare a formularului # 05B3. Zero este precedată de "conducere", deoarece numărul # 05B3 = # 5B3, și servește pentru citire și se numește "aliniere" (de obicei, aliniată la unul sau doi octeți: # 05B3).

    Trebuie să învățăm cum să traducem numere de la un sistem numeric la altul. În acest scop, calculatorul standard "Windows" în modul ingineresc servește perfect. Cu toate acestea, dacă nu există niciun calculator la îndemână, conversia numerelor reprezentate în binar și hexazecimal la zecimală este destul de ușoară. Pentru a face acest lucru, trebuie să scrieți numărul în forma extinsă și să calculați valoarea acestuia. Mai jos sunt algoritmii pentru conversia numerelor de la un sistem la altul (sau puteți merge direct la pasul 2. "Registre").

    Traducerea unui număr din sistemul binar în zecimal. Luăm împreună cu dvs. un număr binar, de exemplu 10,112. Apoi scrieți-o în forma sa extinsă și efectuați calculele:

    10,112 = 1 × 2 1 + 0 × 2 0 + 1 × 2 -1 + 1 × 2 -2 = 1 × 2 + 0 × 1 + 1 × 1/2 + 1 × 1/4 = 2,7510.

    Traducerea numerelor de la hexazecimal la zecimal. Acum luați orice număr hexazecimal, de exemplu 19F16. Apoi scrieți-o în forma extinsă (nu uitați că cifra hexazecimală F corespunde numărului zecimal 15) și efectuați calculele:

    19F16 = 1 × 16 2 + 9 × 16 1 + F × 16 0 = 1 × 256 + 9 × 16 + 15 × 1 = 41510.







    Traducerea numerelor de la binar la hexazecimal. Șasezeci de cifre sunt folosite pentru a scrie numere hexazecimale, adică 16 variante ale unei înregistrări sunt posibile în fiecare cifră a numărului. Rezolvăm ecuația exponențială:

    16 = 2 i. Deoarece 16 = 2 4. atunci i = 4 biți.

    Fiecare cifră a unui număr hexazecimal conține întotdeauna 4 biți de informații.

    Pentru a converti un întreg număr binar în hexazecimal, trebuie să-l rupeți în grupuri de patru numere pornind de la dreapta și dacă ultimul grup stâng are mai puțin de patru cifre, adăugați-l la stânga cu zerouri. Pentru a converti un număr binar fracțional la hexazecimal, este necesar să o rupeți în tetrads de la stânga la dreapta și dacă ultimul grup din partea dreaptă conține mai puțin de patru cifre, completați-l cu zerouri în partea dreaptă.

    Apoi convertim fiecare grup într-o cifră hexazecimală, folosind tabelul compilat de corespondență dintre tetrade binare și cifre hexazecimale.

    Să traducem un număr binar întreg, de exemplu, A2 = 1010012 în hexazecimal:

    Algoritmul pentru conversia numerelor întregi zecimale într-un sistem de numere binare. Fie A ^ un număr zecimal întreg. Se scrie ca o sumă de grade a bazei 2 cu coeficienți binari. În înregistrarea sa în forma extinsă, nu vor exista puteri negative ale bazei (numărul 2):

    În primul pas, împărțim numărul A ^ în baza sistemului binar, adică cu 2. Coeficientul va fi egal cu

    iar restul este egal cu a0.

    În a doua etapă, întregul coeficient este împărțit din nou cu 2, restul diviziunii va fi acum egal cu a1.

    Dacă vom continua acest proces de divizare, atunci după etapa n vom obține o secvență de reziduuri:

    Este ușor de văzut că secvența lor coincide cu secvența inversă a cifrelor întregului număr binar scrise într-o formă restrânsă:

    Astfel, este suficient să scrieți resturile în ordine inversă pentru a obține numărul binar necesar.

    Algoritmul pentru conversia unei cifre zecimale în binar este:

    1. Realizați în mod consecvent divizarea întregului număr zecimal inițial și a întregului număr întreg obținut pe baza sistemului (cu 2) până când obțineți un divizor privat, mai mic decât 2.

    2. Înregistrați reziduurile rezultate în ordine inversă.


    Conversia numerelor de la sistemul zecimal la binar și hexazecimal este mai complicată și poate fi efectuată în mai multe moduri. Să luăm în considerare unul dintre algoritmii de traducere, folosind exemplul de conversie a numerelor de la un sistem zecimal la unul binar. În acest caz, este necesar să se ia în considerare faptul că algoritmii pentru traducerea numerelor întregi și a fracțiunilor corespunzătoare vor fi diferiți.

    Există registre cu scop general, registre de segmente, contoare de comandă și registre de steaguri. Aici ne întâlnim pentru prima dată cu registrele generale scop și dx. Și fiecare dintre ele constă din două părți - senior (ah) și cel mai tânăr (al) (pentru topor), pe care deja l-am scris:

  • H senior senior
    L scăzut junior
    Fiecare nume al registrului are vreun sens.
  • O baterie acumulator
    B baza de bază
    Contorul contorului C
    D date de date
    BP indicatorul de bază al indicatorului de bază
    Indicele sursei indexului sursă SI
    DI indice receptor destinație index
    SP pointer stivă pointer stivă
    Segment de comandă pentru segmentul de cod CS
    Segmentul de date pentru segmentul de date DS
    Segmentul de stive SS este un segment de stivă
    Segmentul suplimentar suplimentar segmentului ES
    Contorul de comenzi pentru comanda pointerului IP
    În programul nostru, am folosit cea mai mare parte a axei de registru (acumulator) și a registrului dx (plasat datele).

    Fiecare registru constă din doi octeți - cel mai vechi (primul) și cel mai mic. De exemplu, numărul 3DEFh poate fi introdus în registrul axului în două moduri. Primul este direct:

  • mov ax, 3DEFh
    și separat de octeții mari și mici:
  • mov ah, 3Dh
    mov, EFh
    Sper că totul este clar cu asta.

    Noi compila programul nostru, creat cu ajutorul unui nou fișier test.asm Far (Shift + F4) și plasarea lor într-un director cu program de MASM.EXE, ML.EXE, LINK.EXE (sau pentru a prescrie calea de sistem adecvat pentru ei. Pentru a avea link.exe Nu am reușit, rămâne în dosarul programului). Asigurați-vă că pentru a selecta fișierul care codifică 866 (tasta F8), sau a se vedea păsărească pe ecran.

    Efectuați: ML test.asm / AT

    În dosarul cu programul ar trebui să apară încă două fișiere - test.obj și test.com. Avem nevoie de acesta din urmă.
    Lansăm și vedem expresia "Bună ziua, lumea!" Pe ecran.







    Articole similare

    Trimiteți-le prietenilor: