Boshqa registrlar
SP, BP–stek bilan ishlashda, adreslarni vaqtincha saqlash uchun ishlatiladi.
SI, DI–indeks registrlari, qo‘shish va ayirish amallarida ishlatiladi.
IP – buyruq siljishini saqlash registri.
Bayroq registri – holatlarni aniqlashda ishlatiladi.
Turbo-Paskal muhitida Registers turi aniqlangan bo‘lib, uning ko‘rinishi.
Type
Registers Record
Case Integer Of
0: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flag:Word);
1: (AL, AH, Bl, BH, CL, CH, DL, DH : Byte);
End;
Uzilishdagi funksiyalar ma’lum bir registrlardan kiruvchi qiymatlar uchun ishlatiladi. Odatda R.AH - funksiya nomerini, R.AL va boshqa registrlar chiqish qiymatlari uchun ishlatiladi (R.AL –funksiya qanday bajarilganligini bildiradi (0 – muvaffaqiyatli).
Uzilishlar bilan ishlashga misollar.
Kursorni matn ekranining (35,10) nuqtasiga ko‘chirish.
…R.AH : 2;
R.DH :10;
R.DL:35;
Intr(10H, R);
...
Subprotsessor va rezident programmalar. Foydalanuvchining o‘zi ham uzilish programmalarini yaratishi mumkin. Bu protsedura bosh qismi quyidagicha bo‘lishi kerak.
Procedure IntProc (Flag, CS, IP, ..., ES, BP : Word); Interrup;
Parametrlar ro‘yxatida uzilish bo‘lmasligi kerak. Bosh qismidan ma’lum qismini tashlab yuborish mumkin.
Misol.
Uses Dos;
Var
GlVar1, GlVar2, GlVar3, ... , GlVarK : Word;
{$F+}
Procedure MyInterupt(Flag, Cs, Ip, Ax, ..., Bp : Word); Interrupt;
Var
{lokal o‘zgaruvchilar}
Begin
GlVar1 :Ax;
GlVar2 : Port[N];
. . .
End;
{$F-}
Var
N : Byte;
OldInterrupt : Pointer;
Begin
N := {almashtiriladigan uzilish nomeri}
GetIntVec (N, OldIntVectN);
SetIntVec(N, @MyInterrupt);
{ programma o‘z uzilishi bilan ishlaydi}
SetIntVec(N, OldIntVecN);
End;
Subprotsess (subjarayon) deganda bir programma ichidan ikkinchi programmani ishga tushirishga aytiladi. Misol uchun Norton Commander programmasi subprotsessorli norezident programmadir. Subprotsess ro‘y berganda asosiy programma «to‘xtab» qoladi, subprotsess tugagandan keyin o‘z ishini davom ettiradi.
Rezident programmalarning asosiy xususiyati shundaki, bu programmalar operativ xotiraga yuklangandan keyin xotirada saqlanib qoladi va ma’lum bir shartlar bajarilganda ishga tushadi. Odatda bunday programmalar uzilish nomerlariga bog‘langan bo‘ladi (masalan, turli drayverlar, antivirus va virus programmalar va hakozo). Passiv holda rezident programmalar hech qanday ta’sirga ega emas.
Subprotsessni amalga oshirishda xotiradan unumli foydalanish kerak. Buning uchun {$M, Stek, MinimumUyum, MaksimumUyum} psevdo izoxi yordamida xotirani programmalar o‘rtasida taqsimotini amalga oshirish mumkin. Bunda stek – 1..64Kb, MinimumUyum va MaksimumUyum 0..655360 (640Kb) bo‘lgan son. Bu qiymatlar orqali xotiraning stek va uyumiga «buyurtma» berish mumkin.
Misol uchun, programma 986 bayt stek, 2000 bayt uyum xotira ishlatadigan bo‘lsa, bu talab {$M 1024,0,2048} orqali berilishi mumkin. {$M, 4096, 0, 0} – uyum ishlatmaydigan programma.
Subprotsessor protseduralari. SwapVectors – TP muhitidan bir programma ishga tushganda uzilishlar vektorida o‘zgarishlar sodir bo‘ladi. Lekin uzilishlar vektorining oldingi holati Pointer turidagi SaveIntNN (NN-uzilish nomeri) o‘zgaruvchilarida saqlanib qoladi. Subprotsessorlar ishga tushganda asosiy programma holatini anglatuvchi (aniqlovchi) uzilishlar vektorini saqlab qolish va subprotsessor tugagandan keyin tiklash kerak. Bu vazifani SwapVectors amalga oshiradi. Birinchi marta chaqirilganda holatni saqlab qoladi, ikkinchi marta chaqirilganda uni tiklaydi.
Exec(ExeFile, Comline : String) – subprotsessorni ishga tushiradi. Bu ExeFile – ishga tushiriladigan ish modul (fayl) nomi, Somline – ishga tushiriladigan programma uchun buyruq satri.
Misol uchun, “C:/Format a:/s” DOS buyrug‘ini programma ichidan bajarish uchun quyidagi protsedura – operatorlarini yozish kerak.
Swapvectors;
Exec(‘c: /format.com’,’a:/s’) ;
Swapvectors;
Do'stlaringiz bilan baham: |