Debug программасында қосу және алу амалы

Енді регистрлер былай бейнеленуі тиіс:

AX=03A7 BX=092A CX=00000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=3756 ES=3756 SS=3756 CS=3756 IP=0100 NV UP DI PL NZ NA PO NC

3756:0100 01D8 ADD AX, BX

ADD нұсқауы жадының біздің орналастырғымыз келген тұсына орналасқан. Бұл хабарламаның үшінші жолынын көрініп алғашқы екі сан 3756:0100 бізге нұсқауымыздың алғашқы санының адресін береді (100h). Олардан кейін біз ADD:01D8-ді білдіретін екі байтты көреміз.

01h-ке тең байт 100h адресі бойынша орналасқан, ал D8h 101h адресі бойынша орналасқан. Жолдың соңында машина тілінде хабар орналастырылады. Бұл жазбаны микропроцессор қосу туралы нұсқау ретінде түсіндіреді. Нұсқау жадыда орналастырылып болған соң, 8088 микропроцессорына оның қай тұста орналасқандығы жөнінде хабар беру қажет.

Микропроцессор сегменттің номері мен қозғалу адресін сіздер бұдан алдыңғы листингте терілген күйінде көре алатын екі арнайы регистр CS және IP де тауып ала алады. Сегменттің номері біз алдағы уақытта қарастыратын CS-те немесе кодтың сегментінде (ағылшынша Code Segment) регистрде сақталады. Егер де сіздер регистрлердің басып жазылғанына қарасаңыздар, онда Debug-тің біз үшін CS-ті орналастырғанын көресіздер. (біздің мысалымызда CS=3756). Осылайша біздің нұсқауымыздың бастамасының толық адресі 3756:0100

Осы адрестің келесі бөлігі (3756 сегментінің ішіндегі қозғалу) нұсқаудың нұсқамасы – IP регистрінде сақталынады. (ағылшынша «Instruction Pointer»). 8088 микропроцессоры IP регистрінен алынған қозғалуды біздің бірінші нұсқауымызды тауып алу үшін пайдаланады. Біз IP регистріне өзіміздің бірінші нұсқауымыздың адресін IP=0100 етіп жазып қою арқылы микропроцессорға оны қай тұстан іздеу керектігін хабарлаймыз.

Алайда IP регистрі 100h-ке орнатылып қойылған. Біз кішкене жылдамдық таныттық: Debug IP-ны 100h-ке оны іске қосқан сайын орнатады. Осыны біле тұрып, біз 100h –ті бірінші инструкцияның адресі ретінде таңдап алдық та, осылайша IP регистрін орналастыруды жеке орындау қажеттілігінен озат болдық. Осы амалды еске сақтап қою қажет.

Нұсқауды енгізіп регистрлерді дұрыс орналастырып болғаннан кейін біз Debug-тен соны орындауды сұраймыз. Бұл үшін біз бір нұсқауды бір адым алдын орындайтын және содан кейін регистрлердің ішінде не бар екенін көрсететін Debug “T” (ағылшынша “Trace”) командасын қолданамыз. Әрбір іске қосылудан кейін, IP келесі нұсқауға нұсқайды біздің жағдайымызда ал 102h-ке меңзейді.

Біз 102h-ке ешқандай да нұсқауды орналастырған жоқ едік, сондықтан терудің соңғы жолында алдыңғы программадан қалған нұсқауды көреміз.

Енді келіңіздер «Т» командасының көмегімен Debug-ты нұсқауды орындауды өтініп көрейік.

AX=0CD1 BX=092A CX=00000 DX=00000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=3756 ES=3756 SS=3756 CS=3756 IP=0102 NV UP DI PL NZ

NA PO NC

3756:0102 AC L O D SB

Міне болды. Енді АХ регистрінде 3А7h пен 92Аh-тің қосындысы болып табылатын СD1h саны бар. Ал IP регистрі 102h адресіне меңзейді сондықтан регистрлерді басып терудің соңғы жолында жадыда 100h адресі бойынша емес, 102h адресі бойынша орналасқан нұсқауды көреміз.

