Бтін сандарды осу жне алу ерекшеліктері

Табасыз бтін сандар деттегідей, біра екілік санау жйесінде осылады. Мнда бір проблема бар: егер осынды операндтар аймаыны лшемінен асып кетсе не істеу керек? Мысал шін байт лшемді 255 жне 1 сандарыны осындысын арастырайы:

11111111 + 1 = 100000000

осынды 8 биттан асып тр, ал 8 битта 0 алды, рине, ол дрыс нтиже емес. Процессор мндай жадайда ателік крсетпейді, сол жатан арты бір алынып тасталып, нтиже ретінде 8 бит алынады (бізді мысалымызда ол 00000000), біра CF жалаушасына 1 жазылады. Нтижені дрыстыына осы жалаушаны мнін тексеру арылы кз жеткізуге болады.

Осындай жоары разряда тасымалдатын бірді алып тастап осу математикада 2k модулі бойынша осу (k-яшыты лшемі) деп аталады. Жне де CF жалушасында ауысу боландыы жайлы белгі ойылады (CF=1): осу(х,у)=(х+у) mod 2k =

Табасыз бтін сандарды алуда да проблема туады: азайтыш азайтындыдан лкен боланда нтиже теріс сан болады, ал ол табасыз сандар аймаына кірмейді. детте, мндай жадайда жоары разрядты сатамыз. Процессорда солай жасайды. Яни, операндты разрядтар торыны жоары разрядынан келесі разрядтан 1-ді алады. Мнда да ателік ескерілмейді, біра CF жалаушасына 1 жазылады. Мысал шін 5-10 амалыны орындау жолын арастырайы:

05 = 00000101

10 = 00001010

Сандара 8 орын блінген (байт лшемді). Алу амалын орындау шін ойдаы жоары разрядтан (9-разрядтан) 1-ді аламыз.

  100000101
- 00001010
  11111011

Мнда (256+5)-10=251. Бл сан -5 саныны осымша коды. Осылайша орындалатын алу амалы математикада 2k модулі бойынша алу деп аталады жне жоары разрядты сату жасаланы белгіленеді:

алу(х,у)=(х–у) mod 2k =

Сонымен, процессорда табасыз бтін сандарды осу жне алу іс жзінде 2k модулі бойынша осу жне алу, мндаы k-яшыты лшемі. Жне де амалдан со CF жалаушасыны мні 1 болуы нтижені дрыс еместігін крсетеді.

Табалы сандарды осу жне алу.Егер табалы бтін сандар осымша кодта берілсе, онда оларды осу жне алуды табасыз сандарды осу жне алу алгоритмдері бойынша орындауа болады екен. Мнда табалы санны осымша коды табасыз сан ретінде арастырылып осылады жне алынады, ал нтиже табалы санны осымша коды трінде арастырылады.

Мысалы (8 биттік яшыта), айталы +3 жне -1 сандарын осу керек болсын. Оларды осымша кодтары: 3 жне 28-1=(256-1)=255. Табасыз сандар трізді осамыз: 3+255(mod 256)=258(mod 2k)=2. Енді 2 шамасы нтижені осымша коды ретінде арастырылады, сондытан жауап +2.

Баса мысал алайы, айталы -3 жне +1 сандарын осу керек болсын. Бл сандарды осымша кодтары: 28-3=(256-3)=253 жне 1. Оларды табасыз сандар трізді осамыз: 253+1(mod 256)=254. Енді бл шаманы нтижені осымша коды(254=256-2) ретінде арастырып, осу нтижесі –2 екенін креміз.

Осы айтыландардан табалы сандар осымша кодта кескінделетін процесссорларда табасыз жне табалы сандарды осу жне алу шін р трлі командаларды ажеті жотыын, ондай командаларды бір ана тобыны жеткіліктілігін байаймыз.

Десекте, табалы сандарды осу жне алуды з ерекшеліктері бар. яшыты лшемі 8 бит боланда сандарды згеру аралыы -128 ден +127 дейін екендігі белгілі. Мысал шін +127 жне +2 табалы сандарыны осындысын арастырайы. Оларды табасыз сандар ретінде осса 129 болады, енді оны нтижені осымша коды деп арастыру керек: 129=256-127, онда осынды -127 саны болуы тиіс, яни екі о санды осып теріс сан алды.

Бл алай боланы? Сандарды (байт лшемді) осымша кодта кескіндегенде сол жа шеткі разряд санны табасына, ал санны модуліне алан 7 разряд беріледі. Олай болса 129=10000001b саныны модулі 7 разряда сыймай таба разрядына тіп кетеді.

Мндай модульді таба разрядына тіп кетуі «мантиссаны толуы» деп аталады. Мантиссаны толуы OF толу жалаушасында белгіленеді: толу болса мні 1, йтпесе 0 - болады. Сонымен, OF=0 боланда нтиже дрыс, ал OF=1 болса нтиже дрыс емес, біра бл ателік ескерілмейді. Ондай ателікті OF жалаушасын тексеру арылы табуа болады.

Осындай мантиссаны толып кетуі алу амалы барысында да болуы ммкін. Мысалы, (+127)-(-2)=127+2=129, ал бл -127 саныны осымша коды. Жалпы жадайда мантиссаны толып кетуі р табалы сандарды айырымын тапанда жне ол айырым табалы сандарды кескінделу аралыына жатпаан жадайда болады.

Сонымен, процессорда табалы, сол сияты табасыз бтін сандарды осу жне алу барысында нтижені тиісті аралыта жатпауына байланысты дрыс табылмау жадайлары болуы ммкін. Мдай нтижені дрыс болмауы CF жне ОF жалаушаларында белгіленеді. Мндай ателіктерді тек осы жалаушаларды мндерін талдау арылы ана табуа болады.

Бтін сандарды осу, алу барысында ZF (нлдік) жне SF (таба) жалаушаларыны мндері де згеріп отырады.

Мысалдар (яшытар байт лшемді):

9-9 = 0 = 00000000b ® ZF = 1, SF = 0

8-9 = -1 = 11111111b ® ZF = 0, SF = 1

9-8 = 1 = 00000001b ® ZF = 0, SF = 0