Cum se configurează smartphone-uri și PC-uri. Portal informativ

Sisteme numerice. Sistem de numere pozițional, hexazecimal

Pentru a reprezenta numere într-un microprocesor, este folosit sistem de numere binar.
În acest caz, orice semnal digital poate avea două stări stabile: „nivel înalt” și „nivel scăzut”. În sistemul binar, două numere sunt folosite pentru a reprezenta orice număr, respectiv: 0 și respectiv 1. Un număr arbitrar x = a n a n-1 ..a 1 a 0, a -1 a -2… a -m va fi scris în sistemul binar ca

x = an 2 n + a n-1 2 n-1 +… + a 1 2 1 + a 0 2 0 + a -1 2 -1 + a -2 2 -2 +… + a -m 2 -m

Unde un i- cifre binare (0 sau 1).

Sistem de numere octale

În sistemul octal, cifrele de bază sunt cifrele de la 0 la 7. Cele 8 unități mai puțin semnificative sunt combinate în cea mai semnificativă.

Sistem de numere hexazecimale

În notație hexazecimală, cifrele de bază sunt cifre de la 0 la 15, inclusiv. Pentru a desemna cifrele de bază mai mult de 9 într-un singur caracter, pe lângă cifrele arabe 0 ... 9, literele alfabetului latin sunt folosite în sistemul numeric hexazecimal:

10 10 = A 16 12 10 = C 16 14 10 = E 16
11 10 = B 16 13 10 = D 16 15 10 = F 16.

De exemplu, numărul 175 10 în notație hexazecimală va fi scris ca AF 16. Într-adevăr,

10 16 1 + 15 16 0 = 160 + 15 = 175

Tabelul prezintă numerele de la 0 la 16 în sisteme de notație zecimală, binară, octală și hexazecimală.

Zecimal Binar Octal hexazecimal
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10

Conversii binar în octal și binar în hexazecimal

Sistemul de numere binare este convenabil pentru efectuarea de operații aritmetice folosind hardware-ul microprocesorului, dar incomod pentru percepția umană, deoarece necesită un număr mare de biți. Prin urmare, în tehnologia computerelor, pe lângă sistemul de numere binar, sistemele de numere octale și hexazecimale sunt utilizate pe scară largă pentru o reprezentare mai compactă a numerelor.

Sistemul de numere octale pe trei biți implementează toate combinațiile posibile de cifre octale în sistemul de numere binar: de la 0 (000) la 7 (111). Pentru a converti un număr binar în octal, trebuie să combinați cifrele binare în grupuri de 3 cifre (triade) în două direcții, pornind de la separatorul zecimal. Dacă este necesar, adăugați zerouri nesemnificative în stânga numărului inițial. Dacă numărul conține o parte fracțională, atunci pot fi adăugate și zerouri nesemnificative în dreapta acestuia până când toate triadele sunt umplute. Apoi fiecare triadă este înlocuită cu o cifră octală.

Exemplu: convertiți 1101110,01 2 în octal.

Combinăm cifre binare în triade de la dreapta la stânga. Primim

001 101 110,010 2 = 156,2 8 .

Pentru a converti un număr din octal în binar, trebuie să scrieți fiecare cifră octală în cod binar:

156,2 8 = 001 101 110,010 2 .

Sistemul de numere hexazecimale pe patru biți implementează toate combinațiile posibile de cifre hexazecimale în notație binară: de la 0 (0000) la F (1111). Pentru a converti un număr binar în hexazecimal, trebuie să combinați cifrele binare în grupuri de 4 cifre (tetrade) în două direcții, pornind de la separatorul zecimal. Dacă este necesar, adăugați zerouri nesemnificative în stânga numărului inițial. Dacă numărul conține o parte fracțională, atunci în dreapta acestuia trebuie să adăugați zerouri nesemnificative până când toate caietele sunt umplute. Apoi fiecare caiet este înlocuit cu o cifră hexazecimală.

Exemplu: convertiți 1101110.11 2 în notație hexazecimală.

Combinăm numerele binare în tetrade de la dreapta la stânga. Primim

0110 1110,1100 2 = 6E, C 16.

Pentru a converti un număr din hexazecimal în binar, trebuie să scrieți fiecare cifră hexazecimală în cod binar.

Sistem de numere hexazecimale. Primul nostru program.

Pentru a scrie programe în Assembler, trebuie să înțelegeți sistemul numeric hexazecimal. Nu este nimic complicat în asta. Folosim sistemul zecimal în viața noastră. Sunt sigur că o știți cu toții, așa că voi încerca să explic sistemul hexazecimal prin analogie cu zecimalul.

Deci, în sistemul zecimal, dacă adăugăm zero la orice număr din dreapta, atunci acest număr va crește de 10 ori. De exemplu: 1 x 10 = 10; 10 x 10 = 100; 100 x 10 = 1000 etc. În acest sistem, folosim numere de la 0 la 9, adică zece cifre diferite (de fapt, de aceea se numește zecimală).

În hexazecimal folosim respectiv șaisprezece „cifre”. Am scris în mod deliberat cuvântul „cifre” între ghilimele, tk. folosește mai mult decât numere. Într-adevăr, cum este asta? Vă explic: numărăm de la 0 la 9 la fel ca în zecimală, dar atunci va fi așa: A, B, C, D, E, F. Numărul F, oricât de greu este număr, va fi egal cu 15 în sistem zecimal (vezi tabelul. 1).

Zecimal

Număr hexazecimal

Tabelul 1. Sisteme zecimale și hexazecimale.

Astfel, dacă adăugăm zero la dreapta oricărui număr din sistemul hexazecimal, atunci acest număr va crește cu16 o singura data.

Exemplul 1: 1 x 16 = 10; 10 x 16 = 100; 100 x 16 = 1000 etc.

Ați reușit să faceți distincția între numerele hexazecimale și zecimale din Exemplul 1? Și din acest rând: 10, 12, 45, 64, 12, 8, 19? Poate fi fie hexazecimal, fie zecimal. Pentru a evita confuzia, iar computerul ar putea distinge în mod unic unele numere de altele, se obișnuiește în Assembler să pună caracterul h sau H după un număr hexazecimal ( H este prescurtarea pentru engleză. hexazecimal (hexazecimal). Pentru concizie, uneori este numit simplu Hex ) . Si dupa zecimala nu pune nimic. pentru că numerele de la 0 la 9 în ambele sisteme au aceleași semnificații, atunci numerele scrise ca 5 și 5h sunt aceleași.

Acea. Exemplul 1 (vezi mai sus) ar fi mai corect să scriem după cum urmează: 1 x 16 = 10h; 10h x 16 = 100h; 100h x 16 = 1000h. Sau cam așa: 1h x 10h = 10h; 10h x 10h = 100h; 100h x 10h = 1000h.

Pentru ce este sistemul hexazecimal va fi discutat în versiunile viitoare. În acest moment, pentru programul nostru exemplu, care va fi discutat mai jos, trebuie să știm despre existența numerelor hexazecimale.

Deci haideți să rezumam. Sistemul numeric hexazecimal este format din 10 cifre (de la 0 la 9) și 6 litere ale alfabetului latin (A, B, C, D, E, F). Dacă adăugăm zero la orice număr din sistemul hexazecimal din dreapta, atunci acest număr va crește cu16 o singura data. Este foarte important să înțelegeți acest subiect.întrucât îl vom folosi tot timpul când scriem programe.

Acum, puțin despre cum voi construi exemple în Assembler. Nu este foarte convenabil să le aduceți în format HTML, așa că mai întâi va fi codul programului în sine cu linii numerotate, iar imediat după el vor fi explicații și note.

Ca asta:

siruri de caractere Cod program
(1) muta ah, 9

Explicatii:

În rândul (1) facem asta, iar în rândul (15) facem asta.

Cerere uriașă: NU copiați programe din pagină în clipboard și apoi lipiți-le în Notepad (sau oriunde altundeva)! Retastați-le manual într-un editor de text. Dacă aveți o imprimantă, selectați programul, imprimați selecția și apoi transferați-o în editor de pe hârtie. Trebuie să tastați singur toate exemplele! Acest lucru va grăbi memorarea operatorilor.

Și mai departe. Literele mici și majuscule nu se disting în Assembler. Înregistrări ale formularului:

Ele sunt percepute la fel de către asamblator. Puteți, desigur, să forțați Asamblatorul să facă distincția între caracterele minuscule și MAJUSCULE, dar nu vom face asta deocamdată. Pentru o mai bună lizibilitate a programului, cel mai bine este să tastați instrucțiunile cu litere mici și să începeți numele subprogramelor și etichetele cu litere mari. Dar așa va fi oricine confortabil.

Deci, să trecem la primul nostru program:

(1) Segment CSEG

(2) org 100h

(4) Începe:

(6) mov ah, 9

(7) mov dx, offset Mesaj

(8) int 21h

(10) int 20h

(11)

(12) Mesaj db „Bună, lume! $”

(13) CSEG se încheie

(14) sfârşit Început

Avem nevoie de mai multe ediții pentru a explica toți operatorii din acest exemplu. Prin urmare, vom omite pur și simplu descrierea unor comenzi în această etapă. Luați în considerare doar că așa ar trebui să fie. În viitorul foarte apropiat, vom lua în considerare acești operatori în detaliu. Deci, pur și simplu ignorați liniile cu numere (1), (2) și (13).

Rândurile (3), (5), (9) și (11) rămân necompletate. Acest lucru se face pentru claritate. Asamblatorul le va omite pur și simplu.

Acum să trecem la luarea în considerare a restului operatorilor. Linia (4) pornește codul programului. Aceasta este o etichetă care indică Asamblatorul la începutul codului. Linia (14) conține sfârșitul Început (Începeți ing. Start; Sfârșit sfarsit). Acesta este sfârșitul programului. În general, în loc de un cuvântÎncepe ar fi putut folosi altceva. De exemplu, Start :. În acest caz, ar trebui să încheiem programul. Sfârșit Start (14).

Rândurile (6) (8) afișează mesajul Hello, world !. Aici va trebui să vorbim pe scurt despre registrele procesoarelor (vom analiza acest subiect mai detaliat în următoarea ediție).

Un registru de procesor este o memorie special desemnată pentru stocarea unui număr.

De exemplu:

Dacă vrem să adunăm două numere, atunci în matematică scriem astfel:

A, B și C acestea sunt niște registre (dacă vorbim despre un computer) în care pot fi stocate unele date. A = 5 poate fi citit ca: Dați lui A numărul 5 .

Pentru a atribui o valoare unui registru, există un operator mov în Assembler (din engleză move to load). Rândul (6) ar trebui citit astfel: Încărcați în registru AHnumărul 9 (cu alte cuvinte, atribuim AHnumărul 9). Mai jos vom analiza de ce este necesar acest lucru.

În rândul (7) încărcăm în registru DX adresa mesajului de afișat (în acest exemplu, va fi liniaBună, lume! $).

Întreruperile vor fi discutate în detaliu în versiunile ulterioare. Aici voi spune câteva cuvinte.

Întrerupe MS-DOS este un fel de subrutină (part MS-DOS), care se află permanent în memorie și poate fi apelat oricând din orice program.

Luați în considerare cele de mai sus folosind un exemplu (selectați notele cu litere mici):

Programul de adunare a două numere

StartPrograms

A = 5 în variabila A introducem valoarea 5

B = 8 la variabila B valoarea 8

Adăugarea rutinelor de apeluri

acum C este 13

A = 10 la fel, doar numere diferite

B = 25

Adăugarea rutinelor de apeluri

acum C este 35

Sfârșitul programului

Adăugarea subrutinei

C = A + B

ReturnFrom Routines ne întoarcem la locul de unde au chemat

EndRutines

În acest exemplu, am numit subrutina de două ori Plus, care a adăugat cele două numere transmise în variabile A și B ... Rezultatul este plasat în variabila C. Când este apelată o subrutină, computerul își amintește de unde a fost apelată, iar apoi când subprogramul a terminat de rulat, computerul revine la locul de unde a fost apelat. Acea. subrutinele pot fi apelate la infinit de oriunde.

Când executăm linia (8) a unui program Assembler, apelăm o subrutină (în acest caz numită întrerupere) care tipărește șirul pe ecran. Pentru aceasta, noi, de fapt, punem valorile necesare în registre. Toată munca necesară (ieșire de linie, mișcare a cursorului) este preluată de subrutină. Această linie poate fi citită astfel: apelați a douăzeci și unu de întreruperi ( int din engleză. întrerupe întrerupe). Vă rugăm să rețineți că există o literă după numărul 21 h ... Acesta, după cum știm deja, este un număr hexazecimal (33 în zecimală). Desigur, nimic nu ne împiedică să înlocuim linia int 21h la int 33. Programul va funcționa corect. Doar că se obișnuiește în Assembler să indice numărul de întreruperi în sistem hexazecimal.

În rândul (10), ați ghicit, numim întreruperea 20 h ... Pentru a apela această întrerupere, nu trebuie să specificați nicio valoare în registre. Face un singur lucru: ieși din program (ieșire în DOS). Ca urmare a executării întreruperii 20h, programul va reveni la locul de unde a fost pornit (încărcat, apelat). De exemplu, în Norton Commander sau DOS Navigator.

Linia (12) conține mesajul de afișat. Primul cuvânt ( mesaj mesaj) numele mesajului. Poate fi orice (de exemplu, mizerie sau sfoară etc.). O Atenție la rândul (7), în care încărcăm în registru DX adresa mesajului nostru.

Putem crea o altă linie, pe care o vom numi Mess2. Apoi, începând cu linia (9), introduceți următoarele comenzi:

(10) mov dx, offset Mess2

(13) Mesaj db „Bună, lume! $”

(14) Mess2 db „Eu sunt! $”

și reasamblați programul nostru. Sper că ai ghicit ce se va întâmpla

Acordați atenție ultimului caracter din rânduri Mesaj și Mess2 - $. Indică sfârșitul liniei. Dacă îl eliminăm, atunci 21 h întreruperea va continua să apară până când va întâlni un personaj undeva în memorie $. Pe ecran vom vedea gunoi .

Dacă aveți un depanator, puteți vedea cum va funcționa programul nostru.

Scopul acestei probleme a fost să nu înțeleagă în detaliu cu fiecare operator... Acest lucru este imposibil, pentru că încă nu ai suficiente cunoștințe. Cred că după 3-4 probleme veți înțelege principiul și structura unui program Assembler. Poate ți s-a părut extrem de dificil limbajul de asamblare, dar crede-mă, la prima vedere.

Tabelul 2.4. Sistem de codare hexazecimală
Sistemul zecimal Sistem hexagonal Sistemul zecimal Sistem hexagonal
0 0 (0000) 10 A (1010)
1 1(0001) 11 B (1011)
2 2 (0010) 12 C (1100)
3 3 (0011) 13 D (1101)
4 4 (0100) 14 E (1110)
5 5 (0101) 15 F (1111)
6 6 (0110) 16 10 (00010000)
7 7 (0111) 17 11 (00010001)
8 8 (1000) 18 12 (00010010)
9 9 (1001) 19 13 (00010011)

Pentru a converti un număr hexazecimal în zecimal, trebuie să înmulțiți valoarea cifrei mai puțin semnificative (zero) cu una, valoarea următoarei (primei) cifre cu 16, a doua cifră cu 256 (16 2), etc., și apoi adăugați toate produsele. De exemplu, să luăm numărul A17F:

A17F = F * 16 0 + 7 * 16 1 + 1 * 16 2 + A * 16 3 = 15 * 1 + 7 * 16 + 1 * 256 + 10 * 4096 = 41343

Tabelul 2.5. Sistem de codare din 8 cifre
Sistemul zecimal Sistem octal Sistemul zecimal Sistem octal
0 0 (000) 10 12 (001010)
1 1(001) 11 13 (001011)
2 2 (010) 12 14 (001100)
3 3 (011) 13 15 (001101)
4 4 (100) 14 16 (001110)
5 5 (101) 15 17 (001111)
6 6 (110) 16 20 (010000)
7 7 (111) 17 21 (010001)
8 10 (001000) 18 22 (010010)
9 11 (001001) 19 23 (010011)

Dar fiecare specialist în echipamente digitale (dezvoltator, operator, reparator, programator etc.) trebuie să învețe cum să manipuleze liber sistemele hexazecimale și binare, precum și cu zecimală obișnuită, astfel încât să nu fie necesare transferuri de la sistem la sistem.

Codarea octală este folosită mult mai rar decât codarea hexazecimală, care este construită pe același principiu ca hexazecimal, dar cifrele binare sunt împărțite în grupuri de trei cifre. Fiecare grup (cifră de cod) este apoi desemnată printr-un simbol. Fiecare bit al codului de 8-ari poate lua opt valori: 0, 1, 2, 3, 4, 5, 6, 7 (Tabelul 2.5).

