Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Лабораторная работа №7. Управление видеоадаптером 2 страница




textattr(14);

cprintf("Файл %s в FAT занимает такие кластеры:\n",job);

jobptr=job+3;

if (job[0]>'A') {

/* для жесткого диска — физический номер и чтение MBR */

Fdisk=0x80;

Read_Mbr();

}

else /* для гибкого диска — физический номер */

Fdisk=job[0]-'A';

Read_Boot(); /* чтение boot-сектора */

Read_Fat(); /* чтение FAT */

dir=(struct Dir_Item *)buff2;

do { /* рух по каталогам */

if (!rootdir) clust=dir[dirnum].cl; /* начальный кластер */

/* выделение следующего элемента из строки-задания */

jobptr=Get_Name(jobptr,cname);

do { /* пока не дойдем до последнего кластера */

if (rootdir) { /* корневой каталог */

/* нач.сектор корневого кат. и количество секторов */

sect=boot->ResSect+boot->FatSize*boot->FatCnt;

lastsect=boot->RootSize*32/boot->SectSize+sect;

}

else { /* подкаталог */

sect=Clust_to_Sect(clust);

lastsect=boot->ClustSize+sect;

}

/* посекторное чтение всего корневого каталога

или одного кластера подкаталога */

for (; sect<lastsect; sect++) {

Sect_to_Daddr(sect);

Read_13(dir);

/* поиск имени в прочитанном секторе */

if ((dirnum=Find_Name())>=0) goto FIND;

}

/* до последнего кластера подкаталога */

}

while (clust=Next_Clust(clust));

/* весь каталог просмотрен, а имя не найдено — ошибка */

printf("%s -",cname);

if (jobptr==NULL) End_of_Job(4);

else End_of_Job(5);

 

FIND: /* имя найдено */

rootdir=0;

}

while (jobptr!=NULL);

/* найдено имя файла */

/* из каталога получеем 1-й кластер */

clust=dir[dirnum].cl;

textattr(7);

gotoxy(10,4);

cprintf("Нажимайте любую клавишу ");

cprintf(" пока не появится <КОНЕЦ ФАЙЛА>.");

textattr(12);

gotoxy(1,5);

cprintf("-<НАЧАЛО ФАЙЛА>");

gotoxy(1,6);

cprintf("L->");

i=0;

do {

i++;

if((i%10)==0) getch();

textattr(14+16);

cprintf("%4x",clust);

textattr(2);

cprintf("--->");

}

while (clust=Next_Clust(clust));

textattr(12);

cprintf("<КОНЕЦ ФАЙЛА>\n");

gotoxy(1,wherey());

textattr(15+3*16);

cprintf("Количество кластеров в файле: %u ",i);

End_of_Job(7);

}

/*-----------------------------------------------*/

/* Чтение MBR и поиск нужного раздела */

void Read_Mbr(void) {

int i;

char ndrive;

word *EndList;

caddr.h=0;

caddr.ts=1;

ndrive='C';

mbr=(struct MBR *)buff1;

 

NEXT: Read_13(buff1);

for (EndList=(word *)&mbr->rt[(i=0)];

(*EndList!=0xaa55)&&(mbr->rt[i].Size>0L);

EndList=(word *)&mbr->rt[++i]) {

if (mbr->rt[i].SysCode==5) {

caddr.h=mbr->rt[i].Begin_Hd;

caddr.ts=mbr->rt[i].Begin_SecTrk;

goto NEXT;

}

if (ndrive==job[0]) {

movmem(&mbr->rt[i],&part,sizeof(struct PART));

return;

}

else ndrive++;

}

/* требуемый раздел не найден */

printf("%c: -",job[0]);

End_of_Job(1);

}

/*-----------------------------------------------*/

/* Чтение boot-сектора */

void Read_Boot(void) {

if (Fdisk<0x80) {

caddr.h=0;

caddr.ts=1;

}

else {

caddr.h=part.Begin_Hd;

caddr.ts=part.Begin_SecTrk;

}

Read_13(buff1);

boot=(struct BootRec *)buff1;

Get_First();

}

/*------------------------------------------------*/

/* Чтение FAT */

void Read_Fat(void) {

dword s, ls;

byte *f;

fat=(byte *)malloc(boot->FatSize*boot->SectSize);

if (fat==NULL) {

printf("Размещение FAT -");

End_of_Job(3);

}

fatalloc=1;

s=boot->ResSect;

ls=s+boot->FatSize;

for (f=fat; s<ls; s++) {

Sect_to_Daddr(s);

Read_13(f);

f+=boot->SectSize;

}

/* установление формата FAT */

if (Fdisk>=0x80)

if (part.SysCode==1) fat16=0;

else fat16=1;

else fat16=0;

}

/*-----------------------------------------------*/

/* Чтение сектора при помощи прерывания 13 */

void Read_13(void *mem) {

/* mem — адреса в ОП */

union REGS rr;

struct SREGS sr;

rr.h.ah=2;

rr.h.al=1;

rr.h.dl=Fdisk;

rr.h.dh=caddr.h;

rr.x.cx=caddr.ts;

sr.es=FP_SEG(mem);

rr.x.bx=FP_OFF(mem);

int86x(0x13,&rr,&rr,&sr);

/* Проверка ошибок чтения */

if (rr.x.cflag&1) {

printf("%u -",rr.h.ah);

End_of_Job(2);

}

}

/*------------------------------------------------*/

/* Определение абс.номера сектора начала лог.диска */

void Get_First(void) {

word s, t;

if (Fdisk<0x80) FirstSect=0;

else {

/* формирование # сектора из физич. дискового адреса */

t=(part.Begin_SecTrk>>8)|((part.Begin_SecTrk<<2)&0x300);

s=part.Begin_SecTrk&0x3f;

FirstSect=(((dword)t*boot->HeadCnt)+part.Begin_Hd)*

boot->TrkSecs+s-1;

}

}

/*------------------------------------------------*/

/* Формирование физического дискового адреса из # сектора */

void Sect_to_Daddr(dword sect) {

/* sect — номер сектора, caddr — адрес на диске */

dword s;

if (Fdisk>=0x80) sect+=FirstSect;

caddr.s=sect%boot->TrkSecs+1;

s=sect/boot->TrkSecs;

caddr.h=s%boot->HeadCnt;

caddr.t=s/boot->HeadCnt;

caddr.ts=(caddr.t<<8)|caddr.s|((caddr.t&0x300)>>2);

}

/*-----------------------------------------------*/

/* Вычисление номера сектора из номера кластера */

dword Clust_to_Sect(word clust) {

/* clust — номер кластера, возвращает номер сектора */

dword ds, s;

ds=boot->ResSect+boot->FatSize*boot->FatCnt+

boot->RootSize*32/boot->SectSize;

s=ds+(clust-2)*boot->ClustSize;

return(s);

}

/*------------------------------------------------*/

/* Выборка следующего кластера из FAT */

word Next_Clust(word clust) {

/* clust — номер кластера, возвращает номер следующего кластера

или 0 — если следующего нет */

word m, s;

if (rootdir) return(0);

if (!fat16) {

m=(clust*3)/2;

s=*(word *)(fat+m);

if(clust%2) /* нечетный элемент */

s>>=4;

else /* четный элемент */

s=s&0x0fff;

if (s>0x0fef) return(0);

else return(s);

}

else {

m=clust*2;

s=*(word *)(fat+m);

if (s>0xffef) return(0);

else return(s);

}

}

/*------------------------------------------------*/

/* Выделение следующего элемента из строки-задания */

char *Get_Name(char *s, char *d) {

/* s — строка задания, d — выделенный элемент, возвращает
указатель на новое начало строки задания. */

char *p,*r;

int i;

for(i=0;i<11;d[i++]=' ');

d[11]='\0';

if ((p=strchr(s,'\\'))==NULL) {

/* последний элемент строки — имя файла */

/* перезапись имени */

for(r=s,i=0; (i<8)&&*r&&(*r!='.'); i++,r++) *(d+i)=*r;

/* перезапись расширения */

if (*r) for(i=0,r++; (i<3)&&*r; i++,r++) *(d+8+i)=*r;

return(NULL);

}

else {

/* следующий элемент — имя подкаталога */

*p='\0';

for(r=s,i=0; (i<11)&&*r; i++,r++) *(d+i)=*r;

return(p+1);

}

}

/*-----------------------------------------------*/

/* Поиск имени в каталоге */

int Find_Name() {

int j;

 

/* cname — найденное имя; возвращает индекс найденного

элемента в массиве dir или (-1) */

for (j=0; j<boot->SectSize/sizeof(struct Dir_Item); j++) {

if (dir[j].fname[0]=='\0') {

/* конец использованных элементов каталога */

printf("%s -",cname);

if (jobptr==NULL) End_of_Job(4);

else End_of_Job(5);

}

if ((byte)dir[j].fname[0]!=0xe5) {

if (memcmp(dir[j].fname,cname,11)==0) {

/* если iм`я збiгатся, то:

- при поиске файла элемент не должен иметь
атрибутов "подкаталог" или "метка тома",

- при поиске подкаталога элемент должен иметь атрибут
"подкаталог" */

if (jobptr==NULL)

if (!(dir[j].attr&0x18)) return(j);

else

if (dir[j].attr&0x10) return(j);

}

}

}

return(-1);

}

/*-----------------------------------------------*/

/* Завершение (при n=0-5 — аварийное) */

void End_of_Job(int n) {

/* n — номер сообщения */

static char *msg[] = {

"неправильный идентификатор диска",

"логический диск отсутствует",

"ошибка чтения",

"нехватка памяти",

"подкаталог не найден",

"файл не найден",

"непредусмотренный конец файла",

"" };

/* освобождение памяти */

if (fatalloc) free(fat);

/* выдача сообщения */

textattr(12+128);

cprintf(" %s\n",msg[n]);

gotoxy(28,wherey());

cprintf(" Нажмите любую клавишу...\n");

textattr(7);

getch();

/* завершение программы */

exit(0);

}

 

 

Результаты работы программы

В процессе работы программы на экран выводится информация наподобие следующей:

Лабораторная работа N9

Дисковые структуры данных DOS.

Файл D:\TC\TC.EXE в FAT занимает такие кластеры:

Нажимайте любую клавишу пока не появится <КОНЕЦ ФАЙЛА>.

-<НАЧАЛО ФАЙЛА>

8L->2410--->2411--->2412--->2413--->2414--->2415--->2416--->2417-

-->2418--->2419--->241a--->241b--->241c--->241d--->241e--->241f-

-->2420--->2421--->2422--->2423--->2424--->2425--->2426--->2427-

-->2428--->2429--->242a--->242b--->242c--->242d--->242e--->242f-

-->2430--->2431--->2432--->2433--->2434--->2435--->2436--->2437-

-->2438--->2439--->243a--->243b--->243c--->243d--->243e--->243f-

-->2440--->2441--->2442--->2443--->2444--->2445--->2446--->2447-

-->2448--->2449--->244a--->244b--->244c--->244d--->244e--->244f-

-->2450--->2451--->2452--->2453--->2454--->2455--->2456--->2457-

-->2458--->2459--->245a--->245b--->245c--->245d--->245e--->245f-

-->2460--->2461--->2462--->2463--->2464--->2465--->2466--->2467-

-->2468--->2469--->246a--->246b--->246c--->246d--->246e--->246f-

-->2470--->2471--->2472--->2473--->2474--->2475--->2476--->2477-

-->2478--->2479--->247a--->247b--->247c--->247d--->247e--->247f-

-->2480--->2481--->2482--->2483--->2484--->2485--->2486--->2487-

-->2488--->2489--->248a--->248b--->248c--->248d--->248e--->248f-

-->2490--->2491--->2492--->2493--->2494--->2495--->2496--->2497-

-->2498--->2499--->249a--->249b--->249c--->249d---><КОНЕЦ ФАЙЛА>

Количество кластеров в файле: 142

Нажмите любую клавишу...


 

Лабораторная работа N10.
Управление программами

Цель работы

Изучение принципов управления программами в MS DOS и приобретение практических навыков работы с префиксом программного сегмента и его полями.

Постановка задачи

Разработать программу, производящую форматный вывод на печать своего Префикса Программного Сегмента.

Пример решения задачи

Структура программы

Программа состоит из основной программы и двух функций:

void get_DOS_version_h(void) — функция, возвращающая в глобальной переменной dos_ver старшее число номера версии DOS.

void addr_PSP (void) — функция, получающая сегментный адрес префикса программного сегмента программы и возвращающая его в глобальной переменной pid.

Описание переменных

Переменные, глобальные для всей программы:

p_psp — указатель на структуру struct PSP,

pid — сегментный адрес PSP;

dos_ver — старшее число номера версии DOS;

i — вспомогательная переменная, используемая для просмотра таблицы файлов задачи (JFT), которая представляет собой массив из 20 элементов (хотя возможно, что их число отлично от 20, поэтому размер массива определим из поля JFT_size);

l — переменная, используемая для вывода содержимого сегмента окружения DOS и определения числа строк вызова (для версии DOS 3.0 и выше);

s — переменная, которая вначале используется как указатель на таблицу файлов задачи, затем на строки сегмента окружения и строки вызова;

rr — переменная, которая используется для задания значений регистров общего назначения при вызове прерывания.

Описание алгоритма программы

Данная программа производит распечатку основных полей своего PSP. Для этого префикс программного сегмента представим в виде следующей структуры:

struct psp

{ /* ФОРМАТ PSP */

byte ret_op[2]; /* команда INT 20h */

word end_of_mem; /* вершина доступной памяти*/

byte reserved1;

byte old_call_dos[5]; /* старый вызов DOS */

void *term_ptr; /* адрес завершения */

void *ctrlbrk_ptr; /* адрес обработчика Ctrl+Break */

void *criterr_ptr; /* адрес обработчика крит.ошибок */

word father_psp; /* PID родителя */

byte JFT[20]; /* таблица файлов программы */

word env_seg; /* адрес окружения */

void *stack_ptr; /* адрес стека */

word JFT_size; /* размер таблицы файлов */

byte *JFT_ptr; /* адрес таблицы файлов */

byte reserved2[24];

byte new_call_dos[3]; /* новый вызов DOS */

} *p_psp;

Поле ret_op используется для возможного завершения программы по команде RET 0, поле old_call_dos, содержит команду вызова диспетчера функций DOS. Обращение к этому полю в программе может использоваться вместо команды INT 21h, но в современных версиях DOS для этих целей лучше обращаться к полю new_call _dos.

Поле end_of_mem содержит сегментный адрес конца доступной памяти в системе. В три поля: term_ptr, ctrlbrk_ptr, criterr_ptr DOS при загрузке программы копирует содержимое векторов прерываний: 22h, 23h, 24, представляющее собой адреса обработчиков: завершения программы, комбинации клавиш Ctrl+Break, критической ошибки — соответственно. Предполагается, что программа может свободно перенаправить эти векторы на собственные обработчики соответствующих ситуаций, но от забот по восстановлению векторов программа избавляется, так как при ее завершении DOS сама восстанавливает векторы из соответствующих полей PSP завершаемой программы. Для аналогичных целей предназначено и поле stack_ptr — в нем сохраняется (а при завершении — из него восстанавливается) адрес стека, использовавшегося до вызова программы. Поле, именуемое father_psp, содержит сегментный адрес PSP родителя — программы, запустившей данную программу, обычно родителем является COMMAND.COM.

При загрузке программы DOS, кроме программного сегмента, создает для нее еще и сегмент окружения. Сегмент окружения содержит ASCIIZ-строки, задающие значения некоторых глобальных переменных, эти значения могут устанавливаться командой DOS SET, они доступны командным файлам и — через PSP — программам. Набор строк окружения заканчивается пустой ASCIIZ-строкой (нулем). В DOS 3.0 и выше за ним следует еще 2-байтное число строк вызова (обычно 1) и далее — строка (или строки) вызова программы. Обычно в первую (до строк вызова) часть порождаемой программы копируется содержимое окружения программы-родителя. Программа имеет доступ к своему сегменту окружения через поле env_seg PSP, содержащее сегментный адрес окружения.

Поле JFT (Job File Table — Таблица Файлов Задачи) представляет собой массив из 20 однобайтных элементов. При открытии программой файла DOS формирует для него блок-описатль в системной таблице файлов и помещает ссылку на него (его номер) в свободный элемент JFT. Дескриптор файла, возвращаемый программе DOS при открытии файла, является номером элемента в JFT. При запуске программы первые пять элементов создаваемой для нее JFT содержат ссылки на системные файлы, остальные свободны. При обработке JFT DOS использует не прямое обращение к полю JFT PSP, а косвенное — через поле JFT_ptr, а в качестве ограничителя размера JFT — не константу 20, а значение поля JFT_size PSP.

После всего, сказанного выше, не составляет труда написать программу, осуществляющую форматный вывод своего префикса программного сегмента. Для в начале необходимо определить версию DOS (с помощью функции get_DOS_version_h() и получить адрес PSP (с помощью функции addr_PSP()).

Функция get_DOS_version_h() определяет старшее число номера версии DOS, используя для этого функцию DOS 30h (прерывание 21h), которая возвращает в регистре AL старшее число номера версии, а в регистре AH — младшее число. Нас интересует только значение регистра AL.

Функция addr_PSP() возвращает сегментный адрес PSP путем использования функции DOS 62h:

Вход: AH = 62h

Выход: BX = сегментный адрес PSP текущего процесса

Текст программы

/*-----Лабораторная работа N10-----------------*/

/*------"Управление программами"----------------*/

/* Подключение стандартных заголовков */

#include <dos.h>

#include <conio.h>

/* Типы данных */

#define byte unsigned char

#define word unsigned int

 

/* Описание функций */

void get_DOS_version_h(void); /* Определение версии DOS */

void addr_PSP (void); /* Получение адреса PSP */

 

struct psp

{ /* ФОРМАТ PSP */

byte ret_op[2]; /* команда INT 20h */

word end_of_mem; /* вершина доступной памяти */

byte reserved1;

byte old_call_dos[5]; /* старый вызов DOS */

void *term_ptr; /* адрес завершения */

void *ctrlbrk_ptr; /* адрес обработчика Ctrl+Break */

void *criterr_ptr; /* адрес обработчика крит.ошибок */

word father_psp; /* PID родителя */

byte JFT[20]; /* таблица файлов программы */

word env_seg; /* адрес окружения */

void *stack_ptr; /* адрес стека */

word JFT_size; /* размер таблицы файлов */

byte *JFT_ptr; /* адрес таблицы файлов */

byte reserved2[24];

byte new_call_dos[3]; /* новый вызов DOS */

} *p_psp;

 

word pid; /* сегм.адрес PSP */

int dos_ver, /* версия DOS */

i, l, j;

char *s;

union REGS rr;

 

main()

{

textbackground(0);

clrscr();

textattr(0x0a);

cprintf("---------------");

cprintf(" Лабораторная работа N10 ");

cprintf("---------------");

cprintf("---------------");

cprintf(" Управление программами ");

cprintf("---------------");

textcolor(11);

get_DOS_version_h();

addr_PSP();

/* распечатка PSP */

cprintf("\n\n Адрес PID = %04X\n\n\r",pid);

p_psp=(struct psp *)MK_FP(pid,0);

textcolor(10);

cprintf("Команды:\n\r");

cprintf("--------\n\r");

textcolor(14);

cprintf(" Завершение — int 20h:");

textcolor(12);

cprintf(" %02X %02X\n\r",p_psp->ret_op[0],p_psp->ret_op[1]);

textcolor(14);

cprintf(" Старый вызов DOS: ");

textcolor(12);

for (i=0;i<5;cprintf("%02X ",p_psp->old_call_dos[i++]));

textcolor(14);

cprintf("\n\r Новый вызов DOS: ");

textcolor(12);

for(i=0;i<3;cprintf("%02X ",p_psp->new_call_dos[i++]));

textcolor(10);

cprintf("\n\n\rАдреса:\n\r");

cprintf("-------\n\r");

textcolor(14);

cprintf(" Конец памяти: ");

textcolor(12);

cprintf("%04X:0000\n\r",p_psp->end_of_mem);

textcolor(14);

cprintf(" Обработчик завершения: ");

textcolor(12);

cprintf("%Fp\n\r",p_psp->term_ptr);

textcolor(14);

cprintf(" Обработчик Ctrl+Break: ");

textcolor(12);

cprintf("%Fp\n\r",p_psp->ctrlbrk_ptr);

textcolor(14);

cprintf(" Обработчик критич.ошибки: ");

textcolor(12);

cprintf("%Fp\n\r",p_psp->criterr_ptr);

textcolor(14);

cprintf(" Стек: ");

textcolor(12);

cprintf("%Fp\n\n\r",p_psp->stack_ptr);

textcolor(14);

cprintf("\n\rРодитель: ");

textcolor(12);

cprintf("%04X ",p_psp->father_psp);

textcolor(0x8b);

cprintf("\n\n\rНажмите любую клавишу...\n\r\7");

getch();

clrscr();

textattr(0x0a);

cprintf("---------------");

cprintf(" Лабораторная работа N10 ");

cprintf("---------------");

cprintf("---------------");

cprintf(" Управление программами ");

cprintf("---------------");

/* Распечатка таблицы файлов */

s=p_psp->JFT_ptr;

textcolor(10);

cprintf("\n\n\rТаблица файлов: ");

textcolor(12);

cprintf("%Fp (%d) ",s,p_psp->JFT_size);

textcolor(11);

if (s==(byte *)p_psp+0x18)

cprintf(" — в этом же PSP");

cprintf("\n\r");

for (i=0; ++i<=p_psp->JFT_size; cprintf("%d ",*(s++)));

textcolor(10);

cprintf("\n\n\rОкружение DOS: ");

textcolor(12);

cprintf("%04X\n\r",p_psp->env_seg);

s=(char *)MK_FP(p_psp->env_seg,0);

textcolor(11);

while(l=strlen(s))

{

cprintf(" %s\n\r",s);

s+=l+1;

 

}

if (dos_ver>2)

{

/* для DOS 3.0 и дальше можно получить строку вызова */

s++;

l=*((int *)s);

textcolor(10);

cprintf("\n\rЧисло строк вызова: ");

textcolor(12);

cprintf("%d\n\r",l);

s+=2;

textcolor(11);

for(i=0; i<l; i++)

{

cprintf("%s\n\r",s);

s+=strlen(s)+1;

}

}

textattr(0x8b);

cprintf("\n\n\n\n\rНажмите любую клавишу...\7");

textattr(0x07);

cprintf("\n\r");

getch();

clrscr();

}

 

/* Определение версии DOS */

void get_DOS_version_h(void)

{

rr.h.ah=0x30;

intdos(&rr,&rr);

dos_ver=rr.h.al;

}

 

/* Получение адреса PSP */

void addr_PSP (void)

{

rr.h.ah=0x62;

intdos(&rr,&rr);

pid=rr.x.bx;

}

 

 

Результаты работы программы

В процессе работы программы на экран была выведена следующая информация:

---------------------------------------------------

-- Лабораторная работа N10 ------

Управление программами ----

Адрес PID = 0BA0

 

Команды:

--------

Завершение — int 20h: CD 20

Старый вызов DOS: 9A F0 FE 1D F0

Новый вызов DOS: CD 21 CB

 

Адреса:

-------

Конец памяти: 9FC0:0000

Обработчик завершения: 0AFA:02B1

Обработчик Ctrl+Break: 0AFA:014A

Обработчик критич.ошибки: 0AFA:0155

Стек: 0E04:0F94

 

Родитель: 0AFA

 

Таблица файлов: 0BA0:0018 (20) — в этом же PSP

1 1 1 0 2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1

 

Окружение DOS: 0A1E

CONFIG=STD

COMSPEC=C:\DOS\COMMAND.COM

PROMPT=$p$g

PATH=D:\WIN;C:\;C:\DOS;C:\ARH;C:\NC;C:\BAT;D:\TP; D:\TP7;D:\BC\BIN

TEMP=d:\~TMP

 

Число строк вызова: 1

D:\TC\TC_LAB10.EXE

 

 

Что нужно знать для экзамена

?

Функции прерывания DOS INT 21H

Ниже приведены базовые функции для прерывания DOS INT 21H. Код функции устанавливается в регистре AH:

Завершение программы (аналогично INT 20H).

Ввод символа с клавиатуры с эхом на экран.

Вывод символа на экран.

Ввод символа из асинхронного коммуникационного канала.

Вывод символа на асинхронный коммуникационный канал.

Вывод символа на печать (гл.19).

Прямой ввод с клавиатуры и вывод на экран.

Ввод с клавиатуры без эха и без проверки Ctrl/Break.

Ввод с клавиатуры без эха с проверкой Ctrl/Break.

Вывод строки символов на экран.

Ввод с клавиатуры с буферизацией.

Проверка наличия ввода с клавиатуры.

Очистка буфера ввода с клавиатуры и запрос на ввод.

0D

Сброс диска.

Установка текущего дисковода.

0F

Открытие файла через FCB.

Закрытие файла через FCB.

Начальный поиск файла по шаблону.

Поиск следующего файла по шаблону.

Удаление файла с диска.

Последовательное чтение файла.

Последовательная запись файла.

Создание файла.

Переименование файла.

Внутренняя операция DOS.

Определение текущего дисковода.

Установка области передачи данных (DTA).

Получение таблицы FAT для текущего дисковода.

Получение FAT для любого дисковода.

Чтение с диска с прямым доступом.

Запись на диск с прямым доступом.

Определение размера файла.

Установка номера записи для прямого доступа.

Установка вектора прерывания.

Создание программного сегмента.

Чтение блока записей с прямым доступом.

Запись блока с прямым доступом.

Преобразование имени файла во внутренние параметры.

Получение даты (CX-год,DН-месяц,DL-день).

Установка даты.

Получение времени (CH-час,CL-мин,DН-с,DL-1/100с).

2D

Установка времени.

Установка/отмена верификации записи на диск.

2F

Получение адреса DTA в регистровой паре ES:BX.

Получение номера версии DOS в регистре АХ.

Завершение программы, после которого она остается резидентной в памяти.

Проверка Ctrl/Break.

Получение вектора прерывания (адреса подпрограммы).

Получение размера свободного пространства на диске.

Получение государственно зависимых форматов.

Создание подкаталога (команда MKDIR).

ЗА

Удаление подкаталога (команда RMDIR).

Установка текущего каталога (команда CHDIR).

3C

Создание файла без использования FCB.

3D

Открытие файла без использования FCB.

3E

Закрытие файла без использования FCB.

3F

Чтение из файла или ввод с устройства.

Запись в файл или вывод на устройство.

Удаление файла из каталога.

Установка позиции для последовательного доступа.

Изменение атрибутов файла.

Управление вводом-выводом для различных устройств.

Дублирование файлового номера.

«Склеивание» дублированных файловых номеров.

Получение текущего каталога.

Выделение памяти из свободного пространства.

Освобождений выделенной памяти.

Изменение длины блока выделенной памяти.

Загрузка/выполнение программы (подпроцесса).

Завершение подпроцесса с возвратом управления.

4D

Получение кода завершения подпроцесса.

Начальный поиск файла по шаблону.

4F

Поиск следующего файла по шаблону.

Получение состояния верификации.

Переименование файла.

Получение/установка даты и времени изменения файла.

Получение расширенного кода ошибки.




Поделиться с друзьями:


Дата добавления: 2017-02-01; Просмотров: 97; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.349 сек.