Бүтін сандарды қосу және алу ерекшеліктері
Таңбасыз бүтін сандар әдеттегідей, бірақ екілік санау жүйесінде қосылады. Мұнда бір проблема бар: егер қосынды операндтар аймағының өлшемінен асып кетсе не істеу керек? Мысал үшін байт өлшемді 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