Pe lângă codurile considerate, mai există și așa-numita reprezentare binară-zecimală a numerelor. Ca și în codul hexazecimal, în codul binar-zecimal, fiecare bit al codului corespunde la patru cifre binare, cu toate acestea, fiecare grup de patru cifre binare poate lua nu șaisprezece, ci doar zece valori codificate de simbolurile 0, 1, 2 , 3, 4, 5, 6, 7, 8, 9. Adică, o zecimală corespunde cu patru binare. Ca rezultat, se dovedește că scrierea numerelor în cod binar-zecimal nu este diferită de scrierea în cod zecimal obișnuit (Tabelul 2.6), dar în realitate este doar un cod binar special, fiecare cifră poate lua doar două valori: 0 și 1. BCD este uneori foarte util pentru organizarea indicatorilor numerici și a tablourilor de bord zecimale.

Tabelul 2.6. Sistem de codare BCD
Sistemul zecimal Sistem zecimal binar Sistemul zecimal Sistem zecimal binar
0 0 (0000) 10 10 (00010000)
1 1(0001) 11 11 (00010001)
2 2 (0010) 12 12 (00010010)
3 3 (0011) 13 13 (00010011)
4 4 (0100) 14 14 (00010100)
5 5 (0101) 15 15 (00010101)
6 6 (0110) 16 16 (00010110)
7 7 (0111) 17 17 (00010111)
8 8 (1000) 18 18 (00011000)
9 9 (1001) 19 19 (00011001)

În codul binar, puteți efectua orice operații aritmetice asupra numerelor: adunare, scădere, înmulțire, împărțire.

Luați în considerare, de exemplu, adăugarea a două numere binare de 4 biți. Să adăugăm numărul 0111 (zecimal 7) și 1011 (zecimal 11). Adunarea acestor numere nu este mai dificilă decât zecimală:

Când adunăm 0 și 0 obținem 0, când adunăm 1 și 0 obținem 1, când adunăm 1 și 1 obținem 0 și transferăm la următoarea cifră 1. Rezultatul este 10010 (zecimală 18). Adăugarea oricăror două numere binare de n biți poate avea ca rezultat un număr de n biți sau (n + 1) -biți.

Scăderea se face în același mod. Să se scadă numărul 0111 (7) din numărul 10010 (18). Notăm numerele aliniate la cifra cea mai puțin semnificativă și scădem în același mod ca în cazul sistemului zecimal:

Scăzând 0 din 0 obținem 0, scăzând 0 din 1 obținem 1, scăzând 1 din 1 obținem 0, scăzând 1 din 0 obținem 1 și împrumutăm 1 în următorul bit. Rezultatul este 1011 (zecimal 11).

Când scădeți, este posibil să obțineți numere negative, așa că trebuie să utilizați reprezentare binară numere negative.

Pentru reprezentarea simultană a numerelor binare pozitive și binare negative, așa-numitele cod suplimentar... Numerele negative din acest cod sunt exprimate ca un număr care, atunci când este adăugat la un număr pozitiv de aceeași mărime, are ca rezultat zero. Pentru a obține un număr negativ, trebuie să schimbați toți biții aceluiași număr pozitiv cu opusul lor (0 cu 1, 1 cu 0) și să adăugați 1. De exemplu, notați numărul –5. Numărul 5 din codul binar arată ca 0101. Înlocuiți biții cu opusul: 1010 și adăugați unul: 1011. Adăugăm rezultatul cu numărul inițial: 1011 + 0101 = 0000 (ignorăm transferul la a cincea cifră).

modulo 2 două numere binare 0111 și 1011:

Alte operații pe biți asupra numerelor binare includ funcția AND și funcția SAU. Funcția AND are ca rezultat unul numai dacă biții corespunzători celor două numere originale sunt ambii uni, altfel rezultatul este -0. Funcția SAU are ca rezultat unul când cel puțin unul dintre biții corespunzători numerelor originale este 1, în caz contrar rezultatul este 0.

Pentru a scrie programe în Assembler, trebuie să înțelegeți sistemul numeric hexazecimal. Nu este nimic complicat în asta. Folosim sistemul zecimal în viața noastră. Sunt sigur că o știți cu toții, așa că voi încerca să explic sistemul hexazecimal prin analogie cu zecimalul.

