Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ

Sistemet e numrave. Sistemi i numrave pozicional heksadecimal

Për të paraqitur numrat në një mikroprocesor, sistemi binar.
Në këtë rast, çdo sinjal dixhital mund të ketë dy gjendje të qëndrueshme: "nivel i lartë" dhe "nivel i ulët". Në sistemin binar, për imazhin e çdo numri, përdoren dy shifra, përkatësisht: 0 dhe 1. Numri arbitrar x=a n a n-1 ..a 1 a 0 ,a -1 a -2 …a -m shkruar me shënim binar si

x = a n 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

ku a i- shifra binare (0 ose 1).

Sistemi i numrave oktal

Në sistemin e numrave oktal, shifrat bazë janë numrat nga 0 në 7. 8 njësitë e bitit më pak të rëndësishëm kombinohen në njësinë më domethënëse.

Sistemi heksadecimal i numrave

Në sistemin heksadecimal të numrave, shifrat bazë janë numrat nga 0 deri në 15 duke përfshirë. Për të përcaktuar shifrat bazë më të mëdha se 9 me një karakter, përveç numrave arabë 0 ... 9, shkronjat e alfabetit latin përdoren në sistemin heksadecimal të numrave:

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

Për shembull, numri 175 10 në heksadecimal do të shkruhet si AF 16 . Vërtet,

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

Tabela përmban numrat nga 0 deri në 16 në sistemet e numrave dhjetorë, binar, oktalë dhe heksadecimal.

dhjetore Binar oktal Heksadecimal
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

Konvertimet binare-oktale dhe binare-heksadecimal

Sistemi i numrave binar është i përshtatshëm për kryerjen e operacioneve aritmetike nga hardueri i mikroprocesorit, por i papërshtatshëm për perceptimin njerëzor, pasi kërkon një numër të madh shifrash. Prandaj, në teknologjinë kompjuterike, përveç sistemit binar të numrave, sistemet e numrave oktal dhe heksadecimal përdoren gjerësisht për një paraqitje më kompakte të numrave.

Tre bit të sistemit të numrave oktal zbatojnë të gjitha kombinimet e mundshme të shifrave oktal në sistemin e numrave binar: nga 0 (000) në 7 (111). Për të kthyer një numër binar në oktal, duhet të kombinoni shifrat binare në grupe me 3 shifra (triada) në dy drejtime, duke filluar nga ndarja e pjesëve të numrit të plotë dhe të pjesshëm. Nëse është e nevojshme, zero të parëndësishme duhet të shtohen në të majtë të numrit origjinal. Nëse numri përmban një pjesë të pjesshme, atëherë në të djathtë mund të shtohen edhe zero të parëndësishme derisa të plotësohen të gjitha treshe. Pastaj çdo treshe zëvendësohet nga një shifër tetëshe.

Shembull: Shndërroni numrin 1101110.01 2 në oktal.

Ne kombinojmë shifrat binare në treshe nga e djathta në të majtë. marrim

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

Për të kthyer një numër nga sistemi oktal në binar, duhet të shkruani çdo shifër oktal në kodin e tij binar:

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

Katër bit të sistemit të numrave heksadecimal zbatojnë të gjitha kombinimet e mundshme të shifrave heksadecimal në sistemin e numrave binar: nga 0 (0000) në F (1111). Për të kthyer një numër binar në heksadecimal, duhet të kombinoni shifrat binare në grupe me 4 shifra (tetrada) në dy drejtime, duke filluar nga ndarësi i pjesëve të numrit të plotë dhe të pjesshëm. Nëse është e nevojshme, zero të parëndësishme duhet të shtohen në të majtë të numrit origjinal. Nëse numri përmban një pjesë të pjesshme, atëherë në të djathtë të tij duhet të shtohen edhe zero të parëndësishme derisa të plotësohen të gjitha tetradat. Çdo tetradë më pas zëvendësohet me një shifër heksadecimal.

Shembull: Shndërroni numrin 1101110.11 2 në heksadecimal.

Ne kombinojmë shifrat binare në tetrada nga e djathta në të majtë. marrim

0110 1110.1100 2 = 6E,C 16 .

Për të kthyer një numër nga heksadecimal në binar, duhet të shkruani çdo shifër heksadecimal në kodin e tij binar.

Sistemi heksadecimal i numrave. programi ynë i parë.

Për të shkruar programe në asembler, duhet të kuptoni sistemin e numrave heksadecimal. Nuk ka asgjë të komplikuar në të. Ne përdorim sistemin dhjetor në jetën tonë. Jam i sigurt që e dini të gjithë, kështu që do të përpiqem të shpjegoj sistemin heksadecimal me analogji me dhjetore.

