1 sa hexadecimal number system. Para saan ang hexadecimal number system?

Hexadecimal na sistema ng numero. ang aming unang programa.

Upang magsulat ng mga programa sa Assembly, kailangan mong maunawaan ang hexadecimal number system. Walang kumplikado tungkol dito. Ginagamit natin ang decimal system sa buhay. Sigurado akong alam mo lahat, kaya susubukan kong ipaliwanag ang hexadecimal system gamit ang isang pagkakatulad sa decimal system.

Kaya, sa sistema ng decimal, kung magdaragdag tayo ng zero sa anumang numero sa kanan, ang bilang na ito ay tataas ng 10 beses. Halimbawa: 1 x 10 = 10; 10 x 10 = 100; 100 x 10 = 1000, atbp. Sa sistemang ito ginagamit namin ang mga numero mula 0 hanggang 9, i.e. sampung iba't ibang mga numero (sa katunayan, kaya tinatawag itong decimal).

Sa hexadecimal system, ginagamit namin ang labing-anim na "digit". Partikular kong isinulat ang salitang "digit" sa mga panipi, dahil... Hindi lang numero ang ginagamit nito. At talagang, paano iyon? Hayaan akong ipaliwanag: mula 0 hanggang 9 ay binibilang namin sa parehong paraan tulad ng sa decimal, ngunit pagkatapos ay magiging ganito: A, B, C, D, E, F. Ang numero F ay hindi mahirap bilang, ito ay magiging katumbas ng 15 sa decimal system (tingnan ang Talahanayan 1).

Desimal na numero

Hexadecimal na numero

Talahanayan 1. Decimal at hexadecimal system.

Kaya, kung magdaragdag tayo ng zero sa kanan ng anumang numero sa hexadecimal system, ang bilang na ito ay tataas ng16 minsan.

Halimbawa 1: 1 x 16 = 10; 10 x 16 = 100; 100 x 16 = 1000, atbp.

Nagawa mo bang makilala ang mga hexadecimal na numero mula sa mga decimal na numero sa Halimbawa 1? At mula sa seryeng ito: 10, 12, 45, 64, 12, 8, 19? Ang mga ito ay maaaring alinman sa hexadecimal o decimal. Upang maiwasan ang pagkalito at ang computer upang malinaw na makilala ang isang numero mula sa isa pa, sa assembler ay kaugalian na ilagay ang simbolo na h o H pagkatapos ng isang hexadecimal na numero ( Ang H ay abbreviation para sa English. hexadecimal (hexadecimal). Para sa maikli, kung minsan ito ay tinatawag na simple Hex ) . At huwag maglagay ng anuman pagkatapos ng decimal. kasi Ang mga numero mula 0 hanggang 9 sa parehong mga sistema ay may parehong kahulugan, pagkatapos ay ang mga numerong nakasulat bilang 5 at 5h ay pareho.

yun. Halimbawa 1 (tingnan sa itaas) ay mas tama kung isulat ang ganito: 1 x 16 = 10h; 10h x 16 = 100h; 100h x 16 = 1000h. O tulad nito: 1h x 10h = 10h; 10h x 10h = 100h; 100h x 10h = 1000h.

Titingnan natin kung bakit kailangan ang hexadecimal system sa mga susunod na isyu. Sa ngayon, para sa aming halimbawang programa, na tatalakayin sa ibaba, kailangan nating malaman ang tungkol sa pagkakaroon ng mga numerong hexadecimal.

Kaya, sabihin summarize. Ang sistema ng hexadecimal na numero ay binubuo ng 10 digit (mula 0 hanggang 9) at 6 na titik ng alpabetong Latin (A, B, C, D, E, F). Kung magdaragdag tayo ng zero sa kanan ng anumang numero sa hexadecimal system, ang bilang na ito ay tataas ng16 minsan. Napakahalagang maunawaan ang paksang ito, dahil palagi naming gagamitin ito kapag nagsusulat ng mga programa.

Ngayon ng kaunti tungkol sa kung paano ako bubuo ng mga halimbawa sa Assembly. Ito ay hindi lubos na maginhawa upang ipakita ang mga ito sa HTML na format, kaya unang magkakaroon ng program code mismo na may mga numerong linya, at kaagad pagkatapos nito ay magkakaroon ng mga paliwanag at tala.

Tulad niyan:

mga linya Code ng programa
(1) mov ah,9

Mga Paliwanag:

Sa linya (1) ginagawa namin ito, at sa linya (15) ginagawa namin iyon.

Malaking kahilingan: HUWAG kopyahin ang mga programa mula sa isang pahina patungo sa clipboard at pagkatapos ay i-paste ang mga ito sa Notepad (o kahit saan pa)! I-type muli ang mga ito nang manu-mano sa isang text editor. Kung mayroon kang printer, pagkatapos ay piliin ang programa, i-print ang napiling fragment, at pagkatapos ay ilipat ito sa editor mula sa papel. Ang lahat ng mga halimbawa ay dapat i-type sa iyong sarili! Mapapabilis nito ang pagsasaulo ng mga operator.

At higit pa. Walang pagkakaiba sa pagitan ng lowercase at UPPERCASE na mga titik sa assembler. Mga tala ng form:

Ang assembler perceives ang mga ito sa parehong paraan. Maaari mong, siyempre, pilitin ang assembler na makilala sa pagitan ng lowercase at UPPERCASE na mga character, ngunit hindi namin ito gagawin sa ngayon. Upang gawing mas madaling basahin ang programa, pinakamahusay na mag-type ng mga operator sa maliliit na titik, at simulan ang mga pangalan ng mga subroutine at label sa malalaking titik. Ngunit ito ay depende sa kung sino ang magiging komportable.

Kaya, lumipat tayo sa aming unang programa:

(1) Segment ng CSEG

(2)org 100h

(4) Magsimula:

(6) mov ah,9

(7) mov dx,offset na Mensahe

(8) sa loob ng 21h

(10) sa loob ng 20h

(11)

(12) Mensahe db "Hello, world!$"

(13)Nagtatapos ang CSEG

(14) wakas Magsimula

Upang maipaliwanag ang lahat ng mga operator sa halimbawang ito, kakailanganin namin ng ilang mga edisyon. Samakatuwid, aalisin na lang natin ang paglalarawan ng ilang mga utos sa yugtong ito. Ipagpalagay na lang na ganito dapat. Titingnan namin ang mga operator na ito nang detalyado sa malapit na hinaharap. Kaya, ang mga linyang may numerong (1), (2) at (13) ay binabalewala mo lang.

Ang mga linya (3), (5), (9) at (11) ay iniwang blangko. Ginagawa ito para sa kalinawan. Aalisin lamang sila ng assembler.

Ngayon, magpatuloy tayo upang isaalang-alang ang natitirang mga operator. Ang program code ay nagsisimula sa linya (4). Ito ay isang marka na nagsasabi sa assembler sa simula ng code. Ang linya (14) ay naglalaman ng mga operator na nagtatapos Magsimula ( Simulan ang Ingles Simulan; wakas wakas). Ito ang pagtatapos ng programa. Sa pangkalahatan, sa halip na ang salita Magsimula ibang bagay sana ang ginamit. Halimbawa, Simula:. Sa kasong ito, kailangan nating tapusin ang programa Tapusin ang Simula (14).

Ang mga linya (6) (8) ay nagpapakita ng mensaheng Hello, world!. Dito kailangan nating pag-usapan nang maikli ang tungkol sa mga rehistro ng processor (titingnan natin ang paksang ito nang mas detalyado sa susunod na isyu).

Ang rehistro ng processor ay isang espesyal na inilaan na memorya para sa pag-iimbak ng isang numero.

Halimbawa:

Kung nais naming magdagdag ng dalawang numero, pagkatapos ay isulat namin ito sa matematika tulad nito:

A, B at C ito ay isang uri ng mga rehistro (kung pinag-uusapan natin ang tungkol sa isang computer) kung saan ang ilang data ay maaaring maimbak. Ang A=5 ay mababasa bilang: Italaga sa A ang bilang 5 .

Upang magtalaga ng isang rehistro ng isang halaga, mayroong isang mov operator sa Assembler (mula sa English move load). Ang linya (6) ay dapat basahin nang ganito: Naglo-load sa rehistro A.H.numero 9 (sa madaling salita, itinalaga namin A.H.numero 9). Sa ibaba ay titingnan natin kung bakit ito kinakailangan.

Sa linya (7) naglo-load kami sa rehistro DX address ng mensahe para sa output (sa halimbawang ito ito ang magiging stringKumusta, mundo!$).

Tatalakayin nang detalyado ang mga interrupt sa mga susunod na isyu. Dito ako magsasabi ng ilang salita.

Makagambala MS-DOS ito ay isang uri ng subroutine (bahagi MS-DOS), na permanenteng namamalagi sa memorya at maaaring tawagan anumang oras mula sa anumang programa.

Isaalang-alang natin ang nasa itaas gamit ang isang halimbawa (Mga tala sa maliit na pag-print):

Programa para sa pagdaragdag ng dalawang numero

Mga Programa sa Tahanan

A=5 Ipinasok namin ang halaga 5 sa variable A

B=8 sa variable B ang halaga 8

Pagdaragdag ng Mga Subroutine sa Pagtawag

ngayon C ay katumbas ng 13

A=10 parehong bagay, magkaibang numero lang

B=25

Pagdaragdag ng Mga Subroutine sa Pagtawag

ngayon ang C ay katumbas ng 35

Pagtatapos ng Programa

Subroutine na Pagdaragdag

C=A+B

ReturnFromSubroutine bumalik kami sa lugar kung saan kami tumawag

EndSubroutine

Sa halimbawang ito, dalawang beses naming tinawag ang subroutine Dagdag, na nagdagdag ng dalawang numero na ipinasa dito sa mga variable A at B . Ang resulta ay inilagay sa variable na C. Kapag tinawag ang isang subroutine, naaalala ng computer kung saan ito tinawag, at pagkatapos, kapag natapos nang tumakbo ang subroutine, babalik ang computer sa lugar kung saan ito tinawag. yun. Maaari mong tawagan ang mga subroutine sa hindi tiyak na bilang ng beses mula sa kahit saan.

Kapag nagpapatupad ng linya (8) ng isang programa ng Assembly, tinatawagan namin ang isang subroutine (sa kasong ito ay tinatawag na interrupt), na nagpapakita ng linya sa screen. Para sa layuning ito, kami, sa katunayan, ay naglalagay ng mga kinakailangang halaga sa mga rehistro. Ang lahat ng kinakailangang gawain (pag-output ng isang linya, paglipat ng cursor) ay kinuha ng subroutine. Ang linyang ito ay mababasa nang ganito: tawagan ang dalawampu't isang interrupt ( int mula sa Ingles humarang makagambala). Mangyaring tandaan na pagkatapos ng numero 21 ay may isang sulat h . Ito, tulad ng alam na natin, ay isang hexadecimal na numero (33 sa decimal). Siyempre, walang pumipigil sa amin na palitan ang linya int 21h hanggang int 33. Ang programa ay gagana nang tama. Karaniwang kasanayan lamang sa Assembler na ipahiwatig ang interrupt na numero sa hexadecimal.

