1 in hexadecimaal getalsysteem. Waar is het hexadecimale getalsysteem voor?

Hexadecimaal getalsysteem. ons eerste programma.

Om programma's in Assembly te schrijven, moet u het hexadecimale getalsysteem begrijpen. Er is niets ingewikkelds aan. In het leven gebruiken we het decimale systeem. Ik weet zeker dat jullie het allemaal weten, dus ik zal proberen het hexadecimale systeem uit te leggen aan de hand van een analogie met het decimale systeem.

Dus als we in het decimale systeem een ​​nul toevoegen aan een willekeurig getal aan de rechterkant, wordt dit getal tien keer groter. Bijvoorbeeld: 1 x 10 = 10; 10 x 10 = 100; 100 x 10 = 1000, enz. In dit systeem gebruiken we getallen van 0 tot en met 9, d.w.z. tien verschillende getallen (daarom wordt het decimaal genoemd).

In het hexadecimale systeem gebruiken we zestien "cijfers". Ik heb specifiek het woord ‘cijfers’ tussen aanhalingstekens geschreven, omdat... Er worden niet alleen cijfers gebruikt. En echt, hoe kan dat? Laat het me uitleggen: van 0 tot 9 tellen we op dezelfde manier als decimaal, maar dan wordt het zo: A, B, C, D, E, F. Het getal F is niet moeilijk tellen, zal het gelijk zijn aan 15 in het decimale systeem (zie Tabel 1).

Decimaal getal

Hexadecimaal getal

Tabel 1. Decimale en hexadecimale systemen.

Als we dus rechts van een willekeurig getal in het hexadecimale systeem een ​​nul toevoegen, zal dit getal toenemen met16 eenmaal.

Voorbeeld 1: 1 x 16 = 10; 10 x 16 = 100; 100 x 16 = 1000, enz.

Kon je in voorbeeld 1 hexadecimale getallen onderscheiden van decimale getallen? En uit deze serie: 10, 12, 45, 64, 12, 8, 19? Deze kunnen hexadecimaal of decimaal zijn. Om verwarring te voorkomen en de computer het ene getal duidelijk van het andere te kunnen onderscheiden, is het in assembler gebruikelijk om het symbool h of H na een hexadecimaal getal te plaatsen ( H is een afkorting voor Engels. hexadecimaal (hexadecimaal). Kortheidshalve wordt het soms gewoon genoemd Hex ) . En zet niets achter de komma. Omdat getallen van 0 tot en met 9 hebben in beide systemen dezelfde betekenis, dan zijn de getallen geschreven als 5 en 5h hetzelfde.

Dat. Voorbeeld 1 (zie hierboven) zou correcter zijn om als volgt te schrijven: 1 x 16 = 10h; 10u x 16 = 100u; 100 uur x 16 = 1000 uur. Of zo: 1u x 10u = 10u; 10u x 10u = 100u; 100u x 10u = 1000u.

In volgende nummers zullen we bekijken waarom het hexadecimale systeem nodig is. Voorlopig moeten we voor ons voorbeeldprogramma, dat hieronder wordt besproken, weten over het bestaan ​​van hexadecimale getallen.

Dus laten we het samenvatten. Het hexadecimale getalsysteem bestaat uit 10 cijfers (van 0 tot 9) en 6 letters van het Latijnse alfabet (A, B, C, D, E, F). Als we rechts van een willekeurig getal in het hexadecimale systeem een ​​nul toevoegen, wordt dit getal met verhoogd16 eenmaal. Het is erg belangrijk om dit onderwerp te begrijpen, omdat we het constant zullen gebruiken bij het schrijven van programma's.

Nu een beetje over hoe ik voorbeelden ga bouwen in Assembly. Het is niet erg handig om ze in HTML-formaat te presenteren, dus eerst zal er de programmacode zelf zijn met genummerde regels, en onmiddellijk daarna zullen er uitleg en opmerkingen zijn.

Iets als dit:

lijnen Programmacode
(1) mov ah, 9

Uitleg:

In regel (1) doen we dit, en in regel (15) doen we dat.

Groot verzoek: Kopieer GEEN programma's van een pagina naar het klembord en plak ze vervolgens in Kladblok (of ergens anders)! Typ ze handmatig opnieuw in een teksteditor. Als u een printer heeft, selecteert u het programma, drukt u het geselecteerde fragment af en brengt u het vanaf papier over naar de editor. Alle voorbeelden moeten zelf getypt worden! Dit versnelt het onthouden van operators.

En nog een ding. Er is geen verschil tussen kleine letters en hoofdletters in assembler. Registratie van het formulier:

De assembler neemt ze op dezelfde manier waar. Je kunt de assembler natuurlijk dwingen onderscheid te maken tussen kleine letters en hoofdletters, maar dat doen we voorlopig niet. Om het programma gemakkelijker leesbaar te maken, kunt u operatoren het beste in kleine letters typen en de namen van subroutines en labels in hoofdletters beginnen. Maar het hangt ervan af wie zich op zijn gemak zal voelen.

Laten we dus verder gaan met ons eerste programma:

(1) CSEG-segment

(2)org 100u

(4) Begin:

(6) beweeg ah,9

(7) mov dx, offsetbericht

(8) tot 21u

(10) tot 20u

(11)

(12) Bericht db "Hallo wereld!$"

