Естеріңізде болар, бізде ҒҒҒҒҺ саны түріндегі шешімі табылмаған жұмбақ бар. Біз ҒҒҒҒҺ-тің 1-ге тең екенін айттық. Алайда егер де біз ҒҒҒҒҺ-ті ондық формаға ауыстырсақ. Онда біз 65535-ті аламыз. Бұл неге бұлай болады? ҒҒҒҒҺ шынымен-ақ өзін теріс сан ретінде көрсете ме?
Осылай болсын дейік, онда егер де біз ҒҒҒҒҺ пен 5-ті (біздің болашағымыз бойынша -1) қоссақ, нәтиже 4 болуы тиіс, себебі 5-1=4 болады. Бұл жүзеге аса ма? ҒҒҒҒҺ-ті қосу үшін Debug «Н» командасын пайдалана отырып мынаны аламыз.
-Н5ҒҒҒҒ
0004 00006
Debug ҒҒҒҒҺ-ке 1 секілді қарайтын. Бірақ ҒҒҒҒҺ программаларда әр қашанда өзін -1 секілді көрсете бермейді. Бұл неге былайша болып жатқанынкөру үшін, қосуды қолмен жүргіземіз.
Екі ондық санды қосуда біз мына жағдайдағы секілді бірді келесі бағанға ауыстыруды жиі түрде орындаймыз:
95
+58
153
Екі он алтылық санды қосу дәл осылайша жүзеге асырылады.
Мысалы; 3 пен Ғ-ты қосу 1-ді келесі бағанға ауыстырумен 2-ні береді.
Ғ
+3
12Һ
Ал енді біз 5һ-пен ҒҒҒҒһ-ті қосқанда не болғанын көрейік.
0005һ
+ҒҒҒҒһ
10004һ
Ғһ+1һ=10һ жағдайында бірдің сол жақтағы ең шеткі жаққа бірте-бірте ауысуы болғандықтан, біз бұл бірді қабылдамайтын болсақ, 5-1-ге 4 деген дұрыс жауапты аламыз. Таң қаларлық болып көрінсе де, біз бұл толықтауды жоққа шығарғанда, ол өзін 1 секілді көрсетеді. Ол толықталған деп аталуының себебі сан енді бес мәнді болды, ал Девид тек алғашқы (оң) төрт цифрды сақтайды.
Толықталу-қате ме әлде дұрыс жауап па? Осы екі сұраққа да «иә» деп жауап беруге болады. Жауаптар біріне-бірі қарама-қайшы емес пе?-жоқ, себебі бұл сандар екі тәсілмен қарастырылады.
Біз ҒҒҒһ-ті 65536-ға тең деп қабылдадық дейік. Бұл оң сан, және де ал біз төрт он алтылық санның көмегімен жазып қоюымызға болатындардың ішіндегі ең көбі. Біз ҒҒҒҒһ санының белгісі жоқ екенін айтамыз. (ағылшынша «unsidnet»). Біз барлық төрт мәнді сандарды оң сан ретінде анықталғаннан кейін оның шындығында белгісі жоқ болады. 5пен ҒҒҒҒһ-ті қосу бізге 10004һ-ті береді; жалғыз дұрыс жауап міне осы. Демек, белгісі жоқ сандар жағдайында толықтану(дөңгелектену) бұл үлкен қате болып табылады.
Бір жағынан біз ҒҒҒҒһ-пен 5-ті қосу үшін «Н» командасын пайдаланып жатқанымызда Девид секілді ҒҒҒҒһ-ті кері сан ретінде қарастыра аламыз. Біз қайта толықтану қабылдамай жатқанда ҒҒҒҒһ өзін 1 секілді көрсетеді. Шын мәнінде 8000һ-тен ҒҒҒҒһ-ке дейінгі сандар өзін кері сан ретінде көрсетеді.
Белгісі бар сандар үшін, осы жерде көрсетілгендей қайта толықтау қате болып табылмайды. 8088 микропроцессоры сандарды белгімен де белгісіз де қарастыра береді: таңдау өзіңізде. Бұл екеуі үшін арналған нұсқаулардың кішкене бір-біріне кішкене айырмашылықтары бар, және де біз осы айырмашылықтарды 8088 микропроцессорында пайдаланып бастағаннан бастап келесі бөлімдерде қаластырамыз. Қазірше сіз мәселен 3с8һ санына сәйкес келетін кері санды жазып болғаныңызша, бізге бит деген өзіндік ұғымды және оның байтпен байланысын, сөзбен он алтылық санды жете түсініп алуымыз қажет.
Регистр.
Процесорларды арифметикалық есептеулерді қамсыздандыру және жадты адрестеу үшін программалар орындауда 14 регистрлер да пайдаланылады. Әр бір регистр бір сөз (16 бит) ұзындығынан тұрады және бір атпен адрестеледі. Регистр биті оңнан сол жаққа қарай номерлеу қабылдаған: 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0.
Debug біздің жолбасшымыз әрі түсіндіріп берушіміз, ал IBM PC –тің
ішінде орналасқан 8088 микропроцессоры жайлы көп біледі. Біз оны 8088 –де болып жатқан ішкі процестерді зерттеу үшін пайдаланатын боламыз: Сондықтан біз сандар сақтала беретін, регистр деп аталатын жадтың кішкене бөліктері жайлы беретін хабарлардың бәрін жарыққа шығарсын деп Debug –ке сұрау салудан бастаймыз. Регистрлер Бейсиктегі айнымалылардай ұқсас, алайда бұлар дәл мұның өзі емес. Бейсикке қарағанда 8088 микропроцессорында регистрлердің шектеулі саны болады, және де бұл регистрлер сіздің IBM PC-дің жадысының бір бөлігі болып табылмайды.
Біз Debug-ке 8088 микропроцессорының регистрлерінің ішінде не бар екенін «R» командасының көмегімен көрсетуді өтінеміз (ағылшынның «Register» сөзінің қысқартылған түрі).
— R
AX=0000 BX=0000 CX=00000 DX=0000
SP= FFEE BP=0000 SI=0000 D=0000
DS=3756 ES=3756 SS=3756 CS=3756 IP=0100
NV UP DI PL NZ NA PO NS
3756:0100E485 IN AL, 85
(Мүмкін сіз өзіңіздің дисплейіңізде екінші және үшінші жолдарда өзге сандарды көрерсіз бұл сандар компьютердің жадысының сонын көрсетеді. Бұл айырмашылықтар одан әрі қарай да сақтала береді, сондықтан оларды біз кейінірек талқылаймыз).
Қазір Debug бізге жеткілікті түрде көп ақпарат берді. Ең бірінші төрт регистр AX, BX, CX және DX-ке назар аударайық. Бұлардың мәні туралы Debug олардың бәрі 0000-ге тең екенін хабарлаған еді. Қалған регистрлер SP, BP, SI, DI, DS, ES, SS, CS және IP арнайы мақсаттағы регистрлер болып табылады. Олармен біздер келесі бөлімдерде танысамыз.
Регистр атауының соңын көрсетілген төрт мәнді сан, оналтылық сан болып табылады. 1-бөлімде, біз бір сөздің төрт оналтылық санмен сипатталатының білдік. Көріп тұрғандарыңыздай, 8088 микропроцессорының әрбір 13 регистрі сөз болып табылады да оның 16 битттік ұзындығы бар. Сондықтан 8088 микропроцессорының негізінде құрылған компьютерлер оналты разрядты деп аталады.
Біз регистрлердің Бейсик айнымалыларына ұқсас екенін бұрынырақ айтқан болатынбыз. Бұл біздің олардың жағдайын өзгертіп және де мұны істейтінімізді аңғартпады. Debug «R» командасы регистрлерді тек жарыққа шығарып қана қоймайды. Егер де командада регистрдің атауын көрсетер болсақ, онда Debug біздің нақ сол регистрдің ішінде не бар екенін қарап шығуымызға ықылас білдіріп отырғанымызды түсінеді де оны өрертіп жібере алады. Мысалы біз АХ регистрін төменде көрсетілгендей етіп өзгерте аламыз:
— R AX
AX = 0000
: 3A7
—
Енді АХ регистрінде 3А7h бар екеніне көз жеткізу үшін регистрдің ішінде не бар екенін қарап шығайық:
— R
AX = 03A7 BX=0000 CX=00000 DX=0000 SP=FFEE BP=0000
SI=0000 DI=0000
DS=3756 ES=3756 SS=3756 CS=3756 IP=0100 NV UP DIPL NZ NA PO NC
3756: 0100 E485 IN AL,85
Міне осылай. Сонымен, біз жаңа ғана істегендей, регистрдің атын (есімін) көрсете отырып және де қос нүктеден кейін оның жаңа мәнін енгізе отырып, «R» командасының көмегімен оналтылық санды регистрге орналастыра аламыз, одан әрі қарай, біз бұл команданы 8088 микропроцесорының регистріне сандарды енгізу үшін пайдаланатын боламыз.
Біз 3А7h пен 1ЕDh-ті қосу үшін Debug «Н» командасын қолданғанда 1 бөлімде 3А7h санын көргендерініз бәлкім естеріңізде болар. Сол кезде Debug жұмысты біздің орнымызға істеген еді. Енді біз тікелей 8088 микропроцессорымен жұмыс істеу үшін Debug-ты түсіндіруші, ұғындырушы ретінде пайдаланатын боламыз. Біз 8088-ге екі регистрдегі сандарды қосуға нұсқау береміз: алдымен санды ВХ регистріне орналастырамыз содан соң 8088-ге ВХ те сақталып тұрған санды АХ-те сақталып тұрған санға қосып жауапты АХ-ке орналастыруға нұсқау береміз. Алдымен бізге ВХ регистріне санды енгізіп алу қажет. 3А7h пен 92Аh-ті қосайық. 92Аh-ті ВХ-ке орналастыру үшін «R» командасын пайдаланамыз.
Сонымен, АХ және ВХ регистрлерінде 3А7h пен 92Аh бар болуы тиіс
шығар. Бұған біз «R» командасының көмегімен көз жеткізе аламыз.
AX=03A7 BX=092A CX=00000 DX=0000 SP=FFEE
BP=0000 SI=000 DI=0000
DS=3756 ES=3756 SS=3756 CS=3756 IP=0100
NV UP DI PL NZ NA PO NC
3756:0100 E485 IN AL, 85
Енді АХ және ВХ регистрлерінде бізге қажет сандар бар. ВХ пен АХ-тің ішіндегілерді қосу керектігін 8088 микропроцессорына қалайша хабарлаймыз? Бұл үшін біз компьютер жадына кейбір сандарды енгіземіз.
IBM PC-де кем дегенде 128 К байт жады бар. Бұл бізге қажеттіден едәуір көп. Біз мұндай үлкен мөлшердегі жадының бір бұрышына машиналық кодтың екі байтын орналастырамыз. Бұл жағдайда машиналық код екі екілік санмен жүзеге шығады. Бұлардың көмегімен біз 8088 микропроцессорына ВХ регистрын АХ-қа қосу керектігін хабарлаймыз. Содан соң нәтижені көру үшін, біз бұл нұсқауды Debug программасының көмегімен орындаймыз.
Осы екі байтты нұсқауды жадының нақты қай бөлігінде орналастыруымыз керек және де 8088 микропроцессорына оны қай тұстан іздеу керектігін қалайша хабарлаймыз?
Қосқан сәтте 8088 микропроцессоры жадыны әрбірі 64 Кбайт болатын, сегменттер деп аталатын бөліктерге бөліп тастайды. Оның жадының нақ қай жерде басталатынын білмей тұрып, біз осы сегменттердің бірімен жұмыс істейміз. Біз 8088 микропроцессорының жадынытәсіліне бола осылайша істейміз.
Жадының барлық байттері Оh тен басталып жоғары қарай өсетін сандармен белгіленеді. Бірақ оналтылық сандарды төрт мәнді шектеу туралы білетін боларсыздар? Бұл 8088 микропроцессорының пайдалана алатын саны-ол 65535 санының оналтылық эквиваленті екенін білдіреді.
Өз кезегінде бұл 8088-дің белгілейтін жадасының ең үлкен көлемі
64 Кбайт екенін көрсетеді. Алайда, біз 8088 микропроцессорының 64 Кбайт жадыдан көбірек адрестей алатынын тәжірибеден білеміз. Мұны ол кішкене ғана трюктың көмегімен жасайды: ал екі санды пайдаланады, бірін 64 Кбайт сегментінің нөмері үшін, екіншісін сегменттің ішіндегі әрбір байт немесе қозғалыс үшін. Мұндай адрестеуде 8088 жадынын бір миллионға дейін пайдалана аламыз.
Алдағы уақыттағы мысалдарымызда біз қолданатын барлық адрестер (белгілер)-бұлар сегменттің басынан басталатын жылжулар. Біз адрестерді сегменттің нөмері ретінде жазатын боламыз және де оның артынша қос нүкте арқылы сегменттің ішіндегі жылжуларды жазамыз. Мысалы, 3756:0100 3756h сегментінің ішіндегі 100h жылжунда тұрғанымызды білдіреді.
Кейінірек 11 бөлімде біз сегменттерді нақтырақ зерттейміз де бізде неліктен сегменттің үлкен номері бар екенін қарап көреміз. Бірақ қазір біз Debug программасына сегменттерді бақылауды сеніп тапсырамыз да олардың номерлеріне назар аудармаймыз. Әрбір адрес сегменттегі бір байтқа тура келеді және де адрестер өсіп отыратын тәртіппен орналасқан, сондықтан жадыда 100h- тен кейін 101h байт келеді.
Жазбада ВХ пен АХ-ті қосу туралы біздің екі байтты нұсқауымыз былайша көрінеді: «ADD AX, BX». Біз бұл нұсқауды Debug пайдалана бастайтын кез-келген сегментте 100h және 101h адресі бойынша орналастырамыз. Жоғарыда айтылған адрестеу туралы келісімге сәйкес, біз нұсқау 100h адресі бойынша орналасқан деп айтамыз, себебі бұл нұсқаудың бірінші байтының орналасар орны.
Жадыны зерттеуге және өзгертуге арналған Debug командасы «Е» деп аталады (ағылшынның «Enter» деген сөзінен шыққан). Осы команданы төменде көрсетілгендей етіп ADD екі байт нұсқайын енгізу үшін қолданыңыздар:
-Е 100
3756:0100 Е4.01
-Е 101
3756: 0101 85. D8
01h және D 8h сандары 3756:0100 және 3756:0101 адрестері бойынша орналасқан. Сіздер көретін сегменттің нөмері мүмкін басқаша болатын шығар, бірақ бұл айырмашылық біздің программамызға ықпал етпейді. Келтірілген мысалдағыдай Debug командаға жауап ретінде екі түрлі мәнді санды жарық етеді. Бұл сандар Debug программасы таңдап алған, сегменттің басынан 100h және 101h жылжуындағы жады ұяшығының ескі мәндері, яғни бұл Debug іске қосылғаннан кейін бұрынғы программадан қалған сандар. (Егер де сіздер өз компьютерлеріңізді қазір ғана қоссаңыздар, онда сандар 00 болуы тиіс).