Sa linya (10) kami, tulad ng nahulaan mo, tumawag sa interrupt 20 h . Upang tawagan ang interrupt na ito, hindi mo kailangang tukuyin ang anumang mga halaga sa mga rehistro. Gumagawa lamang ito ng isang gawain: paglabas sa programa (paglabas sa DOS). Bilang resulta ng pagsasagawa ng interrupt 20h, babalik ang programa sa kung saan ito inilunsad (na-load, tinawag). Halimbawa, sa Norton Commander o DOS Navigator.

Ang linya (12) ay naglalaman ng mensaheng ilalabas. Unang salita ( mensahe mensahe) pamagat ng mensahe. Maaari itong maging anuman (halimbawa, gulo o string, atbp.). TUNGKOL SA Bigyang-pansin ang linya (7), kung saan kami naglo-load sa rehistro DX ang address ng aming mensahe.

Maaari tayong lumikha ng isa pang linya, na tatawagin natin gulo2. Pagkatapos, simula sa linya (9), ipasok ang mga sumusunod na command:

(10) mov dx,offset Mess2

(13) Mensahe db "Hello, world!$"

(14) Mess2 db "Ako ito! $"

at muling buuin ang aming programa. Sana ay mahulaan mo kung ano ang mangyayari

Bigyang-pansin ang huling karakter sa mga linya Mensahe at Mess2 - $. Tinuro nito ang dulo ng linya. Kung aalisin natin ito, pagkatapos ay 21 h ang interrupt ay magpapatuloy sa pag-output hanggang sa makatagpo ito ng isang character sa isang lugar sa memorya $. Sa screen natin makikita basura .

Kung mayroon kang debugger, makikita mo kung paano gagana ang aming programa.

Ang layunin ng isyung ito ay hindi upang maunawaan nang detalyado sa bawat operator. Ito ay imposible, dahil wala ka pang sapat na kaalaman. Naniniwala ako na pagkatapos ng 3-4 na paglabas ay mauunawaan mo ang prinsipyo at istruktura ng isang programa ng Assembly. Marahil ang wika ng Assembly ay tila napakakumplikado para sa iyo, ngunit maniwala ka sa akin, ito ay sa unang tingin.

Ang resulta ay natanggap na!

Mga sistema ng numero

Mayroong positional at non-positional number system. Ang Arabic number system, na ginagamit natin sa pang-araw-araw na buhay, ay positional, ngunit ang Roman number system ay hindi. Sa mga positional number system, ang posisyon ng isang numero ay natatanging tinutukoy ang magnitude ng numero. Isaalang-alang natin ito gamit ang halimbawa ng numerong 6372 sa sistema ng decimal na numero. Bilangin natin ang numerong ito mula kanan pakaliwa simula sa zero:

Kung gayon ang numerong 6372 ay maaaring katawanin tulad ng sumusunod:

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

Tinutukoy ng numero 10 ang sistema ng numero (sa kasong ito ito ay 10). Ang mga halaga ng posisyon ng isang naibigay na numero ay kinuha bilang mga kapangyarihan.

Isaalang-alang ang totoong decimal na numero 1287.923. Bilangin natin ito simula sa zero na posisyon ng numero mula sa decimal point sa kaliwa at kanan:

Kung gayon ang numerong 1287.923 ay maaaring katawanin bilang:

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.

Sa pangkalahatan, ang formula ay maaaring kinakatawan bilang mga sumusunod:

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

kung saan ang C n ay isang integer sa posisyon n, D -k - fractional na numero sa posisyon (-k), s- sistema ng numero.

Ilang salita tungkol sa mga sistema ng numero Ang isang numero sa sistema ng decimal na numero ay binubuo ng maraming digit (0,1,2,3,4,5,6,7,8,9), sa sistema ng octal na binubuo ito ng maraming digit. (0,1, 2,3,4,5,6,7), sa binary number system - mula sa isang set ng mga digit (0,1), sa hexadecimal number system - mula sa isang set ng mga digit (0,1 ,2,3,4,5,6, 7,8,9,A,B,C,D,E,F), kung saan ang A,B,C,D,E,F ay tumutugma sa mga numerong 10,11, 12,13,14,15 Sa talahanayan Tab.1 numero ay ipinakita sa iba't ibang mga sistema ng numero.

Talahanayan 1
Notasyon
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

Pag-convert ng mga numero mula sa isang sistema ng numero patungo sa isa pa

Upang i-convert ang mga numero mula sa isang sistema ng numero patungo sa isa pa, ang pinakamadaling paraan ay ang unang i-convert ang numero sa sistema ng decimal na numero, at pagkatapos ay i-convert mula sa sistema ng decimal na numero sa kinakailangang sistema ng numero.

Pag-convert ng mga numero mula sa anumang sistema ng numero patungo sa sistema ng decimal na numero

Gamit ang formula (1), maaari mong i-convert ang mga numero mula sa anumang sistema ng numero patungo sa sistema ng decimal na numero.

Halimbawa 1. I-convert ang numerong 1011101.001 mula sa binary number system (SS) sa decimal SS. Solusyon:

1 ·2 6 +0 ·2 5 + 1 ·2 4 + 1 ·2 3 + 1 ·2 2 + 0 ·2 1 + 1 ·20 + 0 ·2 -1 + 0 ·2 -2 + 1 ·2 -3 =64+16+8+4+1+1/8=93.125

Halimbawa2. I-convert ang numerong 1011101.001 mula sa octal number system (SS) sa decimal SS. Solusyon:

Halimbawa 3 . I-convert ang numerong AB572.CDF mula sa hexadecimal number system sa decimal SS. Solusyon:

Dito A-pinalitan ng 10, B- sa 11, C- sa 12, F- sa pamamagitan ng 15.

Pag-convert ng mga numero mula sa sistema ng decimal na numero patungo sa isa pang sistema ng numero

Upang i-convert ang mga numero mula sa sistema ng decimal na numero patungo sa isa pang sistema ng numero, kailangan mong i-convert ang integer na bahagi ng numero at ang fractional na bahagi ng numero nang hiwalay.