Deci, în sistemul zecimal, dacă adăugăm zero la orice număr din dreapta, atunci acest număr va crește de 10 ori. De exemplu: 1 x 10 = 10; 10 x 10 = 100; 100 x 10 = 1000 etc. În acest sistem, folosim numere de la 0 la 9, adică zece cifre diferite (de fapt, de aceea se numește zecimală).

În hexazecimal folosim respectiv șaisprezece „cifre”. Am scris în mod deliberat cuvântul „cifre” între ghilimele, tk. folosește mai mult decât numere. Într-adevăr, cum este asta? Vă explic: numărăm de la 0 la 9 la fel ca în zecimală, dar atunci va fi așa: A, B, C, D, E, F. Numărul F, oricât de greu este număr, va fi egal cu 15 în sistem zecimal (vezi tabelul. 1).

Zecimal

Număr hexazecimal

Tabelul 1. Sisteme zecimale și hexazecimale.

Astfel, dacă adăugăm zero la dreapta oricărui număr din sistemul hexazecimal, atunci acest număr va crește cu16 o singura data.

Exemplul 1: 1 x 16 = 10; 10 x 16 = 100; 100 x 16 = 1000 etc.

Ați reușit să faceți distincția între numerele hexazecimale și zecimale din Exemplul 1? Și din acest rând: 10, 12, 45, 64, 12, 8, 19? Poate fi fie hexazecimal, fie zecimal. Pentru a evita confuzia, iar computerul ar putea distinge în mod unic unele numere de altele, se obișnuiește în Assembler să pună caracterul h sau H după un număr hexazecimal ( H este prescurtarea pentru engleză. hexazecimal (hexazecimal). Pentru concizie, uneori este numit simplu Hex ) . Si dupa zecimala nu pune nimic. pentru că numerele de la 0 la 9 în ambele sisteme au aceleași semnificații, atunci numerele scrise ca 5 și 5h sunt aceleași.

Acea. Exemplul 1 (vezi mai sus) ar fi mai corect să scriem după cum urmează: 1 x 16 = 10h; 10h x 16 = 100h; 100h x 16 = 1000h. Sau cam așa: 1h x 10h = 10h; 10h x 10h = 100h; 100h x 10h = 1000h.

Pentru ce este sistemul hexazecimal va fi discutat în versiunile viitoare. În acest moment, pentru programul nostru exemplu, care va fi discutat mai jos, trebuie să știm despre existența numerelor hexazecimale.

Deci haideți să rezumam. Sistemul numeric hexazecimal este format din 10 cifre (de la 0 la 9) și 6 litere ale alfabetului latin (A, B, C, D, E, F). Dacă adăugăm zero la orice număr din sistemul hexazecimal din dreapta, atunci acest număr va crește cu16 o singura data. Este foarte important să înțelegeți acest subiect.întrucât îl vom folosi tot timpul când scriem programe.

Acum, puțin despre cum voi construi exemple în Assembler. Nu este foarte convenabil să le aduceți în format HTML, așa că mai întâi va fi codul programului în sine cu linii numerotate, iar imediat după el vor fi explicații și note.

Ca asta:

siruri de caractere Cod program
(1) muta ah, 9

Explicatii:

În rândul (1) facem asta, iar în rândul (15) facem asta.

Cerere uriașă: NU copiați programe din pagină în clipboard și apoi lipiți-le în Notepad (sau oriunde altundeva)! Retastați-le manual într-un editor de text. Dacă aveți o imprimantă, selectați programul, imprimați selecția și apoi transferați-o în editor de pe hârtie. Trebuie să tastați singur toate exemplele! Acest lucru va grăbi memorarea operatorilor.

Și mai departe. Literele mici și majuscule nu se disting în Assembler. Înregistrări ale formularului:

Ele sunt percepute la fel de către asamblator. Puteți, desigur, să forțați Asamblatorul să facă distincția între caracterele minuscule și MAJUSCULE, dar nu vom face asta deocamdată. Pentru o mai bună lizibilitate a programului, cel mai bine este să tastați instrucțiunile cu litere mici și să începeți numele subprogramelor și etichetele cu litere mari. Dar așa va fi oricine confortabil.

Deci, să trecem la primul nostru program:

(1) Segment CSEG

(2) org 100h

(4) Începe:

(6) mov ah, 9

(7) mov dx, offset Mesaj

(8) int 21h

(10) int 20h

(11)

(12) Mesaj db „Bună, lume! $”

(13) CSEG se încheie

(14) sfârşit Început

Avem nevoie de mai multe ediții pentru a explica toți operatorii din acest exemplu. Prin urmare, vom omite pur și simplu descrierea unor comenzi în această etapă. Luați în considerare doar că așa ar trebui să fie. În viitorul foarte apropiat, vom lua în considerare acești operatori în detaliu. Deci, pur și simplu ignorați liniile cu numere (1), (2) și (13).

Rândurile (3), (5), (9) și (11) rămân necompletate. Acest lucru se face pentru claritate. Asamblatorul le va omite pur și simplu.

Acum să trecem la luarea în considerare a restului operatorilor. Linia (4) pornește codul programului. Aceasta este o etichetă care indică Asamblatorul la începutul codului. Linia (14) conține sfârșitul Început (Începeți ing. Start; Sfârșit sfarsit). Acesta este sfârșitul programului. În general, în loc de un cuvântÎncepe ar fi putut folosi altceva. De exemplu, Start :. În acest caz, ar trebui să încheiem programul. Sfârșit Start (14).

Rândurile (6) (8) afișează mesajul Hello, world !. Aici va trebui să vorbim pe scurt despre registrele procesoarelor (vom analiza acest subiect mai detaliat în următoarea ediție).

Un registru de procesor este o memorie special desemnată pentru stocarea unui număr.

De exemplu:

Dacă vrem să adunăm două numere, atunci în matematică scriem astfel:

A, B și C acestea sunt niște registre (dacă vorbim despre un computer) în care pot fi stocate unele date. A = 5 poate fi citit ca: Dați lui A numărul 5 .

Pentru a atribui o valoare unui registru, există un operator mov în Assembler (din engleză move to load). Rândul (6) ar trebui citit astfel: Încărcați în registru AHnumărul 9 (cu alte cuvinte, atribuim AHnumărul 9). Mai jos vom analiza de ce este necesar acest lucru.

În rândul (7) încărcăm în registru DX adresa mesajului de afișat (în acest exemplu, va fi liniaBună, lume! $).

Întreruperile vor fi discutate în detaliu în versiunile ulterioare. Aici voi spune câteva cuvinte.

Întrerupe MS-DOS este un fel de subrutină (part MS-DOS), care se află permanent în memorie și poate fi apelat oricând din orice program.

Luați în considerare cele de mai sus folosind un exemplu (selectați notele cu litere mici):

Programul de adunare a două numere

StartPrograms

A = 5 în variabila A introducem valoarea 5

B = 8 la variabila B valoarea 8

Adăugarea rutinelor de apeluri

acum C este 13

A = 10 la fel, doar numere diferite

B = 25

Adăugarea rutinelor de apeluri

acum C este 35

Sfârșitul programului

Adăugarea subrutinei

C = A + B

ReturnFrom Routines ne întoarcem la locul de unde au chemat

EndRutines

În acest exemplu, am numit subrutina de două ori Plus, care a adăugat cele două numere transmise în variabile A și B ... Rezultatul este plasat în variabila C. Când este apelată o subrutină, computerul își amintește de unde a fost apelată, iar apoi când subprogramul a terminat de rulat, computerul revine la locul de unde a fost apelat. Acea. subrutinele pot fi apelate la infinit de oriunde.

Când executăm linia (8) a unui program Assembler, apelăm o subrutină (în acest caz numită întrerupere) care tipărește șirul pe ecran. Pentru aceasta, noi, de fapt, punem valorile necesare în registre. Toată munca necesară (ieșire de linie, mișcare a cursorului) este preluată de subrutină. Această linie poate fi citită astfel: apelați a douăzeci și unu de întreruperi ( int din engleză. întrerupe întrerupe). Vă rugăm să rețineți că există o literă după numărul 21 h ... Acesta, după cum știm deja, este un număr hexazecimal (33 în zecimală). Desigur, nimic nu ne împiedică să înlocuim linia int 21h la int 33. Programul va funcționa corect. Doar că se obișnuiește în Assembler să indice numărul de întreruperi în sistem hexazecimal.

În rândul (10), ați ghicit, numim întreruperea 20 h ... Pentru a apela această întrerupere, nu trebuie să specificați nicio valoare în registre. Face un singur lucru: ieși din program (ieșire în DOS). Ca urmare a executării întreruperii 20h, programul va reveni la locul de unde a fost pornit (încărcat, apelat). De exemplu, în Norton Commander sau DOS Navigator.

Linia (12) conține mesajul de afișat. Primul cuvânt ( mesaj mesaj) numele mesajului. Poate fi orice (de exemplu, mizerie sau sfoară etc.). O Atenție la rândul (7), în care încărcăm în registru DX adresa mesajului nostru.

Putem crea o altă linie, pe care o vom numi Mess2. Apoi, începând cu linia (9), introduceți următoarele comenzi:

(10) mov dx, offset Mess2

(13) Mesaj db „Bună, lume! $”

(14) Mess2 db „Eu sunt! $”

și reasamblați programul nostru. Sper că ai ghicit ce se va întâmpla

Acordați atenție ultimului caracter din rânduri Mesaj și Mess2 - $. Indică sfârșitul liniei. Dacă îl eliminăm, atunci 21 h întreruperea va continua să apară până când va întâlni un personaj undeva în memorie $. Pe ecran vom vedea gunoi .

Dacă aveți un depanator, puteți vedea cum va funcționa programul nostru.

Scopul acestei probleme a fost să nu înțeleagă în detaliu cu fiecare operator... Acest lucru este imposibil, pentru că încă nu ai suficiente cunoștințe. Cred că după 3-4 probleme veți înțelege principiul și structura unui program Assembler. Poate ți s-a părut extrem de dificil limbajul de asamblare, dar crede-mă, la prima vedere.

Notație hexazecimală („Hex”) este o modalitate convenabilă de a reprezenta valori binare. Așa cum zecimalul este baza zece și binarul este baza doi, hexazecimalul este baza șaisprezece.

Baza 16 folosește numere de la 0 la 9 și litere de la A la F. Figura arată valorile zecimale, binare și hexazecimale echivalente pentru numerele binare de la 0000 la 1111. Este mai ușor pentru noi să exprimăm o valoare ca o cifră hexazecimală decât ca patru biți.

Înțelegerea octeților

Având în vedere că 8 biți (octeți) sunt gruparea binară standard, numerele binare de la 00000000 la 11111111 pot fi reprezentate în notație hexazecimală ca numere de la 00 la FF. Zerourile inițiale sunt întotdeauna afișate pentru a finaliza reprezentarea pe 8 biți. De exemplu, valoarea binară 0000 1010 în hex ar fi 0A.

Reprezentarea valorilor hexazecimale

Notă: Este important să se facă distincția între valorile hexazecimale și zecimale pentru caracterele de la 0 la 9, așa cum se arată în ilustrație.

Valorile hexazecimale sunt de obicei reprezentate în text printr-o valoare precedată de 0x (de exemplu 0x73) sau prin utilizarea unui indice 16. Mai rar, ele pot fi urmate de un H, cum ar fi 73H. Cu toate acestea, deoarece textul indicelui nu este recunoscut pe linia de comandă sau în mediile de programare, în reprezentarea tehnică a numerelor hexazecimale, acesta este precedat de „0x” (zero X). Prin urmare, exemplele de mai sus ar fi afișate ca 0x0A și, respectiv, 0x73.

Notația hexazecimală este utilizată pentru a reprezenta adresele MAC Ethernet și adresele IP Versiunea 6.

Conversii hexazecimale

Conversiile numerice între valori zecimale și hexazecimale sunt simple, dar împărțirea sau înmulțirea rapidă cu 16 nu este întotdeauna convenabilă. Dacă sunt necesare astfel de conversii, este de obicei mai ușor să convertiți valoarea zecimală sau hexazecimală în binar, apoi convertiți valoarea binară în zecimală sau hexazecimală, în funcție de ceea ce doriți să obțineți.

Cu practică, este posibil să recunoașteți modele de biți binari care corespund valorilor zecimale și hexazecimale. Figura prezintă aceste modele pentru unele valori de 8 biți.

Top articole similare