Hur många siffror används i det hexadecimala talsystemet. Hexadecimal numrering och adressering

Hexadecimalt talsystem. vårt första program.

För att skriva program i Assembly måste du förstå det hexadecimala talsystemet. Det är inget komplicerat med det. Vi använder decimalsystemet i livet. Jag är säker på att ni alla vet det, så jag ska försöka förklara det hexadecimala systemet med en analogi med decimalsystemet.

Så, i decimalsystemet, om vi lägger till en nolla till valfritt tal till höger, kommer detta tal att öka med 10 gånger. Till exempel: 1 x 10 = 10; 10 x 10 = 100; 100 x 10 = 1000 osv. I detta system använder vi siffror från 0 till 9, d.v.s. tio olika tal (det är faktiskt därför det kallas decimal).

I det hexadecimala systemet använder vi sexton "siffror". Jag skrev specifikt ordet "siffror" inom citattecken, eftersom... Den använder inte bara siffror. Och egentligen, hur kan det vara? Låt mig förklara: från 0 till 9 räknar vi på samma sätt som i decimaler, men då blir det så här: A, B, C, D, E, F. Talet F är inte svårt räkna, blir det lika med 15 i decimalsystemet (se tabell 1).

Decimal nummer

Hexadecimalt tal

Tabell 1. Decimala och hexadecimala system.

Således, om vi lägger till en nolla till höger om något tal i det hexadecimala systemet, kommer detta tal att öka med16 en gång.

Exempel 1: 1 x 16 = 10; 10 x 16 = 100; 100 x 16 = 1000 osv.

Kunde du skilja hexadecimala tal från decimala tal i exempel 1? Och från den här serien: 10, 12, 45, 64, 12, 8, 19? Dessa kan vara antingen hexadecimala eller decimala. För att undvika förvirring och att datorn tydligt ska kunna skilja ett nummer från ett annat, är det i assembler vanligt att placera symbolen h eller H efter ett hexadecimalt tal ( H är en förkortning för engelska. hexadecimal (hexadecimalt). För korthetens skull kallas det ibland helt enkelt Hex ) . Och sätt inget efter decimalen. Därför att siffror från 0 till 9 i båda systemen har samma betydelse, då är talen skrivna som 5 och 5h desamma.

Den där. Exempel 1 (se ovan) skulle vara mer korrekt att skriva så här: 1 x 16 = 10h; 10h x 16 = 100h; 100h x 16 = 1000h. Eller så här: 1h x 10h = 10h; 10h x 10h = 100h; 100h x 10h = 1000h.

Vi kommer att titta på varför det hexadecimala systemet behövs i efterföljande nummer. För nu, för vårt exempelprogram, som kommer att diskuteras nedan, behöver vi veta om förekomsten av hexadecimala tal.

Så, låt oss sammanfatta. Det hexadecimala talsystemet består av 10 siffror (från 0 till 9) och 6 bokstäver i det latinska alfabetet (A, B, C, D, E, F). Om vi ​​lägger till en nolla till höger om valfritt tal i det hexadecimala systemet kommer detta tal att öka med16 en gång. Det är mycket viktigt att förstå detta ämne, eftersom vi ständigt kommer att använda det när vi skriver program.

Nu lite om hur jag ska bygga exempel i Assembly. Det är inte helt bekvämt att presentera dem i HTML-format, så först blir det själva programkoden med numrerade rader, och direkt efter den kommer det förklaringar och anteckningar.

Sådär:

rader Programkod
(1) mov ah,9

Förklaringar:

I rad (1) gör vi detta, och i rad (15) gör vi det.

Stor förfrågan: Kopiera INTE program från en sida till urklipp och klistra sedan in dem i Anteckningar (eller någon annanstans)! Skriv dem igen manuellt i en textredigerare. Om du har en skrivare, välj sedan programmet, skriv ut det valda fragmentet och överför det sedan till editorn från papper. Alla exempel måste skrivas själv! Detta kommer att påskynda memoreringen av operatörer.

Och vidare. Det är ingen skillnad mellan gemener och VERSALER i assembler. Registreringar av formuläret:

Montören uppfattar dem på samma sätt. Du kan naturligtvis tvinga assemblern att skilja mellan gemener och VERSALER, men vi kommer inte att göra detta för tillfället. För att göra programmet lättare att läsa är det bäst att skriva operatorer med små bokstäver och börja namnen på subrutiner och etiketter med versaler. Men det beror på vem som kommer att trivas.

Så låt oss gå vidare till vårt första program:

(1) CSEG-segment

(2)org 100h

(4) Börja:

(6) mov ah,9

(7) mov dx,offset Meddelande

(8)int 21h

(10) om 20h

(11)

(12) Meddelande db "Hej världen!$"

(13)CSEG slutar

(14) slut Börja

För att förklara alla operatorer i detta exempel behöver vi flera utgåvor. Därför kommer vi helt enkelt att utelämna beskrivningen av vissa kommandon i detta skede. Anta bara att det är så det ska vara. Vi kommer att titta på dessa operatörer i detalj inom en mycket snar framtid. Så rader numrerade (1), (2) och (13) ignorerar du helt enkelt.

Raderna (3), (5), (9) och (11) lämnas tomma. Detta görs för tydlighetens skull. Montören kommer helt enkelt att utelämna dem.

Låt oss nu gå vidare för att överväga de återstående operatörerna. Programkoden börjar med rad (4). Detta är ett märke som talar om för assemblern till början av koden. Rad (14) innehåller operatorerna slut Börja ( Börja engelska Start; slutet slutet). Detta är slutet på programmet. I allmänhet, istället för ordet Börja något annat kunde ha använts. Till exempel, Start:. I det här fallet måste vi avsluta programmet Slutstart (14).

Rader (6) (8) visar meddelandet Hej världen!. Här måste vi kort prata om processorregister (vi kommer att titta på detta ämne mer detaljerat i nästa nummer).

Ett processorregister är ett speciellt tilldelat minne för att lagra ett nummer.

Till exempel:

Om vi ​​vill lägga till två tal, så skriver vi det så här i matematik:

A, B och C det här är ett slags register (om vi talar om en dator) där vissa data kan lagras. A=5 kan läsas som: Tilldela A siffran 5 .

För att tilldela ett register ett värde finns det en mov-operator i Assembler (från engelska move load). Rad (6) ska läsas så här: Laddar in i registret AH.nummer 9 (med andra ord, vi tilldelar AH.nummer 9). Nedan ska vi titta på varför detta är nödvändigt.

I rad (7) laddar vi in ​​i registret DX meddelandeadress för utdata (i det här exemplet kommer det att vara strängenHej världen!$).

Avbrott kommer att behandlas i detalj i efterföljande nummer. Här ska jag säga några ord.

Avbryta MS-DOS det är en sorts subrutin (del MS-DOS), som finns permanent i minnet och kan anropas när som helst från vilket program som helst.

Låt oss överväga ovanstående med ett exempel (Anteckningar med finstilt):

Program för att lägga till två siffror

Hemprogram

A=5 Vi matar in värdet 5 i variabel A

B=8 till variabel B värdet 8

Anropande subrutiner tillägg

nu är C lika med 13

A=10 samma sak, bara olika siffror

B=25

Anropande subrutiner tillägg

nu är C lika med 35

Slut på programmet

Subrutintillägg

C=A+B

ReturnFrom Subroutine vi återvänder till platsen varifrån vi ringde

Slutsubrutin

I det här exemplet anropade vi subrutinen två gånger Tillägg, som lade till två siffror som skickades till den i variabler A och B . Resultatet placeras i variabeln C. När en subrutin anropas kommer datorn ihåg varifrån den anropades, och sedan, när subrutinen har körts färdigt, återgår datorn till platsen från vilken den anropades. Den där. Du kan ringa subrutiner ett obegränsat antal gånger var som helst.

När vi kör rad (8) i ett monteringsprogram anropar vi en subrutin (i detta fall kallad avbrott), som visar raden på skärmen. För detta ändamål placerar vi faktiskt de nödvändiga värdena i registren. Allt nödvändigt arbete (mata ut en rad, flytta markören) tas över av subrutinen. Den här raden kan läsas så här: ring det tjugoförsta avbrottet ( int från engelska avbryta avbryta). Observera att efter siffran 21 finns en bokstav h . Detta är, som vi redan vet, ett hexadecimalt tal (33 i decimal). Inget hindrar oss naturligtvis från att byta ut linan int 21h till int 33. Programmet kommer att fungera korrekt. Det är bara vanligt i Assembler att ange avbrottsnumret i hexadecimalt format.

I rad (10) ringer vi, som du kanske har gissat, avbrott 20 h . För att anropa detta avbrott behöver du inte ange några värden i registren. Den utför bara en uppgift: avsluta programmet (avsluta till DOS). Som ett resultat av exekvering av avbrott 20h, kommer programmet att återvända till där det startades från (laddat, anropat). Till exempel i Norton Commander eller DOS Navigator.

Rad (12) innehåller meddelandet som ska matas ut. Första ordet ( meddelande meddelande) meddelandetitel. Det kan vara vad som helst (t.ex. röra eller snöre, etc.). HANDLA OM Var uppmärksam på rad (7), där vi laddar in i registret DX vår meddelandeadress.

Vi kan skapa en annan linje, som vi kommer att anropa Mess2. Sedan, börja från rad (9), infoga följande kommandon:

(10) mov dx,offset Mess2

(13) Meddelande db "Hej världen!$"

(14) Mess2 db "Det är JAG! $"

och återmontera vårt program. Jag hoppas att du kan gissa vad som kommer att hända

Var uppmärksam på det sista tecknet i raderna Meddelande och Mess2 - $. Det pekar mot slutet av raden. Om vi ​​tar bort det, då 21 h avbrottet fortsätter att matas ut tills det stöter på ett tecken någonstans i minnet $. På skärmen kommer vi att se sopor .

Om du har en debugger kan du se hur vårt program kommer att fungera.

Syftet med denna fråga var inte att förstå i detalj med varje operatör. Detta är omöjligt, eftersom du har inte tillräckligt med kunskap än. Jag tror att du efter 3-4 releaser kommer att förstå principen och strukturen för ett Assembly-program. Kanske verkade församlingens språk extremt komplicerat för dig, men tro mig, detta är vid första anblicken.

  1. Använd den här metoden om du inte är bekant med det hexadecimala talsystemet. Den enkla, intuitiva metoden kan användas av nästan alla. Om du är bekant med olika nummersystem, läs om, vilket beskrivs nedan.

    • Om du inte kan något alls om det hexadecimala systemet, börja med att lära dig de grundläggande begreppen.
  2. Höj 16 till makten från 1 till 5 och skriv ner resultaten. Platsvärdet för varje siffra i ett hexadecimalt tal är resultatet av att höja siffran 16 till potensen, precis som platsvärdet för varje siffra i ett decimaltal är resultatet av att höja siffran 10 till potensen 10. Följande lista över resultat för att höja 16 till olika krafter är användbar i konverteringsprocessen:

    • 16 5 = 1048576
    • 16 4 = 65536
    • 16 3 = 4096
    • 16 2 = 256
    • 16 1 = 16
    • Om decimaltalet du konverterar är större än 1048576, höj 16 till en högre potens och lägg till resultatet i listan.
  3. Från listan, hitta det största talet som är mindre än det givna decimaltalet. Skriv ner det givna decimaltalet som du vill konvertera till hexadecimalt. Titta på listan ovan och hitta det största resultatet (höjer 16 till potensen) som är mindre än det givna decimaltalet.

    • Till exempel måste du konvertera decimaltalet 495 till hexadecimalt. Välj nummer 256 från listan.
  4. Dividera decimaltalet med det valda resultatet av att höja 16 till potensen. Arbeta med heltalsdivisionsresultat – ignorera siffrorna efter decimalkomma.

    • I vårt exempel: 495 ÷ 256 = 1,93..., så arbeta med talet 1 (detta är heltalskvoten för division).
    • Det resulterande resultatet är den första siffran i det hexadecimala talet. I det här fallet delade du det givna decimaltalet med 256, så 1:an är på 256:e plats.
  5. Hitta den första resten. Det vill säga resten av att dividera ett givet decimaltal med det valda talet (divisor). Återstoden beräknas på samma sätt som för lång division.

    • Multiplicera den resulterande kvoten med divisor. I vårt exempel: 1 x 256 = 256 (det vill säga 1 i hexadecimal representerar 256 i bas 10).
    • Subtrahera resultatet av multiplikationen från det givna decimaltalet: 495 - 256 = 239 .
  6. Dela resten med nästa (i listan) resultat av att höja 16 till makten. Titta på listan med resultaten av att höja 16 till olika makter. Hitta resultatet som ligger under resultatet du valde för föregående division. Dividera resten med det valda talet för att hitta nästa siffra i det hexadecimala talet (om resten är mindre än det valda talet är nästa siffra 0).

    • 239 ÷ 16 = 14 . Ignorera siffrorna efter decimalkomma.
    • Detta är den andra siffran i ett hexadecimalt tal, som ligger på 16:e plats. Alla tal från 0 till 15 kan representeras av en enda hexadecimal siffra. De resulterande talen kommer att konverteras och placeras i slutet av denna metod.
  7. Hitta den andra resten. För att göra detta, multiplicera den resulterande kvoten med divisorn och subtrahera sedan resultatet av multiplikationen från den första återstoden. Den andra återstoden måste konverteras till en hexadecimal siffra.

    • 14 x 16 = 224.
    • 239 - 224 = 15, det vill säga resten är 15 .
  8. Upprepa ovanstående process tills resten är mindre än 16. Om resten är ett tal mellan 0 och 15 kan det uttryckas som en enda hexadecimal siffra. Denna siffra kommer att vara den sista siffran.

    • Den sista siffran i ett hexadecimalt tal är 15, vilket är på ettor.
  9. Konvertera de resulterande talen och skriv ner svaret. Du har hittat alla siffror i ett hexadecimalt tal. Men de är skrivna i decimaltalssystemet. För att konvertera varje siffra till bas 16, använd följande instruktioner:

    • Siffrorna från 0 till 9 ändras inte.
    • 10 = A; 11 = B; 12 = C; 13 = D; 14 = E; 15 = F
    • I vårt exempel fick du siffrorna (1)(14)(15). Det vill säga, det hexadecimala talet kommer att skrivas så här: 1EF.
  10. Kontrollera svaret. Detta är lätt att göra om du kan grunderna i det hexadecimala talsystemet. Konvertera varje hexadecimal siffra till en bas med 10 siffror och multiplicera sedan med resultatet av att höja 16 till den specifika potens som motsvarar siffrans position. I vårt exempel:

    • 1EF → (1)(14)(15)
    • Arbeta med siffror från höger till vänster. 15 är på en plats: 16 0 = 1, alltså 15 x 1 = 15.
    • Nästa siffra är på 16:e plats: 16 1 = 16, alltså 14 x 16 = 224.
    • Nästa siffra är på plats 256: 16 2 = 256, alltså 1 x 256 = 256.
    • Lägg ihop resultaten som hittats: 256 + 224 + 15 = 495, det vill säga du får det ursprungliga decimaltalet.

För att skriva program i Assembly måste du förstå det hexadecimala talsystemet. Det är inget komplicerat med det. Vi använder decimalsystemet i livet. Jag är säker på att ni alla vet det, så jag ska försöka förklara det hexadecimala systemet med en analogi med decimalsystemet.

Så, i decimalsystemet, om vi lägger till en nolla till valfritt tal till höger, kommer detta tal att öka med 10 gånger. Till exempel: 1 x 10 = 10; 10 x 10 = 100; 100 x 10 = 1000 osv. I detta system använder vi siffror från 0 till 9, d.v.s. tio olika tal (det är faktiskt därför det kallas decimal).

I det hexadecimala systemet använder vi sexton "siffror". Jag skrev specifikt ordet "siffror" inom citattecken, eftersom... Den använder inte bara siffror. Och egentligen, hur kan det vara? Låt mig förklara: från 0 till 9 räknar vi på samma sätt som i decimaler, men då blir det så här: A, B, C, D, E, F. Talet F är inte svårt räkna, blir det lika med 15 i decimalsystemet (se tabell 1).

Decimal nummer

Hexadecimalt tal

Tabell 1. Decimala och hexadecimala system.

Således, om vi lägger till en nolla till höger om något tal i det hexadecimala systemet, kommer detta tal att öka med16 en gång.

Exempel 1: 1 x 16 = 10; 10 x 16 = 100; 100 x 16 = 1000 osv.

Kunde du skilja hexadecimala tal från decimala tal i exempel 1? Och från den här serien: 10, 12, 45, 64, 12, 8, 19? Dessa kan vara antingen hexadecimala eller decimala. För att undvika förvirring och att datorn tydligt ska kunna skilja ett nummer från ett annat, är det i assembler vanligt att placera symbolen h eller H efter ett hexadecimalt tal ( H är en förkortning för engelska. hexadecimal (hexadecimalt). För korthetens skull kallas det ibland helt enkelt Hex ) . Och sätt inget efter decimalen. Därför att siffror från 0 till 9 i båda systemen har samma betydelse, då är talen skrivna som 5 och 5h desamma.

Den där. Exempel 1 (se ovan) skulle vara mer korrekt att skriva så här: 1 x 16 = 10h; 10h x 16 = 100h; 100h x 16 = 1000h. Eller så här: 1h x 10h = 10h; 10h x 10h = 100h; 100h x 10h = 1000h.

Vi kommer att titta på varför det hexadecimala systemet behövs i efterföljande nummer. För nu, för vårt exempelprogram, som kommer att diskuteras nedan, behöver vi veta om förekomsten av hexadecimala tal.

Så, låt oss sammanfatta. Det hexadecimala talsystemet består av 10 siffror (från 0 till 9) och 6 bokstäver i det latinska alfabetet (A, B, C, D, E, F). Om vi ​​lägger till en nolla till höger om valfritt tal i det hexadecimala systemet kommer detta tal att öka med16 en gång. Det är mycket viktigt att förstå detta ämne, eftersom vi ständigt kommer att använda det när vi skriver program.

Nu lite om hur jag ska bygga exempel i Assembly. Det är inte helt bekvämt att presentera dem i HTML-format, så först blir det själva programkoden med numrerade rader, och direkt efter den kommer det förklaringar och anteckningar.

Sådär:

rader Programkod
(1) mov ah,9

Förklaringar:

I rad (1) gör vi detta, och i rad (15) gör vi det.

Stor förfrågan: Kopiera INTE program från en sida till urklipp och klistra sedan in dem i Anteckningar (eller någon annanstans)! Skriv dem igen manuellt i en textredigerare. Om du har en skrivare, välj sedan programmet, skriv ut det valda fragmentet och överför det sedan till editorn från papper. Alla exempel måste skrivas själv! Detta kommer att påskynda memoreringen av operatörer.

Och vidare. Det är ingen skillnad mellan gemener och VERSALER i assembler. Registreringar av formuläret:

Montören uppfattar dem på samma sätt. Du kan naturligtvis tvinga assemblern att skilja mellan gemener och VERSALER, men vi kommer inte att göra detta för tillfället. För att göra programmet lättare att läsa är det bäst att skriva operatorer med små bokstäver och börja namnen på subrutiner och etiketter med versaler. Men det beror på vem som kommer att trivas.

Så låt oss gå vidare till vårt första program:

(1) CSEG-segment

(2)org 100h

(4) Börja:

(6) mov ah,9

(7) mov dx,offset Meddelande

(8)int 21h

(10) om 20h

(11)

(12) Meddelande db "Hej världen!$"

(13)CSEG slutar

(14) slut Börja

För att förklara alla operatorer i detta exempel behöver vi flera utgåvor. Därför kommer vi helt enkelt att utelämna beskrivningen av vissa kommandon i detta skede. Anta bara att det är så det ska vara. Vi kommer att titta på dessa operatörer i detalj inom en mycket snar framtid. Så rader numrerade (1), (2) och (13) ignorerar du helt enkelt.

Raderna (3), (5), (9) och (11) lämnas tomma. Detta görs för tydlighetens skull. Montören kommer helt enkelt att utelämna dem.

Låt oss nu gå vidare för att överväga de återstående operatörerna. Programkoden börjar med rad (4). Detta är ett märke som talar om för assemblern till början av koden. Rad (14) innehåller operatorerna slut Börja ( Börja engelska Start; slutet slutet). Detta är slutet på programmet. I allmänhet, istället för ordet Börja något annat kunde ha använts. Till exempel, Start:. I det här fallet måste vi avsluta programmet Slutstart (14).

Rader (6) (8) visar meddelandet Hej världen!. Här måste vi kort prata om processorregister (vi kommer att titta på detta ämne mer detaljerat i nästa nummer).

Ett processorregister är ett speciellt tilldelat minne för att lagra ett nummer.

Till exempel:

Om vi ​​vill lägga till två tal, så skriver vi det så här i matematik:

A, B och C det här är ett slags register (om vi talar om en dator) där vissa data kan lagras. A=5 kan läsas som: Tilldela A siffran 5 .

För att tilldela ett register ett värde finns det en mov-operator i Assembler (från engelska move load). Rad (6) ska läsas så här: Laddar in i registret AH.nummer 9 (med andra ord, vi tilldelar AH.nummer 9). Nedan ska vi titta på varför detta är nödvändigt.

I rad (7) laddar vi in ​​i registret DX meddelandeadress för utdata (i det här exemplet kommer det att vara strängenHej världen!$).

Avbrott kommer att behandlas i detalj i efterföljande nummer. Här ska jag säga några ord.

Avbryta MS-DOS det är en sorts subrutin (del MS-DOS), som finns permanent i minnet och kan anropas när som helst från vilket program som helst.

Låt oss överväga ovanstående med ett exempel (Anteckningar med finstilt):

Program för att lägga till två siffror

Hemprogram

A=5 Vi matar in värdet 5 i variabel A

B=8 till variabel B värdet 8

Anropande subrutiner tillägg

nu är C lika med 13

A=10 samma sak, bara olika siffror

B=25

Anropande subrutiner tillägg

nu är C lika med 35

Slut på programmet

Subrutintillägg

C=A+B

ReturnFrom Subroutine vi återvänder till platsen varifrån vi ringde

Slutsubrutin

I det här exemplet anropade vi subrutinen två gånger Tillägg, som lade till två siffror som skickades till den i variabler A och B . Resultatet placeras i variabeln C. När en subrutin anropas kommer datorn ihåg varifrån den anropades, och sedan, när subrutinen har körts färdigt, återgår datorn till platsen från vilken den anropades. Den där. Du kan ringa subrutiner ett obegränsat antal gånger var som helst.

När vi kör rad (8) i ett monteringsprogram anropar vi en subrutin (i detta fall kallad avbrott), som visar raden på skärmen. För detta ändamål placerar vi faktiskt de nödvändiga värdena i registren. Allt nödvändigt arbete (mata ut en rad, flytta markören) tas över av subrutinen. Den här raden kan läsas så här: ring det tjugoförsta avbrottet ( int från engelska avbryta avbryta). Observera att efter siffran 21 finns en bokstav h . Detta är, som vi redan vet, ett hexadecimalt tal (33 i decimal). Inget hindrar oss naturligtvis från att byta ut linan int 21h till int 33. Programmet kommer att fungera korrekt. Det är bara vanligt i Assembler att ange avbrottsnumret i hexadecimalt format.

I rad (10) ringer vi, som du kanske har gissat, avbrott 20 h . För att anropa detta avbrott behöver du inte ange några värden i registren. Den utför bara en uppgift: avsluta programmet (avsluta till DOS). Som ett resultat av exekvering av avbrott 20h, kommer programmet att återvända till där det startades från (laddat, anropat). Till exempel i Norton Commander eller DOS Navigator.

Rad (12) innehåller meddelandet som ska matas ut. Första ordet ( meddelande meddelande) meddelandetitel. Det kan vara vad som helst (t.ex. röra eller snöre, etc.). HANDLA OM Var uppmärksam på rad (7), där vi laddar in i registret DX vår meddelandeadress.

Vi kan skapa en annan linje, som vi kommer att anropa Mess2. Sedan, börja från rad (9), infoga följande kommandon:

(10) mov dx,offset Mess2

(13) Meddelande db "Hej världen!$"

(14) Mess2 db "Det är JAG! $"

och återmontera vårt program. Jag hoppas att du kan gissa vad som kommer att hända

Var uppmärksam på det sista tecknet i raderna Meddelande och Mess2 - $. Det pekar mot slutet av raden. Om vi ​​tar bort det, då 21 h avbrottet fortsätter att matas ut tills det stöter på ett tecken någonstans i minnet $. På skärmen kommer vi att se sopor .

Om du har en debugger kan du se hur vårt program kommer att fungera.

Syftet med denna fråga var inte att förstå i detalj med varje operatör. Detta är omöjligt, eftersom du har inte tillräckligt med kunskap än. Jag tror att du efter 3-4 releaser kommer att förstå principen och strukturen för ett Assembly-program. Kanske verkade församlingens språk extremt komplicerat för dig, men tro mig, detta är vid första anblicken.

Det hexadecimala talsystemet har ett alfabet som består av 16 siffror:

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

När man skriver ett tal i det hexadecimala systemet används bokstäverna A, B, C, D, E, F respektive för att skriva siffrorna som anger siffrorna 10, 11, 12. 13, 14. 15.

Konvertera tal från hexadecimal till decimal

Du kan konvertera valfritt hexadecimalt tal till decimaler med den redan kända formeln

Exempel.

    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.

Att konvertera ett tal från decimalsystemet till hexadecimalt görs på samma sätt som till binärt.

Konvertera tal från hexadecimala till binära och vice versa

Du kan konvertera vilket hexadecimalt tal som helst till binärt enligt följande. Varje siffra i ett hexadecimalt tal skrivs som ett fyrsiffrigt binärt tal - anteckningsbok. Efter detta kan nollorna till vänster kasseras.

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

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

Omvänt kan du konvertera vilket binärt tal som helst till hexadecimalt på samma sätt. Var fjärde binär siffra, räknat från höger till vänster, skrivs som en hexadecimal siffra. Dessa nummer finns också från höger till vänster.

Exempel.

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

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

Oktalt talsystem

Det oktala talsystemet har ett alfabet som består av 8 siffror:

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

Att konvertera ett tal från decimalsystemet till oktalt och tillbaka görs på samma sätt som att konvertera till/från binärt.

Konvertera tal från oktalt till binärt och tillbaka

Varje siffra i ett oktalt tal skrivs som ett tresiffrigt binärt tal - triad.

Exempel.

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

1001101 2 = 001 001 101 2 = 115 8 .

Metodmaterial för laborationslektion nr 1

Laborationslektionens ämne: Talsystem. Mätning av information.

Antal timmar: 2.

Exempel med lösningar

    Översättning frånsid -ärt system till 10-arigt system. Anta att vi behöver konvertera ett tal i ett visst talsystem till decimal. För att göra detta måste du representera det i formuläret

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.

    Konvertering från 10-siffrigt system tillsid -ichnaya.

2.1 98 10 → X 2.

Vi delar talet med 2. Sedan dividerar vi den ofullständiga kvoten med 2. Vi fortsätter tills den ofullständiga kvoten blir mindre än 2, d.v.s. lika med 1.

    98: 2 = 49. Återstoden - 0 .

    49: 2 = 24. Återstoden - 1 .

    24: 2 = 12. Återstoden - 0 .

    12: 2 = 6. Återstoden - 0 .

    6: 2 = 3. Återstoden - 0 .

    3: 2 = 1 . Återstoden - 1 .

Eftersom den sista delkvoten är 1 är processen över. Vi skriver ner alla rester från botten till toppen, börjar med den sista ofullständiga kvoten, och vi får talet 1100010. Så 98 10 = 1100010 2.

2.2 2391 10 → X 16.

Dividera talet med 16. Dela sedan delkvoten med 16. Fortsätt tills delkvoten är mindre än 16.

    2391: 16 = 149. Återstoden - 7 .

    149: 16 = 9 . Återstoden - 5 .

Eftersom den sista partiella kvoten (9) är mindre än 16 är processen över. Vi skriver ner, med början från den sista ofullständiga kvoten, alla rester från botten till toppen och vi får talet 957. Så 2391 10 = 957 16.

2.3 12165 10 → X 2.

Om man konverterar genom division till det binära systemet får man en ganska krånglig process. Du kan först konvertera talet till oktalt och sedan ersätta de oktala siffrorna från höger till vänster med triader.

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

    Bestämma basen för ett talsystemsid .

En pojke skrev om sig själv: "Jag har 24 fingrar, 5 på varje hand och 12 på mina fötter." Hur kan det vara såhär?

Lösning. Det är nödvändigt att bestämma basen för talsystemet sid. Eftersom vi vet att det bara finns 10 tår 10, sedan 12 sid =1∙sid+2 = 10 10 . Härifrån får vi ekvationen sid + 2 = 10  sid= 8. Pojken menade alltså tal i det oktala systemet. Det finns faktiskt 24 8 = 2∙8+4 = 20 10 tår och 12 8 = 1∙8+2 = 10 10 tår.

Många datoranvändare förstår att en dator fungerar i ett binärt talsystem. Traditionellt representeras tillstånden i ett binärt system av siffrorna 0 och 1, även om varje tillstånd mer exakt indikerar närvaron eller frånvaron av en signal, det vill säga det skulle vara mer korrekt att kalla tillstånden "av" och "på" eller "nej" och "ja". Tillståndet "av" eller "nej" motsvarar siffran 0, och tillståndet "på" eller "ja" motsvarar siffran 1. Vanliga användare behöver vanligtvis inte helt förstå datorstrukturen, men det binära talsystemet gör sig gällande i form av olika restriktioner baserade på tvåstyrkor. En mer kompakt version av det binära systemet kallas hexadecimal. Siffran sexton är den fjärde potensen av två. Av detta följer att du helt enkelt kan omvandla långa binära sekvenser av nollor och ettor till korta hexadecimala ettor. För att göra detta, dela helt enkelt den binära sekvensen i grupper om fyra siffror (siffror) som börjar med den minst signifikanta siffran (till höger) och ersätter varje grupp med motsvarande hexadecimala värde.

Det hexadecimala systemet används vanligtvis för att underlätta uppfattningen av binära data, eftersom omvandlingar från det hexadecimala systemet till det binära systemet och tillbaka utförs genom att helt enkelt ersätta strängar. Datorn arbetar uteslutande med binära sekvenser, och den hexadecimala notationen för denna sekvens är fyra gånger mer kompakt, eftersom detta system har bas 16 (2 16) och binär 2. Den binära sekvensen kan vara ganska besvärlig. Till exempel, att skriva talet 513 kräver tio binära siffror (1000000001), men bara tre i hexadecimal (201). Men för att representera ett hexadecimalt tal krävs sexton olika symboler, snarare än de tio som används i det decimaltalssystem som vi är bekanta med. De första tio tecknen är tecken i intervallet från 0 till 9, resten är bokstäver i det latinska alfabetet i intervallet från A till F. Bokstäverna skrivs vanligtvis (men inte alltid) med versaler (versaler) i hexadecimal notation av siffra. De första tio tecknen (från 0 till 9) skrivs på samma sätt som siffror i decimaltalsystemet och motsvarar dem. Bokstäver i intervallet A till F motsvarar värden i intervallet 10 till 15.

Låt oss överväga överensstämmelsen mellan siffror från 0 till 15 i hexadecimala och binära talsystem.

Decimalnotation Hexadecimal notation Binär notation
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111

Posterna för 10, 11, etc. i decimala, binära och hexadecimala system motsvarar inte varandra. Låt oss titta på ett litet exempel. Låt oss ha ett hexadecimalt tal 1A5E. För att konvertera till binärt, ersätt helt enkelt de hexadecimala siffrorna med motsvarande binära grupper. Resultatet blir 0001 1010 0101 1110. Om vi ​​tar bort de obetydliga nollorna framför talet och skriver det utan avgränsare får vi 1101001011110. För den omvända översättningen delar vi talet i grupper om fyra siffror, med början med den lägsta ( på höger sida), och även för bekvämlighets skull lägger vi till obetydliga nollor i den högsta gruppen till 4 led. Vi får 0001 1010 0101 1110. Ersätt grupperna med motsvarande hexadecimala värden, vi får 1A5E.

För att konvertera ett hexadecimalt tal till en decimalrepresentation kan du använda schemat som vi skriver decimaltal med. I ett decimaltal representerar varje siffra motsvarande tiopotens, med början från noll och ökar från höger till vänster. Till exempel betyder decimaltalet 123 1*10 2 + 2*10 1 + 3*10 0 . Med en liknande metod omvandlar vi talet 1A5E till decimaltalsystemet. I det hexadecimala talsystemet, såväl som i det decimala talsystemet, betecknar varje siffra motsvarande potens av talet sexton, med start från noll och ökande från höger till vänster. Tecknen 1 och 5 i hexadecimal motsvarar värdena 1 och 5 i decimal, och tecknen A och E motsvarar 10 och 14. Då kan 1A5E representeras i decimal som 1*16 3 + 10*16 2 + 5 *16 1 + 14*16 0 = 6750. Men för att utvärdera hexadecimala tal är det inte alls nödvändigt att konvertera dem till decimala tal. Reglerna för jämförelse, addition och multiplikation i detta system är desamma som i decimalsystemet, det viktigaste är att inte glömma att varje siffra kan innehålla värden från 0 till 15. För att snabbt konvertera tal mellan talsystem, du kan använda en standardräknare i Windows, för detta räcker det med att I det avancerade läget för räknaren, välj ett nummersystem, ange ett nummer i det och välj önskat nummersystem där resultatet ska visas.

Eftersom endast numeriska hexadecimala tal lätt kan förväxlas med decimala tal, markeras de vanligtvis på ett sätt som gör det tydligt att hexadecimal notation används. Hexadecimala poster markeras vanligtvis genom att antingen lägga till ett gement "h" i slutet eller lägga till ett "0x" prefix före siffran. Således kan det hexadecimala talet 1A5E skrivas som 1A5Eh eller 0x1A5E, där ett efterföljande "h" eller ett inledande "0x" indikerar att hexadecimal notation används.