Ang integer na bahagi ng isang numero ay kino-convert mula sa decimal SS patungo sa isa pang sistema ng numero sa pamamagitan ng sunud-sunod na paghahati ng integer na bahagi ng numero sa base ng sistema ng numero (para sa binary SS - ng 2, para sa 8-ary SS - ng 8, para sa 16 -ary SS - sa pamamagitan ng 16, atbp. ) hanggang sa makuha ang isang buong nalalabi, mas mababa sa base CC.

Halimbawa 4 . I-convert natin ang numerong 159 mula sa decimal SS sa binary 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

Tulad ng makikita mula sa Fig. 1, ang bilang na 159 kapag hinati sa 2 ay nagbibigay ng kusyente 79 at natitira 1. Dagdag pa, ang bilang na 79 kapag hinati sa 2 ay nagbibigay ng kusyente 39 at natitirang 1, atbp. Bilang resulta, ang pagbuo ng isang numero mula sa mga natitira sa dibisyon (mula kanan pakaliwa), nakakuha kami ng isang numero sa binary SS: 10011111 . Kaya't maaari tayong sumulat:

159 10 =10011111 2 .

Halimbawa 5 . I-convert natin ang numerong 615 mula sa decimal SS sa octal SS.

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

Kapag nagko-convert ng isang numero mula sa isang decimal SS sa isang octal SS, kailangan mong sunud-sunod na hatiin ang numero sa pamamagitan ng 8 hanggang sa makakuha ka ng isang integer na natitira na mas mababa sa 8. Bilang resulta, ang pagbuo ng isang numero mula sa mga natitirang dibisyon (mula kanan pakaliwa) ay nakukuha namin isang numero sa octal SS: 1147 (tingnan ang Fig. 2). Kaya't maaari tayong sumulat:

615 10 =1147 8 .

Halimbawa 6 . I-convert natin ang numerong 19673 mula sa sistema ng decimal na numero sa hexadecimal SS.

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

Tulad ng makikita mula sa Figure 3, sa pamamagitan ng sunud-sunod na paghahati ng numerong 19673 sa 16, ang mga natitira ay 4, 12, 13, 9. Sa sistema ng numerong hexadecimal, ang numero 12 ay tumutugma sa C, ang numerong 13 hanggang D. Samakatuwid, ang ating ang hexadecimal na numero ay 4CD9.

Upang i-convert ang mga regular na decimal fraction (isang tunay na numero na may zero integer na bahagi) sa isang sistema ng numero na may base s, kinakailangang sunud-sunod na i-multiply ang numerong ito sa s hanggang sa ang fractional na bahagi ay naglalaman ng purong zero, o makuha namin ang kinakailangang bilang ng mga digit . Kung, sa panahon ng pagpaparami, ang isang numero na may bahaging integer maliban sa zero ay nakuha, kung gayon ang bahaging ito ng integer ay hindi isinasaalang-alang (sila ay sunud-sunod na kasama sa resulta).

Tingnan natin ang nasa itaas na may mga halimbawa.

Halimbawa 7 . I-convert natin ang numerong 0.214 mula sa decimal number system sa binary 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

Tulad ng makikita mula sa Fig. 4, ang bilang na 0.214 ay sunud-sunod na pinarami ng 2. Kung ang resulta ng multiplikasyon ay isang numero na may bahaging integer maliban sa zero, kung gayon ang bahagi ng integer ay nakasulat nang hiwalay (sa kaliwa ng numero), at ang numero ay nakasulat na may zero integer na bahagi. Kung ang multiplikasyon ay nagreresulta sa isang numero na may zero integer na bahagi, pagkatapos ay isang zero ang nakasulat sa kaliwa nito. Ang proseso ng multiplikasyon ay nagpapatuloy hanggang ang fractional na bahagi ay umabot sa purong zero o makuha namin ang kinakailangang bilang ng mga digit. Ang pagsusulat ng mga bold na numero (Larawan 4) mula sa itaas hanggang sa ibaba ay nakukuha natin ang kinakailangang numero sa binary number system: 0. 0011011 .

Kaya't maaari tayong sumulat:

0.214 10 =0.0011011 2 .

Halimbawa 8 . I-convert natin ang numerong 0.125 mula sa decimal number system sa binary SS.

0.125
x 2
0 0.25
x 2
0 0.5
x 2
1 0.0

Upang i-convert ang numerong 0.125 mula sa decimal SS patungo sa binary, ang numerong ito ay sunud-sunod na pinarami ng 2. Sa ikatlong yugto, ang resulta ay 0. Dahil dito, ang sumusunod na resulta ay nakuha:

0.125 10 =0.001 2 .

Halimbawa 9 . I-convert natin ang numerong 0.214 mula sa sistema ng decimal na numero sa hexadecimal 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

Kasunod ng mga halimbawa 4 at 5, nakukuha namin ang mga numero 3, 6, 12, 8, 11, 4. Ngunit sa hexadecimal SS, ang mga numero 12 at 11 ay tumutugma sa mga numero C at B. Samakatuwid, mayroon kaming:

0.214 10 =0.36C8B4 16 .

Halimbawa 10 . I-convert natin ang numerong 0.512 mula sa decimal number system sa octal 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

Nakakuha:

0.512 10 =0.406111 8 .

Halimbawa 11 . I-convert natin ang numerong 159.125 mula sa decimal number system sa binary SS. Para magawa ito, hiwalay naming isinasalin ang integer na bahagi ng numero (Halimbawa 4) at ang fractional na bahagi ng numero (Halimbawa 8). Ang karagdagang pagsasama-sama ng mga resultang ito ay nakukuha namin:

159.125 10 =10011111.001 2 .