Pra, në sistemin dhjetor, nëse i shtojmë zero në të djathtë të çdo numri, atëherë ky numër do të rritet me 10 herë. Për shembull: 1 x 10 = 10; 10 x 10 = 100; 100 x 10 = 1000 etj. Në këtë sistem, ne përdorim numrat nga 0 në 9, d.m.th. dhjetë shifra të ndryshme (në fakt, kjo është arsyeja pse quhet dhjetore).

Në sistemin heksadecimal, ne përdorim, përkatësisht, gjashtëmbëdhjetë "shifra". Konkretisht fjalën “numrat” e kam shkruar në thonjëza, sepse ai përdor më shumë sesa thjesht numra. Dhe si është në të vërtetë? Unë shpjegoj: nga 0 në 9 numërojmë njësoj si në dhjetore, por atëherë do të jetë kështu: A, B, C, D, E, F. Numri F, sado i vështirë të jetë numëro, do të jetë e barabartë me 15 në sistemin dhjetor (shih tabelën 1).

Numri dhjetor

Numri heksadecimal

Tabela 1. Sistemet dhjetore dhe heksadecimale.

Kështu, nëse i shtojmë zero në të djathtë çdo numri në sistemin heksadecimal, atëherë ky numër do të rritet në16 një herë.

Shembulli 1: 1 x 16 = 10; 10 x 16 = 100; 100 x 16 = 1000 etj.

A keni mundur të dalloni heksadecimalin nga dhjetori në shembullin 1? Dhe nga ky rresht: 10, 12, 45, 64, 12, 8, 19? Mund të jetë ose heksadecimal ose dhjetor. Për të shmangur konfuzionin dhe kompjuteri mund të dallojë pa mëdyshje një numër nga një tjetër, është e zakonshme në Assembler të vendoset karakteri h ose H pas numrit heksadecimal ( H është shkurt për anglisht. heksadecimal (heksadecimal). Shkurtimisht, ndonjëherë quhet thjesht heks ) . Dhe pas dhjetorit, mos vendosni asgjë. Sepse numrat nga 0 në 9 në të dy sistemet kanë të njëjtin kuptim, atëherë numrat e shkruar si 5 dhe 5h janë të njëjtë.

Se. Shembulli 1 (shih më lart) do të ishte më i saktë të shkruhet si më poshtë: 1 x 16 = 10h; 10h x 16 = 100h; 100h x 16 = 1000h. Ose si kjo: 1h x 10h = 10h; 10h x 10h = 100h; 100h x 10h = 1000h.

Pse nevojitet sistemi heksadecimal, do ta shqyrtojmë në çështjet vijuese. Tani për tani, për programin tonë të mostrës, i cili do të diskutohet më poshtë, duhet të dimë për ekzistencën e numrave heksadecimal.

Pra, le ta përmbledhim atë. Sistemi heksadecimal i numrave përbëhet nga 10 shifra (nga 0 në 9) dhe 6 shkronja të alfabetit latin (A, B, C, D, E, F). Nëse shtojmë zero në të djathtë të çdo numri në sistemin heksadecimal, atëherë ky numër do të rritet me16 një herë. Është shumë e rëndësishme të kuptohet kjo temë., pasi do ta përdorim vazhdimisht kur shkruajmë programe.

Tani pak për mënyrën se si do të ndërtoj shembuj në asembler. Nuk është shumë i përshtatshëm për t'i paraqitur ato në format HTML, kështu që së pari do të jetë vetë kodi i programit me rreshta të numëruar, dhe menjëherë pas tij do të ketë shpjegime dhe shënime.

Pak a shumë si kjo:

linjat Kodi i programit
(1) mov ah, 9

Shpjegimet:

Në rreshtin (1) bëjmë diçka, dhe në rreshtin (15) bëjmë diçka.

Kërkesë e madhe: MOS kopjoni programe nga faqja në clipboard dhe më pas ngjitini ato në Notepad (ose kudo tjetër)! Shkruani ato me dorë në një redaktues teksti. Nëse ka një printer, atëherë zgjidhni programin, printoni fragmentin e zgjedhur dhe më pas transferojeni te redaktori nga letra. Të gjithë shembujt duhet të shtypen vetë! Kjo do të përshpejtojë memorizimin e operatorëve.

Dhe më tej. Shkronjat e vogla dhe të mëdha nuk dallohen në Assembler. Regjistrime si:

Asambleri perceptohet në mënyrë të barabartë. Natyrisht, mund ta detyroni assembler-in të bëjë dallimin midis shkronjave të vogla dhe UPPER, por ne nuk do ta bëjmë këtë për momentin. Për lexueshmërinë e programit, është më mirë të shkruani deklaratat me shkronja të vogla dhe të filloni emrat e nënprogrameve dhe etiketave me shkronja të mëdha. Por kështu do të jetë e përshtatshme për dikë.

Pra, le të kalojmë në programin tonë të parë:

(1) segment CSEG

(2) org 100h

(4) Fillimi:

(6) mov ah,9

(7) mov dx, offset Mesazh

(8) në 21h

(10) në 20h

(11)

(12) Mesazhi db "Përshëndetje, botë!$"

(13) CSEG përfundon

(14) fundFillimi

Për të shpjeguar të gjithë operatorët e këtij shembulli, do të na duhen disa episode. Prandaj, ne thjesht do të heqim përshkrimin e disa komandave në këtë fazë. Vetëm mendoni se kështu duhet të jetë. Në të ardhmen shumë të afërt do t'i shqyrtojmë në detaje këta operatorë. Pra, rreshtat me numrat (1), (2) dhe (13) thjesht i injoroni.

Rreshtat (3), (5), (9) dhe (11) lihen bosh. Kjo është bërë për qartësi. Asambleri thjesht do t'i heqë ato.

Tani le të kalojmë te pjesa tjetër e operatorëve. Nga rreshti (4) fillon kodi i programit. Ky është një etiketë që i thotë asemblerit të fillojë kodin. Rreshti (14) përmban deklaratat në fund Fillimi ( Filloni anglisht Fillimi; fund fund). Ky është fundi i programit. Në përgjithësi, në vend të fjalës Filloni mund të ishte përdorur diçka tjetër. Për shembull, Fillimi:. Në këtë rast, ne do të duhet të plotësojmë programin Fund Fillimi (14).

Rreshtat (6) (8) shfaqin mesazhin Përshëndetje, botë!. Këtu duhet të flasim shkurtimisht për regjistrat e procesorëve (këtë temë do ta shqyrtojmë më në detaje në numrin vijues).

Regjistri i procesorit është një memorie e dedikuar për ruajtjen e një numri.

Për shembull:

Nëse duam të mbledhim dy numra, atëherë në matematikë shkruajmë kështu:

A, B dhe C janë një lloj regjistrash (nëse flasim për kompjuter) në të cilët mund të ruhen disa të dhëna. A=5 mund të lexohet si: Cakto A-së numrin 5 .

Për t'i caktuar një vlerë një regjistri, ekziston një operator mov në Assembler (nga anglishtja move load). Rreshti (6) duhet të lexohet si ky: Ngarkimi në regjistër AHnumri 9 (me fjalë të tjera, ne caktojmë AHnumri 9). Më poshtë do të shqyrtojmë pse kjo është e nevojshme.

Në rreshtin (7) ne ngarkojmë në regjistër DX adresa e mesazhit që do të dalë (në këtë shembull do të jetë varguPërshëndetje, botë! $).

Ndërprerjet do të trajtohen në detaje në publikimet e ardhshme. Këtu do të them disa fjalë.

Ndërprisni MS-DOS është një lloj nënprogrami (pjesë e MS DOS), i cili qëndron përgjithmonë në memorie dhe mund të thirret në çdo kohë nga çdo program.

Konsideroni sa më sipër me një shembull (theksoni shënimet me shkronja të vogla):

Program për mbledhjen e dy numrave

HomeProgramet

A=5 në variablin A vendosim vlerën 5

B=8 në vlerën 8 të ndryshores B

Mbledhja e thirrjes në nënprogram

tani C është 13

A=10 të njëjtat, vetëm numra të ndryshëm

B=25

Mbledhja e thirrjes në nënprogram

tani C është 35

Fundi i Programit

Mbledhja e nënprogramit

C=A+B

Kthimi Nga nënprogrami kthehemi në vendin prej nga thirrëm

Fundi i nënprogramit

Në këtë shembull, ne thirrëm nënprogramin dy herë Shtimi, i cili shtoi dy numra që i kaluan në variabla A dhe B . Rezultati vendoset në variablin C. Kur thirret një nënprogram, kompjuteri kujton se nga është thirrur dhe më pas kur nënprogrami ka përfunduar, kompjuteri kthehet në vendin nga ku është thirrur. Se. Ju mund të telefononi nënprograme një numër të pacaktuar herë nga kudo.

