Вопрос № 18686: Здрасти!
Хочу вывести строку путем прямого отображения в видеобуфер
Не понимаю как это сделать.
В коде указал смещение строки, которую нужно вывести(DS:SI)
В DX координаты. Я так понял что здесь указывается расположение куда надо выве...Вопрос № 18702: <b>Здравствуйте!</b>
Тут возник такой вопрос:
Как я могу определить наличие FDD дисковода в компьютере
(именно самой железки, а не контроллера в материнской плате)
(В Вин2000 через API или через порты вв/выв дисковода),
когда в не...Вопрос № 18708: push cs ; перехватил прерывание 10h(в другом коде), и на его адрес поставил этот код(резид.часть)
pop ds ; так вот при выводе строки ерунда выводится, убираешь эти строки(cs=ds) - нормально выводит ...
; похоже комп кинулся в ds, а там с...
Вопрос № 18686
Здрасти!
Хочу вывести строку путем прямого отображения в видеобуфер
Не понимаю как это сделать.
В коде указал смещение строки, которую нужно вывести(DS:SI)
В DX координаты. Я так понял что здесь указывается расположение куда надо вывести строку?
AH - атрибут строки. Цвет что ли?
Затем в AX заношу первый символ строки из DS:SI
И в сегмент видеостраницы ES:DI
И так до последнего символа, пока не встретится нуль.
Что не хватает?
Спасибо.
Приложение:
Отправлен: 24.03.2005, 11:43
Вопрос задал: Guran (статус: Посетитель)
Всего ответов отправлено: 4
Отвечает: Voituk Alexander
Здравствуйте, Guran!
Да все работает. Только в dx - это хрен знает что. Ведь ты сохраняешь по адресу DS:DI и DX совершенно не учавсвует в выводе. Как раз за положение строки на экране отвечает DI. Но значение задается не в виде координат, а его нужно рассчитывать, учитывая,что в строке 80 символов.
Кроме того ты забыл поставить 0 в конце строки
String db 'string,0' - это не правильно
String db 'string',0 - это правильно. Иначе на экран выводится всякий мусор из памяти, пока не встретиться 0.
Ответ отправил: Voituk Alexander (статус: 5-ый класс)
Отправлен: 24.03.2005, 12:03 Оценка за ответ: 4
Отвечает: Евгений Иванов
Здравствуйте, Guran!
не хватает установка видеорежима.
mov ax,3
int 16
Удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 24.03.2005, 12:11
Отвечает: Boriss
Здравствуйте, Guran!
Таки '0' = 48!!!
Нужно:
String db 'string',0
Ответ отправил: Boriss (статус: Профессор)
Отправлен: 24.03.2005, 12:16 Оценка за ответ: 4
Отвечает: DSota
Здравствуйте, Guran!
1. "Упакованные" координаты указываются в DI, а dx - тут вообще не используеться...
2. Ah - атрибут, то есть "упакованные" цвет фона и цвет символов
3. Не хватает инициализации DS (она же должна указывать на строку)
Если пускать под ВиндовсХР, не хватает настройки видеостраницы...
Кавычка в слове String стоит не на месте...
Приложение:
Ответ отправил: DSota (статус: Студент)
Отправлен: 24.03.2005, 12:28 Оценка за ответ: 5
Вопрос № 18702
Здравствуйте!
Тут возник такой вопрос:
Как я могу определить наличие FDD дисковода в компьютере
(именно самой железки, а не контроллера в материнской плате)
(В Вин2000 через API или через порты вв/выв дисковода),
когда в него не вставлена дискета?
Заранее спасибо за ответ.
Отправлен: 24.03.2005, 16:56
Вопрос задал: DSota (статус: Студент)
Всего ответов отправлено: 1
Отвечает: Илюхин Павел Евгеньевич
Здравствуйте, DSota!
Используйте API GetDriveType:
UINT GetDriveType(
LPCTSTR lpRootPathName // address of root path
);
Value Meaning
0 The drive type cannot be determined.
1 The root directory does not exist.
DRIVE_REMOVABLE The drive can be removed from the drive.
DRIVE_FIXED The disk cannot be removed from the drive.
DRIVE_REMOTE The drive is a remote (network) drive.
DRIVE_CDROM The drive is a CD-ROM drive.
DRIVE_RAMDISK The drive is a RAM disk.
Это из MSDN. А на asme:
;....
LetterA db "A:", 0
...
invoke GetDriveType, addr LetterA
cmp eax, DRIVE_REMOVABLE
je FloppyOn
; Флоппика нет...
FloppyOn:
; Флоппик есть
*******************
Соответсвенно, можно проверить и B: дисковод на присутсивие
Ответ отправил: Илюхин Павел Евгеньевич (статус: 1-ый класс)
Отправлен: 24.03.2005, 23:32 Оценка за ответ: 3 Комментарий оценки: Именно GetDriveType("A:") говорит только тип устройства, а ничего не проверяет. Попробуй отсоединить шлейф дисковода - включить питание - БИОС скажет, что дисковода нет, а виндовс все равно покажет тип :(((... Но все равно спасибо!
Вопрос № 18708
push cs ; перехватил прерывание 10h(в другом коде), и на его адрес поставил этот код(резид.часть)
pop ds ; так вот при выводе строки ерунда выводится, убираешь эти строки(cs=ds) - нормально выводит ...
; похоже комп кинулся в ds, а там совсем другая петрушка из cs... ?
Приложение:
Отправлен: 24.03.2005, 19:19
Вопрос задал: Guran (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: mvp
Здравствуйте, Guran!
Если я правильно понял, то это резидентная часть обработчика, но как вы её тестировали?
А если это обработчик, то вы просто портите содержимое стека обработчика не сохранив предварительно регистры и выходите через int 20h, не восстановив прежний обработчик. Если же это просто пример кода, то зря ругаете push cs pop ds, т. к. вы привели код *.COM, а COM программе, в начале, cs = ds = es. Уточните вопрос
Ответ отправил: mvp (статус: 1-ый класс)
Отправлен: 24.03.2005, 21:20
Отвечает: Евгений Иванов
Здравствуйте, Guran!
стопорится? ;)
если ты применяешь mov al,[si], то необходимо самому изменять адрес, то есть INC SI делай.
удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 25.03.2005, 00:47
Отвечает: DSota
Здравствуйте, Guran!
1. ds=cs нужно обязательно, похоже не в этих местах дело, а в структуре самого резидента.
2. lodsb эквивалентно mov al,[ds:si];inc si; если поменять, то нужно добавлять "inc si"/
Ответ отправил: DSota (статус: Студент)
Отправлен: 25.03.2005, 08:06