Halimbawa 12 . I-convert natin ang numerong 19673.214 mula sa decimal number system sa hexadecimal SS. Para magawa ito, hiwalay naming isinasalin ang integer na bahagi ng numero (Halimbawa 6) at ang fractional na bahagi ng numero (Halimbawa 9). Dagdag pa, ang pagsasama-sama ng mga resultang ito ay nakuha namin.

Ang sistema ng hexadecimal na numero ay may alpabeto na binubuo ng 16 na numero:

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

Kapag nagsusulat ng isang numero sa hexadecimal system, ang mga letrang A, B, C, D, E, F ay ginagamit ayon sa pagkakabanggit upang isulat ang mga digit na nagsasaad ng mga numero 10, 11, 12. 13, 14. 15.

Pag-convert ng mga numero mula hexadecimal hanggang decimal

Maaari mong i-convert ang anumang hexadecimal na numero sa decimal gamit ang alam nang formula

Mga halimbawa.

    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.

Ang pag-convert ng isang numero mula sa decimal system sa hexadecimal ay isinasagawa sa parehong paraan tulad ng sa binary.

Pag-convert ng mga numero mula sa hexadecimal sa binary at vice versa

Maaari mong i-convert ang anumang hexadecimal na numero sa binary gaya ng mga sumusunod. Ang bawat digit ng isang hexadecimal na numero ay isinusulat bilang isang apat na digit na binary na numero - kuwaderno. Pagkatapos nito, ang mga zero sa kaliwa ay maaaring itapon.

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

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

Sa kabaligtaran, maaari mong i-convert ang anumang binary na numero sa hexadecimal sa parehong paraan. Bawat apat na binary digit, na nagbibilang mula kanan pakaliwa, ay isinusulat bilang isang hexadecimal digit. Ang mga numerong ito ay matatagpuan din mula kanan hanggang kaliwa.

Mga halimbawa.

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

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

Octal number system

Ang octal number system ay may alpabeto na binubuo ng 8 digit:

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

Ang pag-convert ng isang numero mula sa decimal system patungo sa octal at pabalik ay isinasagawa sa parehong paraan tulad ng pag-convert sa/mula sa binary.

Pag-convert ng mga numero mula sa octal patungo sa binary at pabalik

Ang bawat digit ng isang octal na numero ay isinusulat bilang isang tatlong-digit na binary na numero - triad.

Mga halimbawa.

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

1001101 2 = 001 001 101 2 = 115 8 .

Metodolohikal na materyales para sa aralin sa laboratoryo No. 1

Paksa ng aralin sa laboratoryo: Mga sistema ng numero. Pagsukat ng impormasyon.

Bilang ng oras: 2.

Mga halimbawa na may mga solusyon

    Pagsasalin mula sap -ary system hanggang 10-ary system. Ipagpalagay na kailangan nating i-convert ang isang numero sa isang tiyak na sistema ng numero sa decimal. Upang gawin ito, kailangan mong katawanin ito sa form

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.

    Conversion mula sa 10-digit na sistema sap -ichnaya.

2.1 98 10 → X 2.

Hinahati namin ang numero sa 2. Pagkatapos ay hinahati namin ang hindi kumpletong kusyente sa 2. Nagpapatuloy kami hanggang ang hindi kumpletong kusyente ay nagiging mas mababa sa 2, i.e. katumbas ng 1.

    98: 2 = 49. Natitira - 0 .

    49: 2 = 24. Natitira - 1 .

    24: 2 = 12. Natitira - 0 .

    12: 2 = 6. Natitira - 0 .

    6: 2 = 3. Natitira - 0 .

    3: 2 = 1 . natitira - 1 .

Dahil ang huling partial quotient ay 1, tapos na ang proseso. Isinulat namin ang lahat ng natitira mula sa ibaba hanggang sa itaas, simula sa huling hindi kumpletong quotient, at makuha namin ang numerong 1100010. Kaya 98 10 = 1100010 2.

2.2 2391 10 → X 16.

Hatiin ang numero sa 16. Pagkatapos ay hatiin ang partial quotient sa 16. Magpatuloy hanggang ang partial quotient ay mas mababa sa 16.

    2391: 16 = 149. Natitira - 7 .

    149: 16 = 9 . natitira - 5 .

Dahil ang huling partial quotient (9) ay mas mababa sa 16, tapos na ang proseso. Isinulat namin, simula sa huling hindi kumpletong kusyente, ang lahat ng natitira mula sa ibaba hanggang sa itaas at makuha namin ang numerong 957. Kaya 2391 10 = 957 16.

2.3 12165 10 → X 2.

Kung nagko-convert ka sa pamamagitan ng dibisyon sa binary system, makakakuha ka ng medyo masalimuot na proseso. Maaari mo munang i-convert ang numero sa octal, at pagkatapos ay palitan ang mga octal digit mula kanan papuntang kaliwa ng triads.

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

    Pagtukoy sa base ng isang sistema ng numerop .

Isang batang lalaki ang sumulat tungkol sa kaniyang sarili: “Mayroon akong 24 na daliri, 5 sa bawat kamay, at 12 sa aking mga paa.” Paanong nangyari to?

Solusyon. Ito ay kinakailangan upang matukoy ang base ng sistema ng numero p. Dahil alam natin na mayroon lamang 10 daliri sa paa 10, pagkatapos ay 12 p =1∙p+2 = 10 10 . Mula dito nakukuha natin ang equation p + 2 = 10  p= 8. Kaya ang ibig sabihin ng batang lalaki ay mga numero sa octal system. Sa katunayan, mayroong 24 8 = 2∙8+4 = 20 10 daliri ng paa, at 12 8 = 1∙8+2 = 10 10 daliri sa paa.

