Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Я такого ещё не видел... 
:(
    Опции темы
Nos
  Дата 15.4.2004, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 29.3.2004

Репутация: нет
Всего: нет



Ув. коллеги! Смотрите, что получается...
Вот мой исходник:
#include <iostream.h>
void main()
{
unsigned long int sec;
unsigned long int head;
unsigned long int cyl;
unsigned long buf;
asm {
mov ah, 0x48;
mov dl, 0x80;
lea si, buf;
int 0x13;
mov ax, ds:[si+4];
mov word ptr cyl[0], ax;
mov ax, ds:[si+8];
mov word ptr head[0], ax;
mov ax, ds:[si+16];
mov word ptr sec[0], ax;
}
cout << "Cylinders= " << cyl;
cout << "Heads=" << head;
cout << "Sectors=" << sec;
}

Как я себе это представляю:
После того, как я вызываю обработчик прерывания, оно отрабатывает, получает необходимые мне параметры, после этого я из ячеек считываю то, что мне надо и типа вывожу на экран...

Как это работает:
После того, как вызывается прерывание (строка Int 0x13), в ячейках sec, cyl, head уже имею ПРАВИЛЬНЫЕ параметры до того, как явно запишу их туда (но строки между "int 0x13" и "}" убрать тоже нельзя)!!! А попытка вывести на экран при помощи cout заканчивается зависанием (типа "Программа пытается выполнить недопустимую операцию..." или что-то в этом роде...)

Мой вопрос:
Каким образом данные попадают в переменные автоматически?! Может быть у кого-то есть какие-нибудь мысли на этот счёт? Поделитесь, пожалуйста!

Это сообщение отредактировал(а) Nos - 15.4.2004, 20:08
PM MAIL   Вверх
Chingachguk
Дата 15.4.2004, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата
в ячейках sec, cyl, head уже имею ПРАВИЛЬНЫЕ параметры до того, как явно запишу их туда


Ты передал в ds:si адрес буфера этому прерыванию - оно и заполнило его

Цитата
А попытка вывести на экран при помощи cout заканчивается зависанием


Скорее всего, данные затерли адрес возврата и тп. Буфер не long, а больше...



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Nos
Дата 16.4.2004, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 29.3.2004

Репутация: нет
Всего: нет



Да, буфер я выделил, но ведь это чисто формально - во-первых его размер меньше раз в 16, чем надо, а во-вторых я же не описавыл структуру этого буфера (какие переменные и по сколько байт)...
PM MAIL   Вверх
Jin X
Дата 16.4.2004, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 5.3.2004

Репутация: 1
Всего: 1



Размер буффера не long, а от 0x1A до 0x42. В первое слово (одиночное, короткое) нужно записать размер буфера. Ты чего такой невнимательный?
Теперь объясню, почему cyl, head, sec запоняются нужными значениями. Ты создаёшь локальные переменные sec, head, cyl, buf. В памяти они расположены так:
Код
buf dd ?
cyl dd ?
head dd ?
sec dd ?
Ты передаёшь int 13h адрес Buf. А теперь посмотрим, каким должен быть этот буффер:
Код
size dw ?
flags dw ?
cyl dd ?
head dd ?
sec dd ?
totalsec dq ?
bytespersec dw ?

Так что, в принципе, можешь всё оставить так, только в Buf занеси 0x1A и перед sec создай ещё две переменные:
Код
unsigned short int bytespersec;
ULONG64 totalsec
(ну, а mov ax, ds:[si+4]; / mov word ptr cyl[0], ax; убери)
--------------------
Бойся своей мечты, ибо она осуществима!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0415 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.