Număr binar și sistem octet

Notă binară.

În capitolul precedent am discutat cu dvs. un sistem de numere hexazecimale și un program simplu pentru afișarea unei linii pe ecran.

Dacă înțelegeți complet totul în acest capitol, atunci considerați că ați studiat baza de date a asamblorului. Din capitolul următor, vom studia limba mult mai intensivă.

Pentru a înțelege mai bine segmentarea memoriei, trebuie să folosim programul de depanare. Am lucrat cu CodeView (CV.EXE) și AFD Pro (AFD.EXE).

Să presupunem că ați scris un program în asamblare și l-am numit PROG03.ASM. După asamblare, aveți dosarul. Apoi, pentru ao executa sub depanatorul CodeView / AFD, trebuie să tastați următoarele la linia de comandă MS-DOS:

Deci, respirați mai adânc și - du-te!

Luați în considerare modul în care datele sunt stocate în memoria calculatorului.

În general, cum poate un magazin de calculatoare, de exemplu, cuvântul "disc"? Principiul principal - magnetizarea și demagnetizarea unei piste (să o spunem așa). Un cip de memorie este, în mare parte, un număr foarte mare de piese (aproximativ ca un magnetofon). Acum să încercăm să ne dăm seama.

zero va fi notat ca 0000 (patru zerouri),

Două - 0010 (adică cea dreaptă este înlocuită cu 0, iar cea de-a doua este setată la 1).

Ai prins principiul? "0" și "1" sunt așa-numitele. biți. Un pic, așa cum ați observat deja, poate fi zero sau unul, adică demagnetizat sau magnetizat această piesă sau acea pistă ("0" și "1" este un simbol). Dacă vă uitați atent, puteți observa că fiecare set de biți următor (pornind de la dreapta) crește numărul de două ori: 0001 în exemplul nostru - unul; 0010 - două; 0100 - patru; 1000 - opt, etc. Aceasta este așa-numita. forma binară de reprezentare a datelor.

astfel pentru a desemna numere de la 0 la 9, avem nevoie de patru biți (deși nu sunt pe deplin folosiți.) Am putea continua: zece - 1010, unsprezece - 1011 ..., cincisprezece - 1111).

Computerul stochează datele în memorie în acest fel. Pentru a indica un simbol (număr, literă, virgulă, punct ...), computerul utilizează un anumit număr de biți. Computerul "recunoaște" 256 (de la 0 la 255) caractere diferite prin codul lor. Acest lucru este suficient pentru a se potrivi tuturor cifrelor (0-9), literele alfabetului latin (a-z, A-Z), rusă (a-i, A-Z) etc. Pentru a reprezenta caracterul cu codul cel mai înalt (255) 8 biți. Acești 8 biți sunt numiți octeți. astfel fiecare caracter este întotdeauna 1 octet (a se vedea figura 1).

Fig. 1. Un octet cu codul de caractere "Z"

(simbolurile "H" și "P" înseamnă că H este magnetizat sau P aznagnitocheno, respectiv)

astfel cuvântul "disc" va ocupa 4 octeți sau 4 * 8 = 32 biți. După cum ați știut deja, calculatorul stochează în memorie nu literele (simbolurile) acestui cuvânt, ci secvența de "cele" și "noughts".

În Assembler după numărul binar trebuie să fie întotdeauna litera "b". Acest lucru este necesar pentru ca Assembler să poată face distincția între numerele zecimale, hexazecimale și binare la asamblarea programului. De exemplu: 10 este "zece", 10h este "șaisprezece" și 10b este "două" în sistemul zecimal.

astfel Registrele pot fi încărcate cu numere binare, zecimale și hexazecimale.

În consecință, registrele AX, BH și CL vor avea același număr, doar îl încărcăm folosind sisteme de numerotare diferite. Calculatorul îl va stoca în format binar (ca în registrul BH).

Deci, să rezumăm. În computer, toate informațiile sunt stocate într-un format binar (sistem binar) aproximativ după cum urmează: 10101110 10010010 01111010 11100101 (bineînțeles, fără spații. Opt biți sunt un octet. Un caracter ocupă un octet, adică opt biți. În opinia mea, nimic complicat. Este foarte important să înțelegeți acest subiect, deoarece vom folosi în mod constant sistemul binar și trebuie să îl cunoașteți perfect. În principiu, chiar dacă ceva nu este destul de clar, atunci - nu vă disperați! În timp, totul devine clar.

Cum se convertește un număr binar în zecimal:

Este necesar să adăugați cele două în grade corespunzătoare pozițiilor în care numărul unității binare este unitatea.

Să luăm numărul 20. În sistemul binar, are următoarea formă: 10100b

Deci (începem de la stânga la dreapta, numărând de la 4 la 0, numărul la zero este întotdeauna egal cu unul (ne reamintim programul școlar în matematică)):

10100b = 1 * 16 + 0 * 8 + 1 * 4 + 0 * 2 + 0 * 1 = 20

Cum se convertește un număr zecimal la binar:

Puteți să o împărțiți în două, înregistrând restul de la dreapta la stânga:

20/2 = 10, restul 0

Ca rezultat, obținem: 10100b = 20

Cum se convertește un număr hexazecimal la zecimal:

În sistemul hexazecimal, numărul cifrei din număr corespunde gradului în care numărul 16 ar trebui ridicat:

8Ah = 8 * 16 + 10 (0Ah) = 138

În prezent, există numeroase calculatoare care pot citi și traduce numerele în sisteme cu numere diferite. De exemplu, calculatorul Windows, care ar trebui să fie în formă de inginerie. Calculatorul este, de asemenea, foarte convenabil în DOS Navigator. Dacă aveți, nu este necesar să transferați manual un sistem la altul, ceea ce, firește, va simplifica munca. Cu toate acestea, cunoașterea acestui principiu este extrem de important!

Segmentarea memoriei în modul real.

Să luăm următoarea propoziție: "Studiem segmentele memoriei". Acum, să aflăm unde "s" în cuvântul "segmente" este de la începutul propoziției, inclusiv spațiile ... În al șaisprezecelea. Subliniez ceea ce am crezut de la începutul propunerii.

Acum, să complicăm puțin problema și să împărțim propoziția după cum urmează (cu simbolul "_" un spațiu):

Registrul CS servește la stocarea segmentului de cod al programului (Segment cod);

Înregistrați DS - pentru stocarea segmentului de date (Segment de date);

Registrul SS - pentru stocarea unui segment de stivă (segmentul de stivă);

Să încercăm să încărcăm în perechea de înregistrări ES: segmentul DI și offsetul literei "m" din cuvântul "memorie" din exemplul # 1 (vezi mai sus). Iată cum se va potrivi în Assembler:

Acum, în registrul ES există un segment cu numărul 20, iar în registrul DI - offsetul la litera (simbolul) "m" în cuvântul "memorie". Verificați, vă rog ...

Aici este de remarcat faptul că descărcarea unui număr (adică, orice segment) direct în registrul segmentului este interzisă. Prin urmare, am încărcat segmentul în AX în linia (1), iar în rândul (2) am încărcat în registrul ES numărul 20, care era în AX:

Când încărăm programul în memorie, acesta este localizat automat în primul segment liber. În fișierele de tip * .com, toate registrele segmentate sunt inițializate automat pentru acest segment (valorile sunt setate egale cu segmentul în care este încărcat programul). Acest lucru poate fi verificat utilizând un program de depanare. Dacă, de exemplu, vom încărca un program de tip * .com în memorie și calculatorul va găsi primul segment gratuit cu numărul 5674h, registrele segmentului vor avea următoarele valori:

Cu alte cuvinte: CS = DS = SS = ES = 5674h

Codul pentru un program de tip * .com trebuie să înceapă la decalajul de 100h. Pentru a face acest lucru, am pus de fapt operatorul ORG 100h în exemplele anterioare de programe, indicând Assembler atunci când asamblați să folosească offset 100h de la începutul segmentului în care programul nostru este încărcat (mai târziu vom lua în considerare de ce). Registrele segmente, așa cum am spus, iau în mod automat valoarea segmentului în care a fost încărcat programul nostru.

(01) segmentul CSEG

(05) mov dx, offset My_name

(08) Numele meu db 'Dima $'

Astfel, liniile (01) și (09) descriu segmentul:

Segmentul CSEG (da numele segmentului) (declarația Assembler indicând faptul că numele CSEG este numele segmentului);

CSEG se încheie (segmentul END) indică asamblarea până la sfârșitul segmentului.

1234h: 0100h (adică CS = 1234h și IP = 0100h) (consultați depanatorul de pe registrele CS și IP).

Să trecem la următoarea comandă (în depanatorul CodeView, apăsați F8, AFD - F1, în celălalt - a se vedea ce tastă este necesară, cum ar fi "F8-Step" sau "F7-Trace"). Acum vedeți că următoarele registre s-au schimbat:

AX = 0900h (mai exact, AH = 09h și AL = 0, deoarece am încărcat numărul 9 în registrul AH cu comanda mov ah, 9 fără a atinge AL. Dacă AL a fost egal, de exemplu, 15h, execuția acestei comenzi AX ar fi egală cu 0915h)

Rețineți că în Assembler scriem:

mov dx, offset My_name

iar în depanator vom vedea următoarele:

mov dx, 109 (109 este un număr hexazecimal, dar CodeView și mulți alți debugeri nu pun caracterele "h".) Acest lucru trebuie păstrat în minte).

(09) Numele meu db 'Dima $'

Doar duplicați comanda int 20h (deși, după cum știți deja, programul nu ajunge la linia (08)).

În fereastra "Memorie" a depanatorului CodeView (în AFD ceva de genul asta) ar trebui să vedeți ceva de genul:

Poziția numărul 1 (1234) este segmentul în care programul nostru a fost încărcat (poate fi orice).

Poziția # 2 (0000) este offsetul în acest segment (segmentul și offsetul sunt separate de un colon (:)).

Poziția numărul 4 (= .a.) Este codul în ASCII (vedeți mai jos) corespunzător numerelor hexazecimale din partea dreaptă.

După cum am spus mai devreme, pentru utilizarea întreruperilor în programe, numărul funcției este stocat în AH. Numerele de funcții trebuie memorate (cel puțin adesea folosite) pentru a nu căuta constant în directoarele care funcționează ceea ce face.

Prima noastră întrerupere

În general, orice șir constând din caractere ASCII se numește șir ASCII. Caracterele ASCII sunt caracterele de la 0 la 255 în DOS, care includ literele alfabetelor ruse și latine, numerele, semnele de punctuație etc. (pentru o listă completă a caracterelor ASCII cu diferite codificări, vezi Anexa 04).

Să o punem în masă (întotdeauna facem asta):

Funcția 09h întrerupe 21h - ieșirea unui șir de caractere pe ecran la poziția curentă a cursorului:

În câmpul "Conectare" se specifică ce registre se vor încărca înainte de întrerupere, iar în câmpul "Ieșire" - ce se întoarce. Comparați acest tabel cu exemplul nr. 3.

Așa că am analizat segmentarea memoriei. Dacă mi-ar lipsi ceva, o voi acoperi în capitolele ulterioare. Sper că într-adevăr înțelegeți acest subiect. Cel puțin au prins principiul segmentării memoriei.

Programul de practică

Acum, un program de exemplu interesant (/003/PROG03.ASM) practică, care se afișează în colțul din stânga sus al ecranului vesel o față pe un fundal albastru:

(01) segmentul CSEG

(04) mov ax, 0B800h

Mulți operatori pe care îi cunoașteți deja. Prin urmare, voi explica doar cele noi.

Linii (04) și (05) sunt încărcate într-un segment de înregistrare număr ES 0B800h, care corespunde unui segment de afișare în modul text (amintiți-l!). În linia (06) se încarcă registrul DI zero. Aceasta este diferența față de segmentul 0B800h. Linii (08) și (09) în registrul AH introdus atributul de caractere (31 - simbol alb strălucitor pe un fundal albastru) in AL - ASCII de caractere-cod (01 - acest smiley).

Puteți experimenta acest exemplu. Doar nu schimbați liniile (04) și (05) încă. Registrul segmentelor ar trebui să fie ES (puteți, desigur, și DS, dar atunci trebuie să fiți atenți). Vom discuta această metodă mai detaliat mai târziu. Acum trebuie să înțelegem în principiu principiul segmentării în practică.

Dragă cititor! Deci te-ai familiarizat cu prima parte a cărții "Assembler? Este ușor de învățat să programezi".

Scopul acestei părți a fost de a vă oferi cunoștințele de bază în programarea în cel mai rapid, mai compact și unic limbaj de programare - Assembler. Dacă ați învățat cel puțin 75% din material din această parte, atunci puteți spune că am obținut ceea ce vroiam. Dacă vă simțiți că de mult nu este clar, apoi încercați să citiți totul nou de la început, utilizați depanatorul, scrie-mi o scrisoare în care a subliniat problema, oferă maximum de informații posibile (o utilizare program de asamblare ceea ce ați făcut pentru a rezolva problema și pr.). Răspunsul este garantat cât mai curând posibil. Cu toate acestea, mai târziu ne vom întoarce din nou la material, care este descris în prima parte. Dacă nu înțelegeți ceva acum, atunci, sper, veți înțelege în timp util. Cel mai interesant și fascinant este înainte!

În caz de întrebări cu privire la materialul trecut pe care nu simțiți că puteți trece în condiții de siguranță la studiul celei de a doua parte a cărții - „Din dragoste -. Prietenie“

Pentru abonații lista de corespondență

"Asamblare? E ușor să învăț să programezi."

Următorul fișier care trebuie studiat este 004.htm. apoi - 005.htm, etc.

Fascinantă citire pentru tine!

Articole similare