Процедура туралытүсінік.
Процедура дегеніміз ол инструкция тізімі, оны біз программаның әр түрлі жерінен шақырсақ болады, бір инструкцияларды қайта-қайта қайталамай олар керек кезде. Бейсикте бұндай тізімді подпрограмалы дейді. Бірақ бізоны процедура дейміз, себебін кешірек білеміз.
Біздің процедураға кіріпшығуымыз тура Бейсиктегідей болады. Біз процедураны
CALL инструкциясы арқылы шақырамыз, Бейсикте GOSUBоператоры сияқты, ал
процедураданшығу RET инструкциясыарқылы, БейсиктеRETURNоператорысияқты
жұмыс істейді.
Мына программаБейсиктегі жай программа, бұны біз машина тіліне көшіреміз. Бұл программаподпрограмманыон ретшақырады. Әр шыққандабір символды шығарады “А” бастап“J” бітеді.
10 A= $ H41 ASCII для“A”
20 FOR I=1TO 10
30 COSUB 1000
40 NEXTI
50 END
1000 PRINT CHR $ (A);
1100 A=A+1
1200 RETURN
Подпрограмма Бейсіктегідей 1000 қатардан басталады, основной программаға инструкция қосуға жай қалдырады, подпрограммаға тимей. Біз процедурамен тура соны істейміз машиналық тілде жазылған 200h адресіне сиғызып,основной программалардан ары, 100h адресінен басталатын. Тағыда біз “GOSUB 1000” “CALL 200h” инструкциясына ауыстырамыз, процедураны 200h жадтағы ұяшықтан шақырады.
Бейсиктегі FOR-NEXT циклдің орнына алдағы айтқандай біз LOOP инструкциясын жазамыз. Программаның қалған бөлімі сізге таныс болуы керек.
3985 : 0100В401MOVDL,41
3985 : 0102B90A00 MOVEX,000A
3985 : 0105F8F800CALL 0200
3985 : 0108E2FB LOOP 0105
3985 : 010A CD20 INT 20
Бірінші инструкция 41h(ASCII-код “А”) Dl регістерінде орналасқан. “INT 21h” инструкциясы символды енгізеді. ASCII кодымен DL-де берілге.
“INT 21h” инструкциясының өзі әргерек орналасқан процедура 200h адресінде.
Мына процедураны 200h адресінде енгізу керек.
3985 : 0200В402MOV AH,02
3985 : 0202СD21INT21
3985 : 0204FEC2INC DL
3985 : 0206CERET
Бұл жерде екі жаңа және екі ескі инструкция көрсетілген. Естерінізге саламыз, 02h AH регістерінде DOS-қа мәлімдейдіDL-де символді енгізуі қажет екенің “INT 21h” инструкциясын орындағанда. “INС DL” инструкциясы біріншісі екі жаңаның, DL регістірін бірге үлкейтеді, демек DL-ге берді қосады.Жаңа инструкция екіншісі RET инструкциясы (LOOP) инструкциясына қайтарады CALL-дан кейінгі основной программаға.
“G” енгізіңіз жауабын көру үшін, одан кейін оны орындап көріңізоныңқалай жұмыс істегенің көру үшін. Естеріңізден шықпасын точку останова немесе “Р” командасын қолдану “INT 21h” инструкциясын қосу үшін.
0105 : CALL0200
0108 : LOOP0105
0200 : MOV AH,02
0202 : INT 21
0204 : INC DL
0206 : RET
СALL және RET инструкциясы.
PUSH инструкциясыныңқолданылуы. POP инструкциясыныңқолданылуы.
Стекдегенімізберілгенсөздердіуақытшасақтайтыноптималды орын,шартта, бізөтеабайболукерекпізRET инструкциясыныңалдындастекқайтқанда(востановится). БізбілдікCALL инструкциясы қайтуадресіболадыстектіңбасына,солуақыттаRET инструкциясыстектіңбасынан сөздіизвлекатьоданкейінІРрегистерінеқосады(стектіңішіндетөбегекөтеріледі,және стектіңбасына сөзтүседіизвлеченный денкейінорналасқан).
Бұндай процедураны PUSH, POP инструктурасыарқылыорындауға болады, соныменжазыпжәнеизвлекающихстектенсөзді. Олнеге керекболуымүмкін?
Ассемблердерегистрлердіңмәнінсақтау оңай (олар айнымалыларболады) процедураның басындажәнеқайтаруоларды соңынаRETинструктурасының алдына.Сондықтан процедураныңішінде бізбұл регистреердіқалайқолданғымызкелседесолайқолданамыз,соңындамәні шыққанша .
Программаларкөпуровнедегіпроцедуралардан тұрады әруровень процедуранышақырадыоданкейінгі.Регистрлердіпроцедураныңбасындасақтапқайтарамыз олардысоңынаСіздеркөпбілесіздеррегистрлерсақтаудыжәнеқайтаруды бізпрограмманыңмодулдікконструированиеніайтқанкезде. Ал кәзірмысалкелтірейік (енгізуонқажетемес)СХжәне DХ регистрлердісақтапжәне қайтарған.
396Ғ: 020051 PUSH CX
396Ғ: 020152PUSH DX
396Ғ: 0202В 90800 MOV DL
396Ғ: 0205Е8Ғ800CALL 0300
396Ғ: 0208ҒЕСL INCDL
396Ғ: 020С5APOPDX
396Ғ: 020D59POPCX
396Ғ: 020Е C3 RET
Бұл жердеРОРинструкциясы PUSH терісорналасқан, POP сөзді өшіреді стекте соңынан орналасқан,алDXескімәністектеорналасқан “терең” СХ ескімәнінен.СХжәне DX регистрлерісақтапжәнеқайтарадыпроцедураныңішіндеөзгертеаладыолардыңмәнің(200һмәніненбасталатын)солуақытта регистрлердің мәні процедураларменқолданғанбұнышақыратынсақталған.Сондықтанбіз бұлрегистрлерділокальдыайнымалылардысақтауғақолданамызайнымалыларпроцедураныңішіндеқолданатын,айнымалылардыңмәнінеәсер етпейшақырған программамен қолданатын.
Бұндай локалдыайнымалылар программированиені оңайту үшінқолданылады. Бізтурақайтарамызалдыңғырегистрлердіңмәнін, ойламайаққойыңызрегистрлердің мәнінеболыпжатқанымен оларолардышақырғанпроцедураларменқолданады.Келесімысалда түсініктіболады, қайсысыоналтылық санныналупрцедурасыболады.Алдыңғыпрограммағақарағанда, енді біздің программатек дұрысцифрлардықолдануға рұхсатбереді”А” сияқтыбірақ “К” емес.
Оналтылықсанау жүйесін салыстыру. Оналтылықсанаужүйесін салыстыру жайәдісі.
Бізклавиатураданенгенсимволдарданыоқитын процедурақұрмақшымыз жәнекөрсететін оларды мұмкін ба оналтылықсанау жүйеде мүмкінемеспа өткізу 0ден Fhдиапозонында.Өткізугеболмайтынсимволдарэкранғашықпайды. Олүшін“INT 21h”инструкциясынөмір 8 қолданады символдыоқитынбірақоныэкранғашығармайды. Соныменбізкөреміз (ағыл.“еcho”) экранда тексол сандарды оналтылықтағы берілген диапозонда.
АН регистріне8hендіреміз одаң соң бұл ниструкцияны жібереміз “A” енгізіпболасап “G102” кейін.
3985:0100 CD21 INT21
ASCII-код“А”(41h) Ahрегистріндеорналасқан, бірақ “А ”Экранға шықанжоқ.
Осыинструкциянықолданапрограммаклавиатурадансимволдароқи алады,экрандакөрсетпей,солуақытқа дейінқалғанкеректі оналтылық санды оқиды(0 ден9 жәнеА данF)одан кейінэкранғашығарады. Осыпроцедураоныістейтін жәнеоналтылқ символды оналтылықсанға ауыстырады .
ПроцедураAL-десимволдыоқиды(“INT21h” 203h адресі көмегімен) және тексереді, тура келгендігін ол шартқа CMP қолдана және условно аусу инструкциясы. Егер оқыған символ тура келмесе, онда условно аусу инструкциясы 8088 203 адресіне қайта жібереді, бұл жерде “INT 21h” басқа символды оқиды.