Ang sinumang nakikipag-usap sa isang computer o iba pang mga digital na kagamitan ay nakatagpo ng mga mahiwagang entry tulad ng 10FEF, na tila isang uri ng code sa mga hindi pa nakakaalam. Ano ang nakatago sa likod ng mga simbolong ito? Mga numero lang pala sila. Ang mga gumagamit ng hexadecimal

Mga sistema ng numero

Alam ng bawat mag-aaral, o narinig kahit saan, na ang lahat ng mga numero na kadalasang ginagamit natin ay may ganitong pangalan dahil lamang sa sampung magkakaibang mga simbolo sa loob nito (mula 0 hanggang 9). Anumang numero sa aming karaniwang sistema ay maaaring isulat sa kanilang tulong. Gayunpaman, lumalabas na hindi palaging maginhawang gamitin ito. Halimbawa, kapag nagpapalitan ng impormasyon sa pagitan ng mga digital na aparato, pinakamadaling gumamit ng isang sistema ng numero kung saan mayroon lamang dalawang numero: "0" - walang signal - o "1" - mayroong signal (boltahe o iba pa). Binary ang tawag dito. Gayunpaman, upang ilarawan ang mga proseso sa loob ng mga naturang device gamit ito, kakailanganin mong gumawa ng mga tala na masyadong mahaba at mahirap maunawaan. Samakatuwid, ang sistema ng hexadecimal na numero ay naimbento.

Ang konsepto ng hexadecimal system

Bakit gumagamit ang mga digital device ng isang sistema na naglalaman ng labing-anim na magkakaibang simbolo? Tulad ng alam mo, ang impormasyon sa mga computer ay ipinadala sa anyo ng mga byte, na karaniwang naglalaman ng 8 bits. Ang isang yunit ng data - isang machine word - ay may kasamang 2 byte, iyon ay, 16 bits. Kaya, sa tulong ng labing-anim na magkakaibang mga simbolo, posibleng ilarawan ang impormasyon na pinakamaliit na butil sa palitan. Kasama sa sistema ng hexadecimal na numero ang aming karaniwang mga numero (natural, mula 0 hanggang 9), pati na rin ang mga unang titik (A, B, C, D, E, F). Ito ay sa tulong ng mga simbolong ito na kaugalian na isulat ang anumang yunit ng impormasyon. Maaari kang magsagawa ng anumang mga pagpapatakbo ng aritmetika sa kanila. Iyon ay, karagdagan, pagbabawas, pagpaparami, paghahati. Ang resulta ay magiging isang hexadecimal na numero.

Saan ito ginagamit?

Ang hexadecimal system ay ginagamit upang magtala ng mga error code. Maaaring mangyari ang mga ito sa panahon ng pagpapatakbo ng iba't ibang mga produkto ng software. Halimbawa, ito ay kung paano naka-code ang mga error sa operating system. Ang bawat numero ay pamantayan. Maaari mong malaman kung ano mismo ang error na nangyari sa proseso ng trabaho sa pamamagitan ng pag-decipher nito gamit ang mga tagubilin. Ginagamit din ang ganitong mga simbolo kapag nagsusulat ng mga programa sa mababang antas ng mga wika, tulad ng pagpupulong. Ang hexadecimal number system ay minamahal din ng mga programmer dahil ang mga bahagi nito ay napakadaling ma-convert sa binary, na "katutubo" sa lahat ng digital na teknolohiya. Ginagamit din ang mga simbolo na ito upang ilarawan ang mga scheme ng kulay. Bilang karagdagan, ganap na lahat ng mga file sa computer (teksto, graphics, at kahit na musika o video) ay ipinakita pagkatapos ng broadcast bilang isang pagkakasunud-sunod.

Siyempre, ang anumang numero ay maaaring isulat sa iba't ibang mga sistema ng numero. Ang mga ito ay decimal, binary, at hexadecimal. Upang isalin ang isang salita mula sa isa sa mga ito patungo sa isa pa, dapat kang gumamit ng isang serbisyo tulad ng isang tagapagsalin ng system ng numero, o gawin ito sa iyong sarili gamit ang isang partikular na algorithm.

Upang magsulat ng mga programa sa Assembly, kailangan mong maunawaan ang hexadecimal number system. Walang kumplikado tungkol dito. Ginagamit natin ang decimal system sa buhay. Sigurado akong alam mo lahat, kaya susubukan kong ipaliwanag ang hexadecimal system gamit ang isang pagkakatulad sa decimal system.

Kaya, sa sistema ng decimal, kung magdaragdag tayo ng zero sa anumang numero sa kanan, ang bilang na ito ay tataas ng 10 beses. Halimbawa: 1 x 10 = 10; 10 x 10 = 100; 100 x 10 = 1000, atbp. Sa sistemang ito ginagamit namin ang mga numero mula 0 hanggang 9, i.e. sampung iba't ibang mga numero (sa katunayan, kaya tinatawag itong decimal).

Sa hexadecimal system, ginagamit namin ang labing-anim na "digit". Partikular kong isinulat ang salitang "digit" sa mga panipi, dahil... Hindi lang numero ang ginagamit nito. At talagang, paano iyon? Hayaan akong ipaliwanag: mula 0 hanggang 9 ay binibilang namin sa parehong paraan tulad ng sa decimal, ngunit pagkatapos ay magiging ganito: A, B, C, D, E, F. Ang numero F ay hindi mahirap bilang, ito ay magiging katumbas ng 15 sa decimal system (tingnan ang Talahanayan 1).

Desimal na numero

Hexadecimal na numero

Talahanayan 1. Decimal at hexadecimal system.

Kaya, kung magdaragdag tayo ng zero sa kanan ng anumang numero sa hexadecimal system, ang bilang na ito ay tataas ng16 minsan.

Halimbawa 1: 1 x 16 = 10; 10 x 16 = 100; 100 x 16 = 1000, atbp.