(13) CSEG eindigt

(14) einde Begin

Om alle operatoren in dit voorbeeld uit te leggen, hebben we verschillende edities nodig. Daarom zullen we in dit stadium eenvoudigweg de beschrijving van enkele commando's achterwege laten. Ga er maar van uit dat het zo zou moeten zijn. We zullen deze operators in de zeer nabije toekomst in detail bekijken. Dus de regels genummerd (1), (2) en (13) negeert u eenvoudigweg.

De regels (3), (5), (9) en (11) worden blanco gelaten. Dit is gedaan voor de duidelijkheid. De assembler zal ze gewoon weglaten.

Laten we nu verder gaan met het bekijken van de resterende operators. De programmacode begint met regel (4). Dit is een markering die de assembler vertelt over het begin van de code. Regel (14) bevat het einde van de operator Begin ( Begin Engels begin; einde einde). Dit is het einde van het programma. Over het algemeen in plaats van het woord Beginnen er had iets anders gebruikt kunnen worden. Bijvoorbeeld, Begin:. In dit geval zouden we het programma moeten beëindigen Eindbegin (14).

Regels (6) (8) tonen het bericht Hallo wereld!. Hier zullen we kort moeten praten over processorregisters (we zullen dit onderwerp in het volgende nummer in meer detail bekijken).

Een processorregister is een speciaal toegewezen geheugen voor het opslaan van een getal.

Bijvoorbeeld:

Als we twee getallen willen optellen, schrijven we dit in de wiskunde als volgt:

A, B en C dit zijn een soort registers (als we het over een computer hebben) waarin bepaalde gegevens kunnen worden opgeslagen. A=5 kan gelezen worden als: Geef A het getal 5 .

Om een ​​register een waarde toe te wijzen, is er een mov-operator in Assembler (van het Engelse move load). Regel (6) moet als volgt worden gelezen: Laden in het register AH.nummer 9 (met andere woorden, we wijzen toe AH.nummer 9). Hieronder zullen we bekijken waarom dit nodig is.

In regel (7) laden we het register in DX berichtadres voor uitvoer (in dit voorbeeld zal dit de stringHallo wereld!$).

Interrupts worden in de volgende nummers uitgebreid besproken. Hier zal ik een paar woorden zeggen.

Onderbreken MS-DOS het is een soort subroutine (part MS-DOS), dat zich permanent in het geheugen bevindt en op elk moment vanuit elk programma kan worden opgeroepen.

Laten we het bovenstaande bekijken aan de hand van een voorbeeld (Aantekeningen in kleine lettertjes):

Programma voor het optellen van twee getallen

HomeProgramma's

EEN=5 We voeren de waarde 5 in variabele A in

B=8 in variabele B de waarde 8

Subroutines toevoegen

nu is C gelijk aan 13

EEN=10 hetzelfde, alleen andere cijfers

B=25

Subroutines toevoegen

nu is C gelijk aan 35

Einde van het programma

Subroutine toevoeging

C=A+B

ReturnFromSubroutine we keren terug naar de plaats vanwaar we belden

EindeSubroutine

In dit voorbeeld hebben we de subroutine twee keer aangeroepen Toevoeging, waardoor er twee getallen aan werden toegevoegd die in variabelen werden doorgegeven A en B . Het resultaat wordt in de variabele C geplaatst. Wanneer een subroutine wordt aangeroepen, onthoudt de computer waar deze vandaan kwam, en wanneer de subroutine klaar is met draaien, keert de computer terug naar de plaats vanwaar deze werd aangeroepen. Dat. U kunt subroutines een onbeperkt aantal keren oproepen, waar u ook bent.

Bij het uitvoeren van regel (8) van een Assembly-programma roepen we een subroutine aan (in dit geval een interrupt genoemd), die de regel op het scherm weergeeft. Hiervoor plaatsen we feitelijk de benodigde waarden in registers. Al het noodzakelijke werk (een lijn uitvoeren, de cursor verplaatsen) wordt overgenomen door de subroutine. Deze regel kun je als volgt lezen: roep de eenentwintigste interrupt aan ( int uit het Engels onderbreken onderbreken). Houd er rekening mee dat er na het cijfer 21 een letter staat H . Dit is, zoals we al weten, een hexadecimaal getal (33 in decimaal getal). Niets weerhoudt ons er uiteraard van om de lijn te vervangen van int 21u tot int 33. Het programma zal correct werken. Het is gebruikelijk in Assembler om het interruptnummer in hexadecimaal aan te geven.

In regel (10) noemen we, zoals je misschien al geraden hebt, interrupt 20 H . Om deze interrupt aan te roepen, hoeft u geen waarden in de registers op te geven. Het voert slechts één taak uit: het programma afsluiten (naar DOS gaan). Als gevolg van interrupt 20h keert het programma terug naar waar het is gestart (geladen, gebeld). Bijvoorbeeld, binnen Norton Commander of DOS-navigator.

Regel (12) bevat het uit te voeren bericht. Eerste woord ( bericht bericht) berichttitel. Het kan van alles zijn (bijvoorbeeld puinhoop of string, enz.). OVER Let op regel (7), waarin we in het register laden DX ons berichtadres.

We kunnen een andere lijn maken, die we zullen bellen Mess2. Voer vervolgens, beginnend vanaf regel (9), de volgende opdrachten in:

(10) mov dx, offset Mess2

(13) Bericht db "Hallo wereld!$"

(14) Mess2 db "Ik ben het! $"

en stel ons programma opnieuw samen. Ik hoop dat je kunt raden wat er gaat gebeuren

Let op het laatste teken in de regels Bericht en bericht2 - $. Het wijst naar het einde van de regel. Als we het verwijderen, dan 21 H de interrupt blijft doorgaan totdat hij ergens in het geheugen een teken tegenkomt $. Op het scherm zullen we het zien afval .

Als u een debugger heeft, kunt u zien hoe ons programma werkt.

Het doel van deze kwestie was niet om het te begrijpen gedetailleerd met elke operator. Dit is onmogelijk, omdat je hebt nog niet genoeg kennis. Ik geloof dat je na 3-4 releases het principe en de structuur van een Assembly-programma zult begrijpen. Misschien leek de Assemblee-taal je buitengewoon ingewikkeld, maar geloof me, dit is op het eerste gezicht zo.

Het resultaat is al ontvangen!

Nummersystemen

Er zijn positionele en niet-positionele nummersystemen. Het Arabische getallenstelsel, dat we in het dagelijks leven gebruiken, is positioneel, maar het Romeinse getallenstelsel niet. In positionele getalsystemen bepaalt de positie van een getal op unieke wijze de grootte van het getal. Laten we dit eens bekijken aan de hand van het voorbeeld van het getal 6372 in het decimale getalsysteem. Laten we dit getal van rechts naar links nummeren, beginnend bij nul:

Dan kan het getal 6372 als volgt worden weergegeven:

6372=6000+300+70+2 =6·10 3 +3·10 2 +7·10 1 +2·10 0 .

Het getal 10 bepaalt het getallenstelsel (in dit geval is dat 10). De waarden van de positie van een bepaald getal worden als machten beschouwd.

Beschouw het echte decimale getal 1287.923. Laten we het nummeren vanaf nul, waarbij het getal vanaf de komma naar links en rechts wordt geplaatst:

Dan kan het getal 1287.923 worden weergegeven als:

1287,923 =1000+200+80 +7+0,9+0,02+0,003 = 1,10 3 +2,10 2 +8,10 1 +7,10 0 +9,10 -1 +2,10 -2 +3· 10 -3.

Over het algemeen kan de formule als volgt worden weergegeven:

C n S n +C n-1 · S n-1 +...+C 1 · S 1 +C 0 ·s 0 +D -1 ·s -1 +D -2 ·s -2 +...+D -k ·s -k

waarbij Cn een geheel getal in positie is N, D -k - fractioneel getal op positie (-k), S- nummersysteem.

Een paar woorden over getalsystemen. Een getal in het decimale getalsysteem bestaat uit veel cijfers (0,1,2,3,4,5,6,7,8,9), in het octale getalsysteem bestaat het uit veel cijfers. (0,1, 2,3,4,5,6,7), in het binaire getalsysteem - uit een reeks cijfers (0,1), in het hexadecimale getalsysteem - uit een reeks cijfers (0,1 ,2,3,4,5,6, 7,8,9,A,B,C,D,E,F), waarbij A,B,C,D,E,F overeenkomen met de nummers 10,11, 12,13,14,15 In tabel Tab.1 worden getallen weergegeven in verschillende getalsystemen.

Tabel 1
Notatie
10 2 8 16
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

Getallen omzetten van het ene getalsysteem naar het andere

Om getallen van het ene getalsysteem naar het andere te converteren, is de eenvoudigste manier om het getal eerst naar het decimale getalsysteem te converteren en vervolgens van het decimale getalsysteem naar het gewenste getalsysteem te converteren.

Getallen van elk getalsysteem omzetten naar het decimale getallenstelsel

Met behulp van formule (1) kunt u getallen van elk getalsysteem omzetten naar het decimale getalsysteem.

Voorbeeld 1. Converteer het getal 1011101.001 van het binaire getalsysteem (SS) naar decimale SS. Oplossing:

1 ·2 6 +0 ·2 5 + 1 ·2 4+ 1 ·2 3+ 1 ·2 2 + 0 ·2 1+ 1 ·2 0 + 0 ·2 -1 + 0 ·2 -2 + 1 ·2 -3 =64+16+8+4+1+1/8=93,125

Voorbeeld2. Converteer het getal 1011101.001 van octaal getalsysteem (SS) naar decimaal SS. Oplossing:

Voorbeeld 3 . Converteer het getal AB572.CDF van een hexadecimaal getalsysteem naar decimaal SS. Oplossing:

Hier A-vervangen door 10, B- om 11 uur, C- om 12 uur, F- tegen 15.

Getallen omzetten van het decimale getallenstelsel naar een ander getalstelsel

Als u getallen van het decimale getallensysteem naar een ander getalsysteem wilt converteren, moet u het gehele deel van het getal en het breukgedeelte van het getal afzonderlijk converteren.

Het gehele deel van een getal wordt geconverteerd van decimale SS naar een ander getalsysteem door het gehele deel van het getal opeenvolgend te delen door de basis van het getalsysteem (voor binaire SS - door 2, voor 8-voudige SS - door 8, voor 16 -ary SS - met 16, etc. ) totdat een heel residu is verkregen, minder dan de basis CC.

Voorbeeld 4 . Laten we het getal 159 omzetten van decimale SS naar binaire SS:

159 2
158 79 2
1 78 39 2
1 38 19 2
1 18 9 2
1 8 4 2
1 4 2 2
0 2 1
0

Zoals blijkt uit Fig. 1 geeft het getal 159, gedeeld door 2, het quotiënt 79 en de rest 1. Verder geeft het getal 79, gedeeld door 2, het quotiënt 39 en de rest 1, enz. Als gevolg hiervan verkrijgen we, door een getal te construeren uit delingsresten (van rechts naar links), een getal in binaire SS: 10011111 . Daarom kunnen we schrijven:

159 10 =10011111 2 .

Voorbeeld 5 . Laten we het getal 615 omzetten van decimaal SS naar octaal SS.

615 8
608 76 8
7 72 9 8
4 8 1
1

Wanneer je een getal converteert van een decimale SS naar een octale SS, moet je het getal opeenvolgend delen door 8 totdat je een gehele rest krijgt die kleiner is dan 8. Als gevolg hiervan krijgen we bij het construeren van een getal uit delingsresten (van rechts naar links) een getal in octale SS: 1147 (zie afbeelding 2). Daarom kunnen we schrijven:

615 10 =1147 8 .

Voorbeeld 6 . Laten we het getal 19673 omzetten van het decimale getalsysteem naar hexadecimale SS.

19673 16
19664 1229 16
9 1216 76 16
13 64 4
12

Zoals uit figuur 3 blijkt, zijn de resten, door het getal 19673 achtereenvolgens door 16 te delen, 4, 12, 13, 9. In het hexadecimale getalsysteem komt het getal 12 overeen met C, en het getal 13 met D. Daarom is onze hexadecimaal getal is 4CD9.

Om reguliere decimale breuken (een reëel getal met een geheel getal van nul) om te zetten in een getalsysteem met grondtal s, is het noodzakelijk om dit getal achtereenvolgens met s te vermenigvuldigen totdat het breukgedeelte een zuivere nul bevat, of we het vereiste aantal cijfers verkrijgen. . Als de vermenigvuldiging resulteert in een getal met een ander geheel getal dan nul, dan wordt met dit gehele getal geen rekening gehouden (ze worden opeenvolgend in het resultaat opgenomen).

Laten we het bovenstaande bekijken met voorbeelden.

Voorbeeld 7 . Laten we het getal 0,214 omzetten van het decimale getalsysteem naar binaire SS.

0.214
X 2
0 0.428
X 2
0 0.856
X 2
1 0.712
X 2
1 0.424
X 2
0 0.848
X 2
1 0.696
X 2
1 0.392

Zoals te zien is in figuur 4, wordt het getal 0,214 opeenvolgend vermenigvuldigd met 2. Als het resultaat van de vermenigvuldiging een getal is met een ander geheel deel dan nul, dan wordt het gehele deel apart geschreven (links van het getal), en het getal wordt geschreven met een geheel getal van nul. Als de vermenigvuldiging resulteert in een getal met een geheel getal van nul, dan wordt links ervan een nul geschreven. Het vermenigvuldigingsproces gaat door totdat het fractionele deel een zuiver nul bereikt of we het vereiste aantal cijfers verkrijgen. Door vetgedrukte getallen (Fig. 4) van boven naar beneden te schrijven, krijgen we het vereiste getal in het binaire getalsysteem: 0. 0011011 .

Daarom kunnen we schrijven:

0.214 10 =0.0011011 2 .

Voorbeeld 8 . Laten we het getal 0,125 omzetten van het decimale getalsysteem naar binaire SS.

0.125
X 2
0 0.25
X 2
0 0.5
X 2
1 0.0

Om het getal 0,125 om te zetten van decimaal SS naar binair, wordt dit getal opeenvolgend vermenigvuldigd met 2. In de derde fase is het resultaat 0. Het volgende resultaat wordt dus verkregen:

0.125 10 =0.001 2 .

Voorbeeld 9 . Laten we het getal 0,214 omzetten van het decimale getalsysteem naar hexadecimale SS.

0.214
X 16
3 0.424
X 16
6 0.784
X 16
12 0.544
X 16
8 0.704
X 16
11 0.264
X 16
4 0.224

Als we de voorbeelden 4 en 5 volgen, krijgen we de getallen 3, 6, 12, 8, 11, 4. Maar in hexadecimale SS komen de getallen 12 en 11 overeen met de getallen C en B. Daarom hebben we:

0,214 10 =0,36C8B4 16 .

Voorbeeld 10 . Laten we het getal 0,512 converteren van het decimale getalsysteem naar octale SS.

0.512
X 8
4 0.096
X 8
0 0.768
X 8
6 0.144
X 8
1 0.152
X 8
1 0.216
X 8
1 0.728

Ontvangen:

0.512 10 =0.406111 8 .

Voorbeeld 11 . Laten we het getal 159.125 omzetten van het decimale getalsysteem naar binaire SS. Om dit te doen, vertalen we afzonderlijk het gehele deel van het getal (Voorbeeld 4) en het fractionele deel van het getal (Voorbeeld 8). Als we deze resultaten verder combineren, krijgen we:

159.125 10 =10011111.001 2 .

Voorbeeld 12 . Laten we het getal 19673.214 omzetten van het decimale getalsysteem naar hexadecimale SS. Om dit te doen, vertalen we afzonderlijk het gehele deel van het getal (Voorbeeld 6) en het fractionele deel van het getal (Voorbeeld 9). Verder verkrijgen we door het combineren van deze resultaten.

Het hexadecimale getalsysteem heeft een alfabet dat uit 16 cijfers bestaat:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, b, c, d, e, f.

Bij het schrijven van een getal in het hexadecimale systeem worden respectievelijk de letters A, B, C, D, E, F gebruikt om de cijfers te schrijven die de getallen 10, 11, 12. 13, 14. 15 aanduiden.

Getallen omzetten van hexadecimaal naar decimaal

U kunt elk hexadecimaal getal naar decimaal converteren met behulp van de reeds bekende formule

Voorbeelden.

    AE07 16 =10∙16 3 +14∙16 2 +0∙16 1 +7∙16 0 =44551 10 .

    100 16 =1∙16 2 +0∙16 1 +0∙16 0 =256 10 .

    58 16 =5∙16 1 +8∙16 0 =.88 10 .

    2A 16 =2∙16 1 +10∙16 0 =42 10.

Het omzetten van een getal van het decimale systeem naar hexadecimaal gebeurt op dezelfde manier als naar binair.

Getallen converteren van hexadecimaal naar binair en omgekeerd

U kunt elk hexadecimaal getal als volgt naar binair converteren. Elk cijfer van een hexadecimaal getal wordt geschreven als een binair getal van vier cijfers: notitieboekje. Hierna kunnen de nullen aan de linkerkant worden weggegooid.

2) 2A= 0010 1010 2 = 101010 2 .

3) 58 16 = 0101 1000 2 = 1011000 2 .

Omgekeerd kunt u elk binair getal op dezelfde manier naar hexadecimaal converteren. Elke vier binaire cijfers, geteld van rechts naar links, worden geschreven als één hexadecimaal cijfer. Deze nummers bevinden zich ook van rechts naar links.

Voorbeelden.

2. 101010 2 = 10 1010 2 = 2A.

3. 1011000 2 = 101 1000 2 = 58 16 .

Octaal getalsysteem

Het octale getalsysteem heeft een alfabet dat uit 8 cijfers bestaat:

0, 1, 2, 3, 4, 5, 6, 7.

Het omzetten van een getal van het decimale stelsel naar octaal en andersom gaat op dezelfde manier als het omzetten van/naar binair getal.

Getallen converteren van octaal naar binair en terug

Elk cijfer van een octaal getal wordt geschreven als een binair getal van drie cijfers: triade.

Voorbeelden.

2563 8 = 010 101 110 011 2 =10101110011 2 .

1001101 2 = 001 001 101 2 = 115 8 .

Methodologisch materiaal voor laboratoriumles nr. 1

Onderwerp van de laboratoriumles: getalsystemen. Meetinformatie.

Aantal uren: 2.

Voorbeelden met oplossingen

    Vertaling vanP -air systeem naar 10-air systeem. Stel dat we een getal in een bepaald getalsysteem naar decimaal moeten converteren. Om dit te doen, moet u het in het formulier weergeven

11100110 2 = 1∙2 7 + 1∙2 6 + 1∙2 5 + 0∙2 4 + 0∙2 3 + 1∙2 2 + 1∙2 1 + 0∙2 0 = 128 + 64 + 32 + 4 + 2 = 230 10 .

2401 5 = 2∙5 3 + 4∙5 2 + 0∙5 1 + 1∙5 0 = 250 + 100 + 0 + 1 = 351.

    Conversie van 10-cijferig systeem naarP -ichnaya.

2.1 98 10 → X2.

We delen het getal door 2. Vervolgens delen we het onvolledige quotiënt door 2. We gaan door totdat het onvolledige quotiënt kleiner wordt dan 2, d.w.z. gelijk aan 1.

    98: 2 = 49. Rest - 0 .

    49: 2 = 24. Rest - 1 .

    24: 2 = 12. Rest - 0 .

    12: 2 = 6. Rest - 0 .

    6: 2 = 3. Rest - 0 .

    3: 2 = 1 . 1 .

Rest -

2.2 Omdat het laatste gedeeltelijke quotiënt 1 is, is het proces voorbij. We schrijven alle resten van onder naar boven op, te beginnen met het laatste onvolledige quotiënt, en we krijgen het getal 1100010. Dus 98 10 = 1100010 2.

2391 10 → X16.

    Deel het getal door 16. Deel vervolgens het gedeeltelijke quotiënt door 16. Ga door totdat het gedeeltelijke quotiënt kleiner is dan 16. 7 .

    149: 16 = 9 . 5 .

2391: 16 = 149. Rest -

2.3 Omdat het laatste gedeeltelijke quotiënt (9) kleiner is dan 16, is het proces voorbij. We schrijven, beginnend bij het laatste onvolledige quotiënt, alle resten op van onder naar boven en krijgen het getal 957. Dus 2391 10 = 957 16.

12165 10 → X2.

12165 10 = 27605 8 = 010 111 110 000 101 = 10111110000101.

    Als je per deling converteert naar het binaire systeem, krijg je een nogal omslachtig proces. U kunt het getal eerst naar octaal converteren en vervolgens de octale cijfers van rechts naar links vervangen door drieklanken.P .

Het bepalen van de basis van een getalstelsel

Een jongen schreef over zichzelf: „Ik heb 24 vingers, vijf aan elke hand en twaalf aan mijn voeten.” Hoe kan dit? P Oplossing. Het is noodzakelijk om de basis van het nummersysteem te bepalen P =1∙P. Omdat we weten dat er maar 10 tenen zijn, 10 en dan 12 P + 2 = 10  P+2 = 10 10 . Vanaf hier krijgen we de vergelijking

= 8. De jongen bedoelde dus getallen in het octale systeem. Er zijn inderdaad 24 8 = 2∙8+4 = 20 10 tenen, en 12 8 = 1∙8+2 = 10 10 tenen.

Iedereen die met een computer of andere digitale apparatuur communiceert, is mysterieuze vermeldingen tegengekomen zoals 10FEF, die voor niet-ingewijden een soort code lijken. Wat gaat er schuil achter deze symbolen? Het blijken slechts cijfers te zijn. Degenen die hexadecimaal gebruiken

Elk schoolkind weet, of heeft in ieder geval ergens gehoord, dat alle getallen die we gewoonlijk gebruiken, deze naam dragen, simpelweg omdat er maar tien verschillende symbolen in voorkomen (van 0 tot 9). Met hun hulp kan elk nummer in ons gebruikelijke systeem worden geschreven. Het blijkt echter dat het niet altijd handig is om het te gebruiken. Bij het uitwisselen van informatie tussen digitale apparaten is het bijvoorbeeld het gemakkelijkst om een ​​nummersysteem te gebruiken waarin er slechts twee cijfers zijn: "0" - er is geen signaal - of "1" - er is een signaal (spanning of iets anders) . Het heet binair. Om echter de processen in dergelijke apparaten te beschrijven die er gebruik van maken, zul je aantekeningen moeten maken die te lang en moeilijk te begrijpen zijn. Daarom werd het hexadecimale getalsysteem uitgevonden.

Het concept van hexadecimaal systeem

Hoe komt het dat digitale apparaten een systeem gebruiken dat zestien verschillende symbolen bevat? Zoals u weet, wordt informatie in computers verzonden in de vorm van bytes, die meestal 8 bits bevatten. Een gegevenseenheid - een machinewoord - omvat 2 bytes, dat wil zeggen 16 bits. Met behulp van zestien verschillende symbolen is het dus mogelijk om de informatie te beschrijven die het kleinste deeltje in de uitwisseling is. Het hexadecimale getallensysteem omvat onze gebruikelijke cijfers (uiteraard van 0 tot 9), evenals de eerste letters (A, B, C, D, E, F). Met behulp van deze symbolen is het gebruikelijk om elke informatie-eenheid op te schrijven. U kunt er alle rekenkundige bewerkingen mee uitvoeren. Dat wil zeggen: optellen, aftrekken, vermenigvuldigen, delen. Het resultaat is ook een hexadecimaal getal.

Waar wordt het gebruikt?

Het hexadecimale systeem wordt gebruikt om foutcodes vast te leggen. Ze kunnen optreden tijdens de werking van verschillende softwareproducten. Dit is bijvoorbeeld hoe fouten in het besturingssysteem worden gecodeerd. Elk nummer is standaard. Welke fout er tijdens het werkproces precies is opgetreden, kunt u achterhalen door deze aan de hand van de instructies te ontcijferen. Dergelijke symbolen worden ook gebruikt bij het schrijven van programma's in talen op een laag niveau, zoals assembly. Het hexadecimale getalsysteem is ook geliefd bij programmeurs omdat de componenten ervan heel gemakkelijk kunnen worden omgezet naar binair getal, dat ‘native’ is voor alle digitale technologie. Deze symbolen worden ook gebruikt om kleurenschema's te beschrijven. Bovendien worden absoluut alle bestanden op de computer (tekst, afbeeldingen en zelfs muziek of video) na uitzending als een reeks gepresenteerd. Het is het handigst om de bron in de vorm van hexadecimale tekens te bekijken.

Natuurlijk kan elk getal in verschillende getalsystemen worden geschreven. Dit is decimaal, binair en hexadecimaal. Om een ​​woord van het ene woord naar het andere te vertalen, moet u een dienst zoals een nummersysteemvertaler gebruiken, of dit zelf doen met behulp van een specifiek algoritme.

Om programma's in Assembly te schrijven, moet u het hexadecimale getalsysteem begrijpen. Er is niets ingewikkelds aan. In het leven gebruiken we het decimale systeem. Ik weet zeker dat jullie het allemaal weten, dus ik zal proberen het hexadecimale systeem uit te leggen aan de hand van een analogie met het decimale systeem.

Dus als we in het decimale systeem een ​​nul toevoegen aan een willekeurig getal aan de rechterkant, wordt dit getal tien keer groter. Bijvoorbeeld: 1 x 10 = 10; 10 x 10 = 100; 100 x 10 = 1000, enz. In dit systeem gebruiken we getallen van 0 tot en met 9, d.w.z. tien verschillende getallen (daarom wordt het decimaal genoemd).

In het hexadecimale systeem gebruiken we zestien "cijfers". Ik heb specifiek het woord ‘cijfers’ tussen aanhalingstekens geschreven, omdat... Er worden niet alleen cijfers gebruikt. En echt, hoe kan dat? Laat het me uitleggen: van 0 tot 9 tellen we op dezelfde manier als decimaal, maar dan wordt het zo: A, B, C, D, E, F. Het getal F is niet moeilijk tellen, zal het gelijk zijn aan 15 in het decimale systeem (zie Tabel 1).

Decimaal getal

Hexadecimaal getal

Tabel 1. Decimale en hexadecimale systemen.

Als we dus rechts van een willekeurig getal in het hexadecimale systeem een ​​nul toevoegen, zal dit getal toenemen met16 eenmaal.

Voorbeeld 1: 1 x 16 = 10; 10 x 16 = 100; 100 x 16 = 1000, enz.

Kon je in voorbeeld 1 hexadecimale getallen onderscheiden van decimale getallen? En uit deze serie: 10, 12, 45, 64, 12, 8, 19? Deze kunnen hexadecimaal of decimaal zijn. Om verwarring te voorkomen en de computer het ene getal duidelijk van het andere te kunnen onderscheiden, is het in assembler gebruikelijk om het symbool h of H na een hexadecimaal getal te plaatsen ( H is een afkorting voor Engels. hexadecimaal (hexadecimaal). Kortheidshalve wordt het soms gewoon genoemd Hex ) . En zet niets achter de komma. Omdat getallen van 0 tot en met 9 hebben in beide systemen dezelfde betekenis, dan zijn de getallen geschreven als 5 en 5h hetzelfde.

Dat. Voorbeeld 1 (zie hierboven) zou correcter zijn om als volgt te schrijven: 1 x 16 = 10h; 10u x 16 = 100u; 100 uur x 16 = 1000 uur. Of zo: 1u x 10u = 10u; 10u x 10u = 100u; 100u x 10u = 1000u.

In volgende nummers zullen we bekijken waarom het hexadecimale systeem nodig is. Voorlopig moeten we voor ons voorbeeldprogramma, dat hieronder wordt besproken, weten over het bestaan ​​van hexadecimale getallen.

Dus laten we het samenvatten. Het hexadecimale getalsysteem bestaat uit 10 cijfers (van 0 tot 9) en 6 letters van het Latijnse alfabet (A, B, C, D, E, F). Als we rechts van een willekeurig getal in het hexadecimale systeem een ​​nul toevoegen, wordt dit getal met verhoogd16 eenmaal. Het is erg belangrijk om dit onderwerp te begrijpen, omdat we het constant zullen gebruiken bij het schrijven van programma's.

Nu een beetje over hoe ik voorbeelden ga bouwen in Assembly. Het is niet erg handig om ze in HTML-formaat te presenteren, dus eerst zal er de programmacode zelf zijn met genummerde regels, en onmiddellijk daarna zullen er uitleg en opmerkingen zijn.

Iets als dit:

lijnen Programmacode
(1) mov ah, 9

Uitleg:

In regel (1) doen we dit, en in regel (15) doen we dat.

Groot verzoek: Kopieer GEEN programma's van een pagina naar het klembord en plak ze vervolgens in Kladblok (of ergens anders)! Typ ze handmatig opnieuw in een teksteditor. Als u een printer heeft, selecteert u het programma, drukt u het geselecteerde fragment af en brengt u het vanaf papier over naar de editor. Alle voorbeelden moeten zelf getypt worden! Dit versnelt het onthouden van operators.

En nog een ding. Er is geen verschil tussen kleine letters en hoofdletters in assembler. Registratie van het formulier:

De assembler neemt ze op dezelfde manier waar. Je kunt de assembler natuurlijk dwingen onderscheid te maken tussen kleine letters en hoofdletters, maar dat doen we voorlopig niet. Om het programma gemakkelijker leesbaar te maken, kunt u operatoren het beste in kleine letters typen en de namen van subroutines en labels in hoofdletters beginnen. Maar het hangt ervan af wie zich op zijn gemak zal voelen.

Laten we dus verder gaan met ons eerste programma:

(1) CSEG-segment

(2)org 100u

(4) Begin:

(6) beweeg ah,9

(7) mov dx, offsetbericht

(8) tot 21u

(10) tot 20u

(11)

(12) Bericht db "Hallo wereld!$"

(13) CSEG eindigt

(14) einde Begin

Om alle operatoren in dit voorbeeld uit te leggen, hebben we verschillende edities nodig. Daarom zullen we in dit stadium eenvoudigweg de beschrijving van enkele commando's achterwege laten. Ga er maar van uit dat het zo zou moeten zijn. We zullen deze operators in de zeer nabije toekomst in detail bekijken. Dus de regels genummerd (1), (2) en (13) negeert u eenvoudigweg.

De regels (3), (5), (9) en (11) worden blanco gelaten. Dit is gedaan voor de duidelijkheid. De assembler zal ze gewoon weglaten.

Laten we nu verder gaan met het bekijken van de resterende operators. De programmacode begint met regel (4). Dit is een markering die de assembler vertelt over het begin van de code. Regel (14) bevat het einde van de operator Begin ( Begin Engels begin; einde einde). Dit is het einde van het programma. Over het algemeen in plaats van het woord Beginnen er had iets anders gebruikt kunnen worden. Bijvoorbeeld, Begin:. In dit geval zouden we het programma moeten beëindigen Eindbegin (14).

Regels (6) (8) tonen het bericht Hallo wereld!. Hier zullen we kort moeten praten over processorregisters (we zullen dit onderwerp in het volgende nummer in meer detail bekijken).

Een processorregister is een speciaal toegewezen geheugen voor het opslaan van een getal.

Bijvoorbeeld:

Als we twee getallen willen optellen, schrijven we dit in de wiskunde als volgt:

A, B en C dit zijn een soort registers (als we het over een computer hebben) waarin bepaalde gegevens kunnen worden opgeslagen. A=5 kan gelezen worden als: Geef A het getal 5 .

Om een ​​register een waarde toe te wijzen, is er een mov-operator in Assembler (van het Engelse move load). Regel (6) moet als volgt worden gelezen: Laden in het register AH.nummer 9 (met andere woorden, we wijzen toe AH.nummer 9). Hieronder zullen we bekijken waarom dit nodig is.

In regel (7) laden we het register in DX berichtadres voor uitvoer (in dit voorbeeld zal dit de stringHallo wereld!$).

Interrupts worden in de volgende nummers uitgebreid besproken. Hier zal ik een paar woorden zeggen.

Onderbreken MS-DOS het is een soort subroutine (part MS-DOS), dat zich permanent in het geheugen bevindt en op elk moment vanuit elk programma kan worden opgeroepen.

Laten we het bovenstaande bekijken aan de hand van een voorbeeld (Aantekeningen in kleine lettertjes):

Programma voor het optellen van twee getallen

HomeProgramma's

EEN=5 We voeren de waarde 5 in variabele A in

B=8 in variabele B de waarde 8

Subroutines toevoegen

nu is C gelijk aan 13

EEN=10 hetzelfde, alleen andere cijfers

B=25

Subroutines toevoegen

nu is C gelijk aan 35

Einde van het programma

Subroutine toevoeging

C=A+B

ReturnFromSubroutine we keren terug naar de plaats vanwaar we belden

EindeSubroutine

In dit voorbeeld hebben we de subroutine twee keer aangeroepen Toevoeging, waardoor er twee getallen aan werden toegevoegd die in variabelen werden doorgegeven A en B . Het resultaat wordt in de variabele C geplaatst. Wanneer een subroutine wordt aangeroepen, onthoudt de computer waar deze vandaan kwam, en wanneer de subroutine klaar is met draaien, keert de computer terug naar de plaats vanwaar deze werd aangeroepen. Dat. U kunt subroutines een onbeperkt aantal keren oproepen, waar u ook bent.

Bij het uitvoeren van regel (8) van een Assembly-programma roepen we een subroutine aan (in dit geval een interrupt genoemd), die de regel op het scherm weergeeft. Hiervoor plaatsen we feitelijk de benodigde waarden in registers. Al het noodzakelijke werk (een lijn uitvoeren, de cursor verplaatsen) wordt overgenomen door de subroutine. Deze regel kun je als volgt lezen: roep de eenentwintigste interrupt aan ( int uit het Engels onderbreken onderbreken). Houd er rekening mee dat er na het cijfer 21 een letter staat H . Dit is, zoals we al weten, een hexadecimaal getal (33 in decimaal getal). Niets weerhoudt ons er uiteraard van om de lijn te vervangen van int 21u tot int 33. Het programma zal correct werken. Het is gebruikelijk in Assembler om het interruptnummer in hexadecimaal aan te geven.

In regel (10) noemen we, zoals je misschien al geraden hebt, interrupt 20 H . Om deze interrupt aan te roepen, hoeft u geen waarden in de registers op te geven. Het voert slechts één taak uit: het programma afsluiten (naar DOS gaan). Als gevolg van interrupt 20h keert het programma terug naar waar het is gestart (geladen, gebeld). Bijvoorbeeld, binnen Norton Commander of DOS-navigator.

Regel (12) bevat het uit te voeren bericht. Eerste woord ( bericht bericht) berichttitel. Het kan van alles zijn (bijvoorbeeld puinhoop of string, enz.). OVER Let op regel (7), waarin we in het register laden DX ons berichtadres.

We kunnen een andere lijn maken, die we zullen bellen Mess2. Voer vervolgens, beginnend vanaf regel (9), de volgende opdrachten in:

(10) mov dx, offset Mess2

(13) Bericht db "Hallo wereld!$"

(14) Mess2 db "Ik ben het! $"

en stel ons programma opnieuw samen. Ik hoop dat je kunt raden wat er gaat gebeuren

Let op het laatste teken in de regels Bericht en bericht2 - $. Het wijst naar het einde van de regel. Als we het verwijderen, dan 21 H de interrupt blijft doorgaan totdat hij ergens in het geheugen een teken tegenkomt $. Op het scherm zullen we het zien afval .

Als u een debugger heeft, kunt u zien hoe ons programma werkt.

Het doel van deze kwestie was niet om het te begrijpen gedetailleerd met elke operator. Dit is onmogelijk, omdat je hebt nog niet genoeg kennis. Ik geloof dat je na 3-4 releases het principe en de structuur van een Assembly-programma zult begrijpen. Misschien leek de Assemblee-taal je buitengewoon ingewikkeld, maar geloof me, dit is op het eerste gezicht zo.