Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с секторами дискеты  (Прочитано 10159 раз)
0 Пользователей и 1 Гость смотрят эту тему.
irinak
Гость
« : 07-02-2010 13:38 » new

Нужно считать в файл с дискеты указанное количество секторов. И наоборот: с файла записать на дискету указанное число секторов.
Борланд С + ассемблер.
Вот мои начинания, несовсем успешные, может кто поможет.
Спасибо огромное.

Код:
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <stdlib.h>
#include <time.h>
static char dat[512], dat1[512];
int segm, segm1, off1, off;
unsigned char st1, dor, sek;
char disc;
void main (void) {
disc=0x00;
//for (int i=0; i<100; i++)
//{
//dat[i] = i%10;
//}

_asm {
mov ah,0x00
mov dl,disc
int 13h
}
puts("Enter storonu 1 2");
scanf("%d",&st1);
puts("Enter doroshku");
scanf("%d",&dor);
puts("Enter kol cektorov");
scanf("%d",&sek);
FILE *fil, *ou;

fil=fopen("c:\\temp\\123.txt","wt");
ou=fopen("c:\\temp\\1234.txt","rt");

//for (int i=0; i<100; i++)
//{
fscanf(ou,"%s",&dat);
//}

for (int i=0; i<100; i++)
{
printf("%d",dat[i]);
}


off=FP_OFF(dat);
segm=FP_SEG(dat);


_asm{
mov bx,off
mov es,segm
mov ah,0x03
mov al,sek
mov ch,dor
mov cl,0x1
mov dh,st1
mov dl,disc
int 13h
}

//getchar();
puts("scital");
getchar();
//puts("pishu");
delay(1000);
puts("pishu");
off1=FP_OFF(dat1);
segm1=FP_SEG(dat1);

_asm{
mov bx,off1
mov es,segm1
mov ah,0x02
mov al,sek
mov ch,dor
mov cl,0x1
mov dh,st1
mov dl,disc
int 13h
}

for (i=0; i<100; i++)
fprintf (fil, "%d",dat1[i]);

fclose(fil);

getchar();

}
« Последнее редактирование: 07-02-2010 13:54 от RXL » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 07-02-2010 13:54 » 

irinak, что не получается?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
irinak
Гость
« Ответ #2 : 07-02-2010 14:20 » 

Считывает "левые" символы.(
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 07-02-2010 16:47 » 

Возьми программу TechHelp - это хороший справочник по вызовам DOS и BIOS - и сверься, нет ли у тебя ошибки в ассемблерных вставках. Потом пройдись отладчиком и проверь перед int 13h, все ли параметры верны.
TechHelp можно взять здесь: https://club.shelek.ru/viewfiles.php?id=3
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
irinak
Гость
« Ответ #4 : 07-02-2010 21:58 » 

Возьми программу TechHelp - это хороший справочник по вызовам DOS и BIOS - и сверься, нет ли у тебя ошибки в ассемблерных вставках. Потом пройдись отладчиком и проверь перед int 13h, все ли параметры верны.
TechHelp можно взять здесь: https://club.shelek.ru/viewfiles.php?id=3
Ошибок в ассемблерных вставках не было.
Проблема была в другом, но уже всё работает с корректировками)

Сейчас возник вопрос, как из файла записать на дискету указанное количество секторов?
Не подскажете ли?
Спасибо большое-большое)
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 07-02-2010 22:48 » 

irinak, все же рекомендую скачать доку - там есть описание многих функций DOS, в том числе и отрытие/чтение/закрытие файла.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
irinak
Гость
« Ответ #6 : 08-02-2010 20:47 » 

Ребята, Новая проблема))
С файла на диске записываю на дискету указанное количество секторов.

Код:
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
void Zapis(void);


int main()
{
    Zapis();
    getch();
    return 0;
}



void Zapis(){
int i,sec;
char buf[5000];
printf("Vvedite name faila:\n");
scanf("%s",buf);
printf("Vvedite kol-vo sectorov:\n");
scanf("%d",&sec);
FILE *fr=fopen(buf,"rb");
fread(buf,sizeof(char),512*sec,fr);
char *seg,*off,*ptr1;
int disc;
disc=0x00;
{
    _AH=0x00;
    _DL=disc;
    geninterrupt(0x13);
}
  do{
    off=(char*) FP_OFF(buf);
    seg=(char*) FP_SEG(buf);  
    ptr1=(char*) MK_FP(seg,off);
    _BX = (int ) off;
    _ES = (int ) seg;
    _AH = 0x03;
    _AL = sec;
    _CH = 1;
    _CL = 1;
    _DH = 1;
    _DL = disc;
    geninterrupt(0x13);
  }while((_AH!=0x0 || _AL==0));
  printf("GOTOVO!\n");

}
А как задать имя  файла, в который записать указанное количество секторов с файла на диске?

Спасибо за помощь)
« Последнее редактирование: 08-02-2010 20:48 от Вад » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 08-02-2010 22:06 » 

Если ты хочеш на физическом уровне разобраться, какому файлу принадлежит какой сектор. То ты должен разбирать сам файловую систему. Других возможностей нет. Т.е. сначало по каталогу, а затем по таблицам FAT отслеживать принадлежность секторов.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines