Символдарды клавиатура жәрдемінде енгізу.
Оналтылық санау жүйеде байтті енгізуін біле, біз жұмысымызды тіке бастаймыз. Клавиатурадан оналтылық сандарды екі символ оқу және оларды бір байтқа ауыстыру.
Бір символды енгізу.
DOS- та “INT 21h” функциясын шақырамыз біз қолданып отырған функцияның номері 1, клавиатурадан енген символды оқиды. Функцияларды шақыру амалын өткенде, біз көрдік функцияның номері AH регистріне ену керек “INT 21h” шақырғаннан алдын. “INT 21h” функция 1 жұмыс істеп көрейік “INT21h” 0100h: адресіне енгізейік:
396F: 0100 CD21INT21
Одаң соң 01h ті AH регистріне қойыңыз содаң соң “G102” немесе “Р” ендіріңіз бұл инструкцияны орындау үшін. Еш нәрсе болған жоқ? Тек жанып өшіп тұрған курсорды көріп тұрмыз. Бірақ DOS күтіп тұр сіз клавишаңызды басатыңызды (әзірше оны істемеңіз). Оны басқан кезде, DOS ASCII басқан клавиштін символының кодын сидырады AL регистрінде. Біз бұл инструкцияны оналтылықта символдарды оқу үшін қолданамыз, бірақ қазыр кез келге клавишаны басқанда не болатының көреміз.
F1 клавишін басып көрейік. DOS AL –ге 0 –ді қайтарады, және сіз нүктелі үтірді көресіз (“;”), дефистің алдында шыққан – Debug шақырады.
Осы болды. F1 әдейі ұзайтылып жиналған кодтармен клавиштерге жатады, оларды DOS клавиштерден бөлек істейді, кәдімгі ASCII символын көрсетеді. Бұл клавиштердің әр қайсысына DOS екі символ жібереді, бірін артынан біреуін. Бірінші келген символ әрдайым ноль болады, ол білдіреді, келесі символ скэн-код (scan code) әдейі клавиш.
Екі символды өқу үшін, “INT21h” екі рет орындау керек. Бірақ біздің мысалда біз бір символды оқимыз және скэн-кодті DOS-та қалдырамыз. Debug “G102” (немесе “Р”) команданың орындалуын бітсе, ол символдарды оқуға бастайды. Бұл жерде ол оқитын бірінші символ скэн-код болады F1 клавишінен қалған: 59 деген, ASCII кодының символы “;” болады.
Кейін біз Dskpatch программасын бастасақ, біз осы расширенный (ұзайтылған) қодтарды қолданамыз курсормен және функцияларды клавишпен жұмыс істеу үшін.
Бір және екі цифрадан тұратын оналтылық санау жүйесін салыстырып оқу.
Біз санды ауыстыру жолын қолданайық, алдағы тақырыпта айтқандай,
бір оналтылық цифрадан ASCII код символы шығу үшін 0-ден 9 және А –дан F диапазонында. Бір символды аударған кезде мысалы: С немесе D сияқты оналтылықтан байтқа, бұл саннан 30h алуымыз керек (0-ден 9-ға дейін), немесе 37h (А –дан F-ке дейін).
Төменде жай программа келтірілген бір ASCII- символын оқитын және оны бір байтқа ауыстыратын.
3985:0100B401 MOVAH,01
3985:0102CD21 INT 21
3985:01042C30SUBAL,30
3985:01063C09CMP AL,09
3985:01087E02JLE010C
3985:010A2C07 SUBAL,07
3985:010CCD20INT20
Программаның көп инструкциясы бізге таныс, бірақ бір жақсысы бар JLE (қысқаша ағыл. “Jump if Less or Egual to” — өту, егер кіші немесе тең болса). Біздің программада бұл инструкция өтуді білдіреді, егер AL кіші немесе тең 9h болса.
ASCII- символынан оналтылық санау жүйеге өткенде не болып жатқаның көру үшін AL регистрінің мазмұның көру керек “INT 20h” орындаудан алдын. Debug бұл инструкцияны орындап болған соң регистрлерді қайтарады, бұл жерде тағы тоқтау нүктесін қолданамыз. “G10c” енгізіңіз сіздер көресіздер AL оналтылық сан символдан болған.
Бірнеше символ енгізіп көріңіз “к” сияқты немесе “d”, оналтылық цифра емес, сіз көресіз не болатының. Сіз түсінген шығарсыз бұл программа тек цифраларға 0 -ден 9-ға дейін және А-дан F –ке дейін.
Біз қалған жетіспеушіліктерді келесі тақырыпта өзгертеміз, подпрограмма немесе процедураны өткенде. Біз тура символды енгіземіз программа дұрыс жұмыс істеу үшін.
Екі онатылық цифраны оқу бір оналтылықты оқудан қиындау. Бірақ ол көп инструкцияны қажет етеді. Біз бірінші цифраны оқудан бастайық, одан кейін оның оналтылық санын жазайық DL регистрінде және оны 16-ға көбейтеміз. Бұл көбейтуді орындау үшін біз DL регистрін солға 4 битке жылжытамыз, оналтылық ноль болу үшін (төрт нөлден бит) цифрадан он жақта қазыр ғана оқыған. “SHL DL,GL” инструкция, CL регистрін қолдана төрт саны енген он жақтан сөздерді қойып орындайды. SHL инструкцияcы (ағылш. “Shi Lett”-логикалық жылжу солға), тағы арифметикалық жылжу сияқты көбейту екіге, төртке, сегізге и т.д. CL сапталған.
Біріншіні алып солға жылжуға цифра, біз екінші оналтылық цифраенгіземіз DL санына (=бірінші цифра*16).
Программамен жұмсыс істеп түсінесіз.
3985:0100В401 MOVAH,OL
3985:0102 CD 21 INT 21
3985:0104 88C2MOVDL,AL
3985:0106 80 EA30 SUB DL,30
3985:0109 80FA09 CMP DL,09
3985:010C 7E03SLE 0111
3985:010E 80EA07 SUBDL,07
3985:0111 B104 MOVCL,04
3985:0113 D2E2SNL DL,CL
3985:0115 CD21 INT 21
3985:01172C30 SUB AL,30
3985:0119 3C09 CMPAL,09
3985:011B 7E02 SLE 011F
3985:011D 2C07SUB AL,07
3985:0121 CD 20 INT 20
Біздежұмыс істеп тұрғанпрограмма бар, границалық шартты тексеріп,
программамыз дұрыс істеп жатқанын көрейік. Бұл кезде 00, 09, 0А, 0Ғ, 90, А0, Ғ0және басқада сандар.
Мысалы: 3C“INT 20h” иниструкциясын орындамай программаны қосуүшін точку
останова қолданайық. (оналтылық санды енгізу үшінтек бас әріпті қолданайық).