Gjatë ekzekutimit të linjës (8) të një programi asembler, ne quajmë një nënprogram (në këtë rast quhet ndërprerje) që printon linjën në ekran. Për ta bërë këtë, ne, në fakt, vendosim vlerat e nevojshme në regjistra. E gjithë puna e nevojshme (dalja e linjës, lëvizja e kursorit) kryhet nga nënprogrami. Ky rresht mund të lexohet kështu: ne e quajmë ndërprerjen e njëzet e një ( int nga anglishtja. ndërpres ndërpres). Ju lutemi vini re se pas numrit 21 ka një letër h . Ky, siç e dimë tashmë, është një numër heksadecimal (33 në dhjetor). Sigurisht, asgjë nuk na pengon të zëvendësojmë linjën nga 21 orë deri në 33. Programi do të funksionojë si duhet. Thjesht, në Assembler është zakon të tregohet numri i ndërprerjes në heksadecimal.

Në rreshtin (10) ne, e keni marrë me mend, telefonojmë ndërprerjen 20 h . Për të thirrur këtë ndërprerje, nuk keni nevojë të specifikoni ndonjë vlerë në regjistra. Kryen vetëm një detyrë: daljen nga programi (dalja në DOS). Si rezultat i ndërprerjes 20h, programi do të kthehet në vendin ku është nisur (ngarkuar, thirrur). Për shembull, në Norton Commander ose DOS Navigator.

Rreshti (12) përmban mesazhin që do të dalë. Fjala e pare ( mesazh mesazh) emri i mesazhit. Mund të jetë çdo gjë (për shembull, rrëmujë ose varg, etj.). O kushtojini vëmendje rreshtit (7), në të cilin ngarkojmë në regjistër DX adresën tonë të mesazhit.

Mund të krijojmë një linjë tjetër, të cilën do ta quajmë rrëmujë2. Pastaj, duke filluar nga rreshti (9), futni komandat e mëposhtme:

(10) mov dx, offset Mess2

(13) Mesazhi db "Përshëndetje, botë!$"

(14) Mess2 db "Jam unë! $"

dhe mbledhim programin tonë përsëri. Shpresoj ta merrni me mend se çfarë do të ndodhë

Kushtojini vëmendje karakterit të fundit në rreshta Mesazhi dhe Mess2 - $. Ai tregon në fund të rreshtit. Nëse e heqim, atëherë 21 h ndërprerja do të vazhdojë të dalë derisa një karakter të ndeshet diku në memorie $. Në ekran do të shohim plehra .

Nëse keni një korrigjues, mund të shihni se si do të funksionojë programi ynë.

Qëllimi i kësaj çështjeje nuk ishte për të kuptuar në detaje me secilin operator. Kjo është e pamundur, sepse nuk keni ende njohuri të mjaftueshme. Besoj se pas 3-4 publikimeve do të kuptoni parimin dhe strukturën e programit në Assembler. Ndoshta keni menduar se gjuha e asamblesë është jashtëzakonisht e ndërlikuar, por më besoni, me një shikim.

Tabela 2.4. Sistemi i kodimit heksadecimal
Sistemi dhjetor sistemi heksadecimal Sistemi dhjetor sistemi heksadecimal
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)

Për të kthyer një numër heksadecimal në dhjetor, është e nevojshme të shumëzoni vlerën e shifrës më pak të rëndësishme (zero) me një, vlerën e shifrës tjetër (të parë) me 16, shifrën e dytë me 256 (16 2), etj. , dhe më pas shtoni të gjitha produktet. Për shembull, merrni numrin A17F:

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

Tabela 2.5. Sistemi i kodimit 8-ar
Sistemi dhjetor Sistemi 8-ar Sistemi dhjetor Sistemi 8-ar
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)

Por çdo specialist i pajisjeve dixhitale (projektues, operator, riparues, programues, etj.) duhet të mësojë se si të merret me sistemet heksadecimal dhe binar aq lirshëm sa me dhjetorin e zakonshëm, në mënyrë që të mos kërkohen transferime nga sistemi në sistem.

Shumë më rrallë se heksadecimal, përdoret kodimi oktal, i cili është ndërtuar në të njëjtin parim si heksadecimal, por shifrat binare ndahen në grupe me tre shifra. Çdo grup (shifra e kodit) më pas caktohet nga një karakter. Çdo shifër e kodit 8-shifror mund të marrë tetë vlera: 0, 1, 2, 3, 4, 5, 6, 7 (Tabela 2.5).

Përveç kodeve të konsideruara, ekziston edhe i ashtuquajturi paraqitje binare-decimal i numrave. Ashtu si në kodin heksadecimal, në kodin binar-decimal, secila shifër e kodit korrespondon me katër shifra binare, megjithatë, çdo grup prej katër shifrash binare mund të marrë jo gjashtëmbëdhjetë, por vetëm dhjetë vlera, të koduara nga simbolet 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Kjo do të thotë, një vend dhjetor korrespondon me katër binar. Si rezultat, rezulton se shkrimi i numrave në kodin binar-decimal nuk ndryshon nga shkrimi në një kod dhjetor të rregullt (Tabela 2.6), por në realitet ky është vetëm një kod binar i veçantë, secila shifër e të cilit mund të marrë vetëm dy vlera : 0 dhe 1. BCD ndonjëherë është shumë i dobishëm për organizimin e ekraneve numerike dhjetore dhe tabelave të rezultateve.

Tabela 2.6. Sistemi i kodimit dhjetor binar
Sistemi dhjetor Binar dhjetor Sistemi dhjetor Binar dhjetor
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ë kodin binar, çdo veprim aritmetik mund të kryhet në numra: mbledhje, zbritje, shumëzim, pjesëtim.

Konsideroni, për shembull, mbledhjen e dy numrave binarë 4-bit. Le të shtojmë numrin 0111 (dhjetorja 7) dhe 1011 (dhjetëshja 11). Shtimi i këtyre numrave nuk është më i vështirë se shënimi dhjetor:

Shtimi i 0 dhe 0 ju jep 0, duke shtuar 1 dhe 0 ju jepet 1, duke shtuar 1 dhe 1 ju jepet 0, dhe bartja është 1. Rezultati është 10010 (dhjetore 18). Kur shtoni çdo dy numra binarë n-bit, mund të merrni një numër n-bit ose (n + 1) -bit.

Zbritja bëhet në të njëjtën mënyrë. Le të zbritet numri 0111 (7) nga numri 10010 (18). Ne i shkruajmë numrat të rreshtuar në shifrën më pak të rëndësishme dhe i zbresim në të njëjtën mënyrë si në rastin e sistemit dhjetor:

Zbritja 0 nga 0 jep 0, duke zbritur 0 nga 1 jep 1, duke zbritur 1 nga 1 jep 0, duke zbritur 1 nga 0 jep 1 dhe duke huazuar 1 në shifrën tjetër. Rezultati është 1011 (dhjetorja 11).

Kur zbritni, është e mundur të merren numra negativë, kështu që duhet të përdorni paraqitje binare numrat negativë.

Për të përfaqësuar njëkohësisht numrat binar pozitivë dhe binar negativë, të ashtuquajturat kod shtesë. Numrat negativë në këtë kod shprehen me një numër që, kur i shtohet një numri pozitiv me të njëjtën madhësi, do të rezultojë në zero. Për të marrë një numër negativ, duhet të ndryshoni të gjithë bitat e të njëjtit numër pozitiv në të kundërtën (0 në 1, 1 në 0) dhe rezultatit t'i shtoni 1. Për shembull, le të shkruajmë numrin -5. Numri 5 në kodin binar duket si 0101. Zëvendësojmë bitet me ato të kundërta: 1010 dhe shtojmë një: 1011. Përmbledhim rezultatin me numrin origjinal: 1011 + 0101 = 0000 (e shpërfillim transferimin në bitin e pestë).

moduli 2 dy numra binarë 0111 dhe 1011:

Operacione të tjera bitwise në numrat binarë përfshijnë funksionin AND dhe funksionin OR. Funksioni AND rezulton në një vetëm kur bitet përkatëse të dy numrave origjinalë janë të dy një, përndryshe rezultati është -0. Funksioni OR rezulton në një kur të paktën një nga bitet përkatëse të numrave origjinal është 1, përndryshe rezultati është 0.

Për të shkruar programe në asembler, duhet të kuptoni sistemin e numrave heksadecimal. Nuk ka asgjë të komplikuar në të. Ne përdorim sistemin dhjetor në jetën tonë. Jam i sigurt që e dini të gjithë, kështu që do të përpiqem të shpjegoj sistemin heksadecimal me analogji me dhjetore.

Pra, në sistemin dhjetor, nëse i shtojmë zero në të djathtë të çdo numri, atëherë ky numër do të rritet me 10 herë. Për shembull: 1 x 10 = 10; 10 x 10 = 100; 100 x 10 = 1000 etj. Në këtë sistem, ne përdorim numrat nga 0 në 9, d.m.th. dhjetë shifra të ndryshme (në fakt, kjo është arsyeja pse quhet dhjetore).

Në sistemin heksadecimal, ne përdorim, përkatësisht, gjashtëmbëdhjetë "shifra". Konkretisht fjalën “numrat” e kam shkruar në thonjëza, sepse ai përdor më shumë sesa thjesht numra. Dhe si është në të vërtetë? Unë shpjegoj: nga 0 në 9 numërojmë njësoj si në dhjetore, por atëherë do të jetë kështu: A, B, C, D, E, F. Numri F, sado i vështirë të jetë numëro, do të jetë e barabartë me 15 në sistemin dhjetor (shih tabelën 1).

