Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Techhelp

841
06 февраля 2007 года
_nic
199 / / 29.07.2006
Сдавал недавно лобароторные в результате з программы надо переписать , кинулся я значит смотреть нужные прерывания и регистры в этом самом techhelp но он какого то :mad: перестал запускатся , вылетает hhelp.com с сообщением что ntvdm обнаружил недопустимую операцию :( .Что теперь делать незнаю ,доделать все надо как можно быстрее.Может кто даст ссылку на нормальный Techhelp ?Или поможет с инфой по задачам?
1я и 2я надо используя прерывание int21 определить текущий диск; номер версии DOS , серийный номер произвоодителя.
3я замаскировать прерывание от флоппика
9
06 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Int 21h
Fun 19h: Определение текущего диска. Возвращает в AL номер текущего накопителя (стандартная нумерация устройств).
Fun 30h: Определение номера версии DOS. Возвращает: старший разряд номера версии в AL, младший в AH.

P.S. Больше пока не вспомнил.
841
07 февраля 2007 года
_nic
199 / / 29.07.2006
Вот кое что по первым двум накропал
#include <dos.h>
#include <stdio.h>
#include <conio.h>
void main(void)
{
_AH=0x30;
geninterrupt(0x21);
printf((char*)_AL,".",(char*)_AH);
getch();
}


#include <dos.h>
#include <stdio.h>
#include <conio.h>
void main(void)
{
unsigned int a;
_AH=0x19;
a=_AL;
geninterrupt(0x21);
if(a==0)
{
printf("disk a:\n");
}
if(a==2)
{
printf("disk c:\n");
}
getch();
}

Кто розбирается подскажите правильно или нет , или може чего то ещё просто нехватает?
9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Вот так красивше будет (C-style)
Код:
#include <dos.h>
#include <stdio.h>
#include <conio.h>

/* определить текущий диск */
char get_current_drive( void )
{
    _AH = 0x19;
    geninterrupt(0x21);

    return 'a' + (int)_AL;
}

int main( void )
{
    printf( "Current drive: %s\n", get_current_drive() );
    getch();

    return 0;
}
841
07 февраля 2007 года
_nic
199 / / 29.07.2006
Значит с определением диска правильно?А с определением версии DOS ?И что может означать "серийный номер произвоодителя" в таком контексте?И где можно было бы поискать инфу о маскировки прерывания , гугль к сожалению толком и непомог :(
9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: _nic
...А с определением версии DOS ?И что может означать "серийный номер произвоодителя" в таком контексте?


Видимо, имеется ввиду следующее:
Функция 30h прерывания 21h, дополнительно помещает в регистры BX и СХ номер серии (для версий DOS от [COLOR="Blue"]IBM [/COLOR]- это значение = 0, другие значения - другие фирмы). Какие значения у каких фирм - я без понятия, ищи...

9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Относительно маскирования прерывания от флоповода.
Возможно, требуется подменить собственным резидентом INT13h, который, например, в случае обращения к флопу ничего делать не будет? Хотя, это уже прерывание BIOS.

Добавлено: а как ты искал, интересно? В гугле - вторая ссылка. По-моему, все понятно. И даже с примерами на C.
841
07 февраля 2007 года
_nic
199 / / 29.07.2006
Цитата: Lerkin
Относительно маскирования прерывания от флоповода.
Возможно, требуется подменить собственным резидентом INT13h, который, например, в случае обращения к флопу ничего делать не будет? Хотя, это уже прерывание BIOS.

Добавлено: а как ты искал, интересно? В гугле - вторая ссылка. По-моему, все понятно. И даже с примерами на C.


Попробовал сделать как там написанно

Код:
#include <dos.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream.h>
void main(void)
{
int a;
cout<<"prerivanie flopika budet zamaskirovano \n";
getch();
outp(0x21,0x40);
cout<<"prerivanie plopika zamaskirovano,vernut nazad 1 vijti 2 \n";
cin>>a;
if(a==1)
{
outp(0x21,0);
}
if(a==2)
{
exit(0);
}
}

Компилятор выводит предупреждение "code has no effect".И программа как нестранно неработает тоесть флоппик работает, хотя может это над о под чистым досом запускать.
9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Ну, а как ты думаешь должна работать такая конструкция?
Код:
...
    cin>>a;
    if(a==1)
    {
    outp(0x21,0);
    }
    if(a==2)
    {
    exit(0);
    }
...

Допустим, ты запустил программу и ввел 1. Тогда выполняется первое условие и программа выходит. Ты из под Винды работаешь? Тогда прерывание, естественно, восстанавливается.
Второе условие - вообще не имеет смысла. Что через него программа выходит, что без него.

Лучше, наверное, так:
Код:
int main( void )
{
    cout << "Прерывание маскировано...\n";
    outp(0x21, 0x40);

    getch();
    cout << "Прерывание размаскировано.\n";
    outp(0x21, 0x00);

    return 0;
}
841
07 февраля 2007 года
_nic
199 / / 29.07.2006
Я понял но неработает строка outp(0x21,0x40) (если вообще неиспользовать никакого ветвления)на неё компилятор и выдавал предупреждение.
PS:там где надо вывести версию DOS то содержимое регистров ещё надо как то преобразовать так как если выводить просто их содержимое то получается чепуха вроде &#9827; &#221;
9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: _nic
Я понял но неработает строка outp(0x21,0x40)


Она работает, но работает в DOS, а не в консоли Windows.

Цитата: _nic
PS:там где надо вывести версию DOS то содержимое регистров ещё надо как то преобразовать так как если выводить просто их содержимое то получается чепуха вроде &#9827; &#221;


Ну, разумеется... Надо преобразовать содержимое регистров в строку. смотри функцию itoa(...);

841
07 февраля 2007 года
_nic
199 / / 29.07.2006
Цитата: Lerkin

Ну, разумеется... Надо преобразовать содержимое регистров в строку. смотри функцию itoa(...);


А можно точнее ,какого типа в содержимое оказывается в регистрах ?

9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: _nic
А можно точнее ,какого типа в содержимое оказывается в регистрах ?



Целочисленного типа. Соответственно, его надо преобразовать к строке.

9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
короче, вот код:
 
Код:
...
    char major[10], minor[10];

    itoa((int)_AL, major, 10);
    itoa((int)_AH, minor, 10);

    printf("%s.%s\n", major, minor);
...
841
07 февраля 2007 года
_nic
199 / / 29.07.2006
Из AL выводится 236,из AH - 255,из BX - 10, CX - 0.Это нормально?
9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: _nic
Из AL выводится 236,из AH - 255,из BX - 10, CX - 0.Это нормально?



Какая операционка?

841
07 февраля 2007 года
_nic
199 / / 29.07.2006
Цитата: Lerkin
Какая операционка?


XP SP2 Pro

9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Короче, для "чистой" DOS этот пример работает. А как насчет Windows - фиг его знает.
841
07 февраля 2007 года
_nic
199 / / 29.07.2006
Создал загрузочную дискету загрузился с неё запустил выводит тоже самое.Содержимое такой дискеты считается чистым досом?Или я чего то не того написал.
Код:
#include <dos.h>
#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
void main(void)
{
char a[10],b[10],c[10],d[10];
_AH=0x30;
geninterrupt(0x21);
itoa((int)_AL,a,10);
itoa((int)_AH,b,10);
itoa((int)_BX,c,10);
itoa((int)_CX,d,10);
printf("%s.%s\n",a,b);
printf("kod vend ");
printf("%s.%s\n",c,d);
getch();
}
9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Не считается. А чем компилил?
841
07 февраля 2007 года
_nic
199 / / 29.07.2006
Цитата: Lerkin
А чем компилил?


Borland Turbo C++ 3.0

9
07 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Цитата: _nic
Borland Turbo C++ 3.0



Найди какой-нить MS-DOS (3.30 - 6.22) и юзай на нем...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог