Другие языки программирования и технологии

Borland C. Чтение файла с помощью прерываний

Помогите разобраться с текстом программы. В данном примере происходит открытие текстового файла с помощью прерываний. Не могу разобраться что и зачем происходит в каждой строке, нужно подписать каждую, или хотябы основные моменты
void second()
{
printf("\nЧтение из файла с помощью прерывания\n");
union REGS in, out;
struct SREGS segregs;
char text[400];
char file[20] = "text.txt";
for(int i = 0; i < 400; i++)
text[i] = '\0';
in.h.ah = 0x3D;
in.h.al = 0x00;
segregs.ds = FP_SEG(file);
in.x.dx = FP_OFF(file);
int86x(0x21, &in, &out, &segregs);
if (out.x.cflag == 1)
printf("Ошибка открытия файла. Ошибка = %d.\n", out.x.ax);
else
{
int handle = out.x.ax;
in.x.bx = handle;
segregs.ds = FP_SEG(text);
in.x.dx = FP_OFF(text);
in.h.ah = 0x3f;
in.x.cx = 400;
int86x(0x21, &in, &out, &segregs);
if (out.x.cflag == 1)
printf("Ошибка чтения файла. Ошибка = %d.\n", out.x.ax);else
{
printf("Чтение успешно. Прочитано %d байт\n", out.x.ax);
printf("%s\n", text);
}
in.h.ah = 0x3E;
in.x.bx = handle;
int86(0x21, &in, &out);
if (out.x.cflag == 1)
printf("Ошибка закрытия файла. Ошибка = %d.\n", out.x.ax);
getch();
}
}
Kirill Alyoshkin
Kirill Alyoshkin
622
я тоже особо не знаю, но предполагаю
void second() // функция
{
printf("\nЧтение из файла с помощью прерывания\n");
union REGS in, out; // объявление нужные, но что внутри не знаю
struct SREGS segregs; // объявление нужные, но что внутри не знаю но предполагаю регистры

char text[400]; // длина буфера
char file[20] = "text.txt"; // имя файла
for(int i = 0; i < 400; i++) text[i] = '\0'; // заполнить текст нулями

in.h.ah = 0x3D; // см функции дос, по идее функция открытия файла
in.h.al = 0x00; // по идее режим чтения
segregs.ds = FP_SEG(file); // регистр ds устанавливается как у файла, тоже гляди ассемблер
in.x.dx = FP_OFF(file); // тоже для файла
int86x(0x21, &in, &out, &segregs); // какая-то функция выполнения int21 прерывания доса
if (out.x.cflag == 1)
printf("Ошибка открытия файла. Ошибка = %d.\n", out.x.ax);
else
{
int handle = out.x.ax; // не помню... хотя вроде а ax хендл открытого файла
in.x.bx = handle; // потом в bx для передачи другим функциям и далее подобно как выше
segregs.ds = FP_SEG(text);
in.x.dx = FP_OFF(text);
in.h.ah = 0x3f; // номер функции для чтения
in.x.cx = 400; // кол. байт для чтения вроде так
int86x(0x21, &in, &out, &segregs); // подобно выше
if (out.x.cflag == 1)
printf("Ошибка чтения файла. Ошибка = %d.\n", out.x.ax);else
{
printf("Чтение успешно. Прочитано %d байт\n", out.x.ax);
printf("%s\n", text);
}
in.h.ah = 0x3E; // функция закрытия
in.x.bx = handle; // в регистр bx хендл файла нужно передать и все остальное подобно
int86(0x21, &in, &out);
if (out.x.cflag == 1)
printf("Ошибка закрытия файла. Ошибка = %d.\n", out.x.ax);
getch();
}
}

Короче, даже не си это, а зачем так извращаться и применять прерывание int 21 досовское мне не ведомо, всегда использовали стандартные библиотечные функции открытия и тд.
Алексей Швергун
Алексей Швергун
52 991
Лучший ответ