Бұдан бұрын айтылғандай нұсқау меңзері CS регистрімен бірге 8088 микропроцессорының орындауы тиіс келесі нұсқауға меңзейді. Егер де біз «Т» ны теріп босатып болсақ, онда келесі нұсқау орындалады. Бірақ мұны дәл қазір орындамаңыздар, себебі сіздің 8088 микропроцессорыныз. «кідіріп» қалуы мүмкін.

Ал егер де біз енгізілген нұсқауды тағы да бір рет орындауды қажет етсек, яғни 92Аh-пен CD1h-ті қосып жаңа жауапты АХ-те сақтауды жөн көрсек? Бізге 8088 микропроцессорына келесі нұсқауды қай тұстан тауып алу керектігін және де сол нұсқаудың 100h адресі бойынша орналасқан сол баяғы «AD AX, BX» болуы керектігін түсіндіру үшін не істеу қажет? Біз IP регистрінің мәнін 100-ге өзгерте аламыз ба? Енді осыны істеп көрелік. «R» командасын IP-ны 100-ге орнату үшін пайдаланыңыз, және де регистрлердің теріліп басылғанын қараңыз:

AX=OCD1 BX=092A CX=00000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=3756 ES=3756 SS=3756 IP=0100 NV UP DI

PL NZ NA PO NC

3756: 0100 ADD AX, BX

“T” командасын тағыда бір рет енгізіп көріңіз және де АХ регистрінде 15FBh саны бар екенін қараңыз. Шынында да бар.

Көріп отырғандарыңыздай «Т» командасын пайдаланбас бұрын сізге IP регистрін және де оның мәніне сәйкес келетін «R» командасымен көрсетілетін, листингтің төменгі бөлігінде орналасатын нұсқауды тексеру қажет. Осылайша сіз 8088 микропроцессорының қажетті нұсқауды орындайтынына сенімді боласыз.

Ал қазір IP регистрін 100h-ке орналастырамыз, регистрлерде АХ= 15FBh, BX= 092Ah-тің бар екеніне көз жеткізіңіз де тағы да санап шығарып көріңіз.

Біз АХ-тен ВХ-ті санап шығу үшін нұсқау жазуға кірісейін деп жатырмыз, сондықтан екі санаудан кейін АХ регистрінде 3А7һ нәтижесі пайда болады. Онда біз өзіміз бастаған нүктеге қайта ораламыз. Бұдан өзге сіздер жадыға екі байтты енгізерде күш қалайша үнемдеуді көресіздер.

Біздер АDD нұсқауының екі байтын енгізерде «Е» командасын екі рет теріп басқан едік: бірінші адрес үшін 0100һ бастап бір рет және екінші адрес үшін 0101һ –тен бастап екінші рет. Алайда егер де біз екінші байтты енгізілген бос орынмен ажыратсақ, екінші байтты тағы да бір «Е» командасынсыз-ақ енгізе аламыз. Енгізуді яқтағаннан кейін, «Enter» пернесін басыңыз. Осы әдісті біздің есептеу нұсқауымызда қолданып көріңіз.

-Е 100

3756:010001*29DB*D8

Регистрлер листингі енді (IP регистрін 100h-ке орналастыру қажеттігі естеріңізде болар) АХ регистріндегі ВХ регистрінің ішіндегісін санап шығатын және де нәтижені АХ-ке орналастыратын «SUB AX,BX» нұсқауын көрсетуі тиіс. АХ пен ВХ-ті жазу тәртібі әртүрлі болуы мүмкін, алайда нұсқау Бейсикте жазылған АХ=АХ-ВХ өрнегі секілді, 8088 микропроцессорының Бейсикке қарағанда жауапты әрқашанда бірінші аймалыға орналастыратынын білдіреді. (бірінші регистрге)

Осы нұсқауды «Т»командасының көмегімен орындаңыз. АХ –те CDIболуы тиіс.IP-ны ал осы нұсқауға нұсқайтындай етіп өзгертіңіз және де оны тағы да орындаңыз. (нұсқауды алдымен регистрлерлистингінің төменгі төменгі жағында тексеруді ұмытпаңыз) АХ-те енді ОЗА 7h болуы тиіс.

8088 микропроцессордағы кері сандар.

Соңғы бөлімде біз 8088 микропроцессорының кері сандар үшін екілік қосымшаның формасын қалай пайдаланатынын білдік. Қазір біз кері сандармен есептеу жүргізу үшін тікелей SUB нұсқауымен жұмыс істейтін боламыз. Енді FFFFh ті -1 ретінде алатынымызды немесе алмайтынымызды көру үшін 8088 микропроцессорына шағын тест берейік. Із біртекті нольден санап аламыз.және де мұнда біздікі дұрыс болса, санау нәтижесінде АХ регистрінде FFFFh(-1)пайда болуы тиісАХ-тің мәнін нольге тең етіп, ВХ-тің мәнін бірлікке тең етіп орналастырыңыз да, содан соң нұсқауды 100h адресі бойынша іске қосыңыз. Біз күткен нәтижемізді алдық АХ= FFFFh

8088 микропроцессорындағы байттар.

Осыған дейін біздің арифметикамыз төрт он алтылық цифрмен жүзеге асырылып келіп еді. 8088микропроцессоры байттармен жүргізілетін математикалық операцияларды қалай орындалатынын біле ме екен? әрине біледі.

Бір сөз екі байттан тұратындықтан жалпы мақсаттағы әрбір регистрге үлкен байт (алғашқы екі он алтылық сандар) және кіші байт (келесі екі он алтылық сандар)ретінде белгілі екі байтқа блінуімүмкін. Алынған әрбір регистрдің атауы сөздегі «Х» тің алдында және үлкен байт үшін «Н» әріптің алдында немесе кіші байт үшін «L» әрпінің алдында тұратын регистр атауының бас әрпінен құралады.Мысалы, DLменDH-байттың ұзындығындағы регистрлер, ал DX-сөздің ұзындығындағы регистрлер.(мұнда қолданылатын ұғымдар әрқашан да ыңғайлы бола бермейді, жадыда сақталатын сөздерде кіші байт бірінші болып жүрсе үлкен байт екінші боып жүреді)

 сурет. АХ регистрін екі байттық регистрге болу (АН және АL)

Байттық арифметиканы APD нұсқауында тексеріп көрейік. 0100һ адресінен бастап, 00һ және С4һ екі байтын енгіземіз. Регистрлер лиетингінің төменгі жағында сіз АХ регистрініңекі байтын қосатынжәне дғе нәтижені АН үлкен байтына орналастыратын «АDP AH, AL» нұсқауын көреміз.

Содан соң АХ регистріне 0102һ санын жүктеңіз.

Міне осылайша сіз 01һ-ті АН регистрінежәне 02һ-ті AL регистріне орналастырасыз. IP регистрін100һ- ке орналастырыңыз. «Т» командасын орындаңыз, сонда сіз АХ регистрінде 0302 бар екенін көресіз. 01һ+02һ тің қосуының нәтижесі 03һ болады, және де дәл осы мән АН регистрінде тұрады.

Алайда, сіз 01h-пен 02h-ті қосқыңыз келмеді дейік. Іс жүзінде сіз 01 мен 03h-ті қосқыңыз келді. Егер де АХ регистрінде 0102 болса, біз АL регистрінің мәнін 03h-ке өзгерте аламыз ба? Жоқ.

Сізге АХ регистрінің мәнін 0103h –ке өзгертуге тура келеді. Ол неліктен? Себебі Debug бізге тек оналты разрядты регистрлерді ғана өзгертуге мүмкіндік береді. Debug-тың көмегімен регистрдің тек қана кіші немесе үлкен бөлігін ғана өзгертуге болмайды. Бірақ, сіздер алдыңғы бөлімде көргендеріңіздей мұны істеу қиындық туғызбайды. Оналтылық сандармен жұмыс істей өтырып, біз төрт мәнді санды тең бөле отырып, сөзді екі байтқа бөлеміз. Міне сонымен 0103h сөзі 01h және 03h деген екі байтқа айналады.

Қосудың осы нұсқауын іс жүзінде тексеріп көру үшін АХ регистріне 0103h санын жүктеңіз. «ADD AH,AL» нұсқауы бұрынғысынша жадыда 0100h адресі бойынша тұр. Сондықтан IP регистрін 100h-ке орнатыңыз да АН және АL регистрлерінде 01h және 03h мәндерін болдыра отырып нұсқаудың орындалуын іске қосыңыз. Осыдан соң АХ-те 0403h: 04h тұрады, ал 01h+03h қосындысы АН регистрінде тұрады.