Nagawa mo bang makilala ang mga hexadecimal na numero mula sa mga decimal na numero sa Halimbawa 1? At mula sa seryeng ito: 10, 12, 45, 64, 12, 8, 19? Ang mga ito ay maaaring alinman sa hexadecimal o decimal. Upang maiwasan ang pagkalito at ang computer upang malinaw na makilala ang isang numero mula sa isa pa, sa assembler ay kaugalian na ilagay ang simbolo na h o H pagkatapos ng isang hexadecimal na numero ( Ang H ay abbreviation para sa English. hexadecimal (hexadecimal). Para sa maikli, kung minsan ito ay tinatawag na simple Hex ) . At huwag maglagay ng anuman pagkatapos ng decimal. kasi Ang mga numero mula 0 hanggang 9 sa parehong mga sistema ay may parehong kahulugan, pagkatapos ay ang mga numerong nakasulat bilang 5 at 5h ay pareho.

yun. Halimbawa 1 (tingnan sa itaas) ay mas tama kung isulat ang ganito: 1 x 16 = 10h; 10h x 16 = 100h; 100h x 16 = 1000h. O tulad nito: 1h x 10h = 10h; 10h x 10h = 100h; 100h x 10h = 1000h.

Titingnan natin kung bakit kailangan ang hexadecimal system sa mga susunod na isyu. Sa ngayon, para sa aming halimbawang programa, na tatalakayin sa ibaba, kailangan nating malaman ang tungkol sa pagkakaroon ng mga numerong hexadecimal.

Kaya, sabihin summarize. Ang sistema ng hexadecimal na numero ay binubuo ng 10 digit (mula 0 hanggang 9) at 6 na titik ng alpabetong Latin (A, B, C, D, E, F). Kung magdaragdag tayo ng zero sa kanan ng anumang numero sa hexadecimal system, ang bilang na ito ay tataas ng16 minsan. Napakahalagang maunawaan ang paksang ito, dahil palagi naming gagamitin ito kapag nagsusulat ng mga programa.

Ngayon ng kaunti tungkol sa kung paano ako bubuo ng mga halimbawa sa Assembly. Ito ay hindi lubos na maginhawa upang ipakita ang mga ito sa HTML na format, kaya unang magkakaroon ng program code mismo na may mga numerong linya, at kaagad pagkatapos nito ay magkakaroon ng mga paliwanag at tala.

Tulad niyan:

mga linya Code ng programa
(1) mov ah,9

Mga Paliwanag:

Sa linya (1) ginagawa namin ito, at sa linya (15) ginagawa namin iyon.

Malaking kahilingan: HUWAG kopyahin ang mga programa mula sa isang pahina patungo sa clipboard at pagkatapos ay i-paste ang mga ito sa Notepad (o kahit saan pa)! I-type muli ang mga ito nang manu-mano sa isang text editor. Kung mayroon kang printer, pagkatapos ay piliin ang programa, i-print ang napiling fragment, at pagkatapos ay ilipat ito sa editor mula sa papel. Ang lahat ng mga halimbawa ay dapat i-type sa iyong sarili! Mapapabilis nito ang pagsasaulo ng mga operator.

At higit pa. Walang pagkakaiba sa pagitan ng lowercase at UPPERCASE na mga titik sa assembler. Mga tala ng form:

Ang assembler perceives ang mga ito sa parehong paraan. Maaari mong, siyempre, pilitin ang assembler na makilala sa pagitan ng lowercase at UPPERCASE na mga character, ngunit hindi namin ito gagawin sa ngayon. Upang gawing mas madaling basahin ang programa, pinakamahusay na mag-type ng mga operator sa maliliit na titik, at simulan ang mga pangalan ng mga subroutine at label sa malalaking titik. Ngunit ito ay depende sa kung sino ang magiging komportable.

Kaya, lumipat tayo sa aming unang programa:

(1) Segment ng CSEG

(2)org 100h

(4) Magsimula:

(6) mov ah,9

(7) mov dx,offset na Mensahe

(8) sa loob ng 21h

(10) sa loob ng 20h

(11)

(12) Mensahe db "Hello, world!$"

(13)Nagtatapos ang CSEG

(14) wakas Magsimula

Upang maipaliwanag ang lahat ng mga operator sa halimbawang ito, kakailanganin namin ng ilang mga edisyon. Samakatuwid, aalisin na lang natin ang paglalarawan ng ilang mga utos sa yugtong ito. Ipagpalagay na lang na ganito dapat. Titingnan namin ang mga operator na ito nang detalyado sa malapit na hinaharap. Kaya, ang mga linyang may numerong (1), (2) at (13) ay binabalewala mo lang.

Ang mga linya (3), (5), (9) at (11) ay iniwang blangko. Ginagawa ito para sa kalinawan. Aalisin lamang sila ng assembler.

Ngayon, magpatuloy tayo upang isaalang-alang ang natitirang mga operator. Ang program code ay nagsisimula sa linya (4). Ito ay isang marka na nagsasabi sa assembler sa simula ng code. Ang linya (14) ay naglalaman ng mga operator na nagtatapos Magsimula ( Simulan ang Ingles Simulan; wakas wakas). Ito ang pagtatapos ng programa. Sa pangkalahatan, sa halip na ang salita Magsimula ibang bagay sana ang ginamit. Halimbawa, Simula:. Sa kasong ito, kailangan nating tapusin ang programa Tapusin ang Simula (14).

Ang mga linya (6) (8) ay nagpapakita ng mensaheng Hello, world!. Dito kailangan nating pag-usapan nang maikli ang tungkol sa mga rehistro ng processor (titingnan natin ang paksang ito nang mas detalyado sa susunod na isyu).

Ang rehistro ng processor ay isang espesyal na inilaan na memorya para sa pag-iimbak ng isang numero.

Halimbawa:

Kung nais naming magdagdag ng dalawang numero, pagkatapos ay isulat namin ito sa matematika tulad nito:

A, B at C ito ay isang uri ng mga rehistro (kung pinag-uusapan natin ang tungkol sa isang computer) kung saan ang ilang data ay maaaring maimbak. Ang A=5 ay mababasa bilang: Italaga sa A ang bilang 5 .

Upang magtalaga ng isang rehistro ng isang halaga, mayroong isang mov operator sa Assembler (mula sa English move load). Ang linya (6) ay dapat basahin nang ganito: Naglo-load sa rehistro A.H.numero 9 (sa madaling salita, itinalaga namin A.H.numero 9). Sa ibaba ay titingnan natin kung bakit ito kinakailangan.

Sa linya (7) naglo-load kami sa rehistro DX address ng mensahe para sa output (sa halimbawang ito ito ang magiging stringKumusta, mundo!$).

Tatalakayin nang detalyado ang mga interrupt sa mga susunod na isyu. Dito ako magsasabi ng ilang salita.

Makagambala MS-DOS ito ay isang uri ng subroutine (bahagi MS-DOS), na permanenteng namamalagi sa memorya at maaaring tawagan anumang oras mula sa anumang programa.

Isaalang-alang natin ang nasa itaas gamit ang isang halimbawa (Mga tala sa maliit na pag-print):

Programa para sa pagdaragdag ng dalawang numero

Mga Programa sa Tahanan

A=5 Ipinasok namin ang halaga 5 sa variable A

B=8 sa variable B ang halaga 8

Pagdaragdag ng Mga Subroutine sa Pagtawag

ngayon C ay katumbas ng 13

A=10 parehong bagay, magkaibang numero lang

B=25

Pagdaragdag ng Mga Subroutine sa Pagtawag

ngayon ang C ay katumbas ng 35

Pagtatapos ng Programa

Subroutine na Pagdaragdag

C=A+B

ReturnFromSubroutine bumalik kami sa lugar kung saan kami tumawag

EndSubroutine

Sa halimbawang ito, dalawang beses naming tinawag ang subroutine Dagdag, na nagdagdag ng dalawang numero na ipinasa dito sa mga variable A at B . Ang resulta ay inilagay sa variable na C. Kapag tinawag ang isang subroutine, naaalala ng computer kung saan ito tinawag, at pagkatapos, kapag natapos nang tumakbo ang subroutine, babalik ang computer sa lugar kung saan ito tinawag. yun. Maaari mong tawagan ang mga subroutine sa hindi tiyak na bilang ng beses mula sa kahit saan.

Kapag nagpapatupad ng linya (8) ng isang programa ng Assembly, tinatawagan namin ang isang subroutine (sa kasong ito ay tinatawag na interrupt), na nagpapakita ng linya sa screen. Para sa layuning ito, kami, sa katunayan, ay naglalagay ng mga kinakailangang halaga sa mga rehistro. Ang lahat ng kinakailangang gawain (pag-output ng isang linya, paglipat ng cursor) ay kinuha ng subroutine. Ang linyang ito ay mababasa nang ganito: tawagan ang dalawampu't isang interrupt ( int mula sa Ingles humarang makagambala). Mangyaring tandaan na pagkatapos ng numero 21 ay may isang sulat h . Ito, tulad ng alam na natin, ay isang hexadecimal na numero (33 sa decimal). Siyempre, walang pumipigil sa amin na palitan ang linya int 21h hanggang int 33. Ang programa ay gagana nang tama. Karaniwang kasanayan lamang sa Assembler na ipahiwatig ang interrupt na numero sa hexadecimal.

Sa linya (10) kami, tulad ng nahulaan mo, tumawag sa interrupt 20 h . Upang tawagan ang interrupt na ito, hindi mo kailangang tukuyin ang anumang mga halaga sa mga rehistro. Gumagawa lamang ito ng isang gawain: paglabas sa programa (paglabas sa DOS). Bilang resulta ng pagsasagawa ng interrupt 20h, babalik ang programa sa kung saan ito inilunsad (na-load, tinawag). Halimbawa, sa Norton Commander o DOS Navigator.

Ang linya (12) ay naglalaman ng mensaheng ilalabas. Unang salita ( mensahe mensahe) pamagat ng mensahe. Maaari itong maging anuman (halimbawa, gulo o string, atbp.). TUNGKOL SA Bigyang-pansin ang linya (7), kung saan kami naglo-load sa rehistro DX ang address ng aming mensahe.

Maaari tayong lumikha ng isa pang linya, na tatawagin natin gulo2. Pagkatapos, simula sa linya (9), ipasok ang mga sumusunod na command:

(10) mov dx,offset Mess2

(13) Mensahe db "Hello, world!$"

(14) Mess2 db "Ako ito! $"

at muling buuin ang aming programa. Sana ay mahulaan mo kung ano ang mangyayari

Bigyang-pansin ang huling karakter sa mga linya Mensahe at Mess2 - $. Tinuro nito ang dulo ng linya. Kung aalisin natin ito, pagkatapos ay 21 h ang interrupt ay magpapatuloy sa pag-output hanggang sa makatagpo ito ng isang character sa isang lugar sa memorya $. Sa screen natin makikita basura .

Kung mayroon kang debugger, makikita mo kung paano gagana ang aming programa.

Ang layunin ng isyung ito ay hindi upang maunawaan nang detalyado sa bawat operator. Ito ay imposible, dahil wala ka pang sapat na kaalaman. Naniniwala ako na pagkatapos ng 3-4 na paglabas ay mauunawaan mo ang prinsipyo at istruktura ng isang programa ng Assembly. Marahil ang wika ng Assembly ay tila napakakumplikado para sa iyo, ngunit maniwala ka sa akin, ito ay sa unang tingin.