Numri dhjetor

Numri heksadecimal

Tabela 1. Sistemet dhjetore dhe heksadecimale.

Kështu, nëse i shtojmë zero në të djathtë çdo numri në sistemin heksadecimal, atëherë ky numër do të rritet në16 një herë.

Shembulli 1: 1 x 16 = 10; 10 x 16 = 100; 100 x 16 = 1000 etj.

A keni mundur të dalloni heksadecimalin nga dhjetori në shembullin 1? Dhe nga ky rresht: 10, 12, 45, 64, 12, 8, 19? Mund të jetë ose heksadecimal ose dhjetor. Për të shmangur konfuzionin dhe kompjuteri mund të dallojë pa mëdyshje një numër nga një tjetër, është e zakonshme në Assembler të vendoset karakteri h ose H pas numrit heksadecimal ( H është shkurt për anglisht. heksadecimal (heksadecimal). Shkurtimisht, ndonjëherë quhet thjesht heks ) . Dhe pas dhjetorit, mos vendosni asgjë. Sepse numrat nga 0 në 9 në të dy sistemet kanë të njëjtin kuptim, atëherë numrat e shkruar si 5 dhe 5h janë të njëjtë.

Se. Shembulli 1 (shih më lart) do të ishte më i saktë të shkruhet si më poshtë: 1 x 16 = 10h; 10h x 16 = 100h; 100h x 16 = 1000h. Ose si kjo: 1h x 10h = 10h; 10h x 10h = 100h; 100h x 10h = 1000h.

Pse nevojitet sistemi heksadecimal, do ta shqyrtojmë në çështjet vijuese. Tani për tani, për programin tonë të mostrës, i cili do të diskutohet më poshtë, duhet të dimë për ekzistencën e numrave heksadecimal.

Pra, le ta përmbledhim atë. Sistemi heksadecimal i numrave përbëhet nga 10 shifra (nga 0 në 9) dhe 6 shkronja të alfabetit latin (A, B, C, D, E, F). Nëse shtojmë zero në të djathtë të çdo numri në sistemin heksadecimal, atëherë ky numër do të rritet me16 një herë. Është shumë e rëndësishme të kuptohet kjo temë., pasi do ta përdorim vazhdimisht kur shkruajmë programe.

Tani pak për mënyrën se si do të ndërtoj shembuj në asembler. Nuk është shumë i përshtatshëm për t'i paraqitur ato në format HTML, kështu që së pari do të jetë vetë kodi i programit me rreshta të numëruar, dhe menjëherë pas tij do të ketë shpjegime dhe shënime.

Pak a shumë si kjo:

linjat Kodi i programit
(1) mov ah, 9

Shpjegimet:

Në rreshtin (1) bëjmë diçka, dhe në rreshtin (15) bëjmë diçka.

Kërkesë e madhe: MOS kopjoni programe nga faqja në clipboard dhe më pas ngjitini ato në Notepad (ose kudo tjetër)! Shkruani ato me dorë në një redaktues teksti. Nëse ka një printer, atëherë zgjidhni programin, printoni fragmentin e zgjedhur dhe më pas transferojeni te redaktori nga letra. Të gjithë shembujt duhet të shtypen vetë! Kjo do të përshpejtojë memorizimin e operatorëve.

Dhe më tej. Shkronjat e vogla dhe të mëdha nuk dallohen në Assembler. Regjistrime si:

Asambleri perceptohet në mënyrë të barabartë. Natyrisht, mund ta detyroni assembler-in të bëjë dallimin midis shkronjave të vogla dhe UPPER, por ne nuk do ta bëjmë këtë për momentin. Për lexueshmërinë e programit, është më mirë të shkruani deklaratat me shkronja të vogla dhe të filloni emrat e nënprogrameve dhe etiketave me shkronja të mëdha. Por kështu do të jetë e përshtatshme për dikë.

Pra, le të kalojmë në programin tonë të parë:

(1) segment CSEG

(2) org 100h

(4) Fillimi:

(6) mov ah,9

(7) mov dx, offset Mesazh

(8) në 21h

(10) në 20h

(11)

(12) Mesazhi db "Përshëndetje, botë!$"

(13) CSEG përfundon

(14) fundFillimi

Për të shpjeguar të gjithë operatorët e këtij shembulli, do të na duhen disa episode. Prandaj, ne thjesht do të heqim përshkrimin e disa komandave në këtë fazë. Vetëm mendoni se kështu duhet të jetë. Në të ardhmen shumë të afërt do t'i shqyrtojmë në detaje këta operatorë. Pra, rreshtat me numrat (1), (2) dhe (13) thjesht i injoroni.

Rreshtat (3), (5), (9) dhe (11) lihen bosh. Kjo është bërë për qartësi. Asambleri thjesht do t'i heqë ato.

Tani le të kalojmë te pjesa tjetër e operatorëve. Nga rreshti (4) fillon kodi i programit. Ky është një etiketë që i thotë asemblerit të fillojë kodin. Rreshti (14) përmban deklaratat në fund Fillimi ( Filloni anglisht Fillimi; fund fund). Ky është fundi i programit. Në përgjithësi, në vend të fjalës Filloni mund të ishte përdorur diçka tjetër. Për shembull, Fillimi:. Në këtë rast, ne do të duhet të plotësojmë programin Fund Fillimi (14).

Rreshtat (6) (8) shfaqin mesazhin Përshëndetje, botë!. Këtu duhet të flasim shkurtimisht për regjistrat e procesorëve (këtë temë do ta shqyrtojmë më në detaje në numrin vijues).

Regjistri i procesorit është një memorie e dedikuar për ruajtjen e një numri.

Për shembull:

Nëse duam të mbledhim dy numra, atëherë në matematikë shkruajmë kështu:

A, B dhe C janë një lloj regjistrash (nëse flasim për kompjuter) në të cilët mund të ruhen disa të dhëna. A=5 mund të lexohet si: Cakto A-së numrin 5 .

Për t'i caktuar një vlerë një regjistri, ekziston një operator mov në Assembler (nga anglishtja move load). Rreshti (6) duhet të lexohet si ky: Ngarkimi në regjistër AHnumri 9 (me fjalë të tjera, ne caktojmë AHnumri 9). Më poshtë do të shqyrtojmë pse kjo është e nevojshme.

Në rreshtin (7) ne ngarkojmë në regjistër DX adresa e mesazhit që do të dalë (në këtë shembull do të jetë varguPërshëndetje, botë! $).

Ndërprerjet do të trajtohen në detaje në publikimet e ardhshme. Këtu do të them disa fjalë.

Ndërprisni MS-DOS është një lloj nënprogrami (pjesë e MS DOS), i cili qëndron përgjithmonë në memorie dhe mund të thirret në çdo kohë nga çdo program.

Konsideroni sa më sipër me një shembull (theksoni shënimet me shkronja të vogla):

Program për mbledhjen e dy numrave

HomeProgramet

A=5 në variablin A vendosim vlerën 5

B=8 në vlerën 8 të ndryshores B

Mbledhja e thirrjes në nënprogram

tani C është 13

A=10 të njëjtat, vetëm numra të ndryshëm

B=25

Mbledhja e thirrjes në nënprogram

tani C është 35

Fundi i Programit

Mbledhja e nënprogramit

C=A+B

Kthimi Nga nënprogrami kthehemi në vendin prej nga thirrëm

Fundi i nënprogramit

Në këtë shembull, ne thirrëm nënprogramin dy herë Shtimi, i cili shtoi dy numra që i kaluan në variabla A dhe B . Rezultati vendoset në variablin C. Kur thirret një nënprogram, kompjuteri kujton se nga është thirrur dhe më pas kur nënprogrami ka përfunduar, kompjuteri kthehet në vendin nga ku është thirrur. Se. Ju mund të telefononi nënprograme një numër të pacaktuar herë nga kudo.

Gjatë ekzekutimit të linjës (8) të një programi asembler, ne quajmë një nënprogram (në këtë rast quhet ndërprerje) që printon linjën në ekran. Për ta bërë këtë, ne, në fakt, vendosim vlerat e nevojshme në regjistra. E gjithë puna e nevojshme (dalja e linjës, lëvizja e kursorit) kryhet nga nënprogrami. Ky rresht mund të lexohet kështu: ne e quajmë ndërprerjen e njëzet e një ( int nga anglishtja. ndërpres ndërpres). Ju lutemi vini re se pas numrit 21 ka një letër h . Ky, siç e dimë tashmë, është një numër heksadecimal (33 në dhjetor). Sigurisht, asgjë nuk na pengon të zëvendësojmë linjën nga 21 orë deri në 33. Programi do të funksionojë si duhet. Thjesht, në Assembler është zakon të tregohet numri i ndërprerjes në heksadecimal.

Në rreshtin (10) ne, e keni marrë me mend, telefonojmë ndërprerjen 20 h . Për të thirrur këtë ndërprerje, nuk keni nevojë të specifikoni ndonjë vlerë në regjistra. Kryen vetëm një detyrë: daljen nga programi (dalja në DOS). Si rezultat i ndërprerjes 20h, programi do të kthehet në vendin ku është nisur (ngarkuar, thirrur). Për shembull, në Norton Commander ose DOS Navigator.

Rreshti (12) përmban mesazhin që do të dalë. Fjala e pare ( mesazh mesazh) emri i mesazhit. Mund të jetë çdo gjë (për shembull, rrëmujë ose varg, etj.). O kushtojini vëmendje rreshtit (7), në të cilin ngarkojmë në regjistër DX adresën tonë të mesazhit.

Mund të krijojmë një linjë tjetër, të cilën do ta quajmë rrëmujë2. Pastaj, duke filluar nga rreshti (9), futni komandat e mëposhtme:

(10) mov dx, offset Mess2

(13) Mesazhi db "Përshëndetje, botë!$"

(14) Mess2 db "Jam unë! $"

dhe mbledhim programin tonë përsëri. Shpresoj ta merrni me mend se çfarë do të ndodhë

Kushtojini vëmendje karakterit të fundit në rreshta Mesazhi dhe Mess2 - $. Ai tregon në fund të rreshtit. Nëse e heqim, atëherë 21 h ndërprerja do të vazhdojë të dalë derisa një karakter të ndeshet diku në memorie $. Në ekran do të shohim plehra .

Nëse keni një korrigjues, mund të shihni se si do të funksionojë programi ynë.

Qëllimi i kësaj çështjeje nuk ishte për të kuptuar në detaje me secilin operator. Kjo është e pamundur, sepse nuk keni ende njohuri të mjaftueshme. Besoj se pas 3-4 publikimeve do të kuptoni parimin dhe strukturën e programit në Assembler. Ndoshta keni menduar se gjuha e asamblesë është jashtëzakonisht e ndërlikuar, por më besoni, me një shikim.

Shënimi heksadecimal ("Hex")është një mënyrë e përshtatshme për të paraqitur vlerat binare. Ashtu si dhjetori ka bazën dhjetë dhe binari ka bazën dy, heksadecimal ka bazën gjashtëmbëdhjetë.

Sistemi i numrave bazë 16 përdor numrat nga 0 deri në 9 dhe shkronjat A deri në F. Figura tregon vlerat ekuivalente dhjetore, binare dhe heksadecimal për numrat binar 0000 deri në 1111. Është më e lehtë për ne të shprehim një vlerë si një shifër e vetme heksadecimal se sa katër bit.

Kuptimi i bajteve

Duke marrë parasysh që 8 bit (bajt) është një grupim standard binar, numrat binarë nga 00000000 deri në 11111111 mund të përfaqësohen në shënimin heksadecimal si numra nga 00 në FF. Zerat kryesore shfaqen gjithmonë për të përfunduar paraqitjen 8-bit. Për shembull, vlera binare 0000 1010 do të ishte 0A në heksadecimal.

Përfaqësimi i vlerave heksadecimal

Shënim:Është e rëndësishme të dallohen vlerat heksadecimal nga vlerat dhjetore për karakteret 0 deri në 9, siç tregohet në figurë.

Vlerat heksadecimal zakonisht përfaqësohen në tekst me një vlerë të paraprirë nga 0x (p.sh. 0x73) ose nga një nënshkrim 16. Më rrallë, ato mund të pasohen nga shkronja H, si p.sh. 73H. Megjithatë, për shkak se teksti i nënshkrimit nuk njihet në vijën e komandës ose në mjediset e programimit, numrat heksadecimal teknikisht paraprihen nga "0x" (zero X). Prandaj, shembujt e mësipërm do të tregohen përkatësisht si 0x0A dhe 0x73.

Shënimi heksadecimal përdoret për të përfaqësuar adresat MAC të Ethernetit dhe adresat IP të Versionit 6.

Konvertimet heksadecimal

Konvertimet e numrave midis vlerave dhjetore dhe heksadecimale janë të lehta, por një pjesëtim ose shumëzim i shpejtë me 16 nuk është gjithmonë i përshtatshëm. Nëse nevojiten konvertime të tilla, zakonisht është më e lehtë të konvertosh vlerën dhjetore ose heksadecimal në binar, dhe më pas të konvertosh vlerën binare në dhjetore ose heksadecimal, cilado që dëshiron të marrësh.

Me praktikë, është e mundur të njihen modelet e biteve binare që korrespondojnë me vlerat dhjetore dhe heksadecimal. Figura tregon këto modele për disa vlera 8-bitësh.

Artikujt kryesorë të lidhur