![]() |
|
|
![]()
|
|
| Nos |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| Chingachguk |
|
||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Ты передал в ds:si адрес буфера этому прерыванию - оно и заполнило его
Скорее всего, данные затерли адрес возврата и тп. Буфер не long, а больше... -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
| Nos |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 29.3.2004 Репутация: нет Всего: нет |
Да, буфер я выделил, но ведь это чисто формально - во-первых его размер меньше раз в 16, чем надо, а во-вторых я же не описавыл структуру этого буфера (какие переменные и по сколько байт)...
|
|||
|
||||
| Jin X |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 5.3.2004 Репутация: 1 Всего: 1 |
Размер буффера не long, а от 0x1A до 0x42. В первое слово (одиночное, короткое) нужно записать размер буфера. Ты чего такой невнимательный?
Теперь объясню, почему cyl, head, sec запоняются нужными значениями. Ты создаёшь локальные переменные sec, head, cyl, buf. В памяти они расположены так:
Так что, в принципе, можешь всё оставить так, только в Buf занеси 0x1A и перед sec создай ещё две переменные:
--------------------
Бойся своей мечты, ибо она осуществима! |
||||||
|
|||||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |