Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 521
от 12.04.2003, 01:30

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 2963
Отправлено ответов: 8742
Активность: 295.0 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Joy
Статус: Опытный
Общий рейтинг: 124.28
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 118.72
[Подробней >>]
keleb-glin
Статус: Опытный
Общий рейтинг: 109.3
[Подробней >>]
 
Maverick
Статус: Профессиональный
Общий рейтинг: 136.16
URL: Задачи по ассемблеру
Телефон: 89039415024 (BeeLine GSM)
[Подробней >>]
St
Статус: Опытный
Общий рейтинг: 109.05
[Подробней >>]
Samodelkin
Статус: Доверительный
Общий рейтинг: 124.52
[Подробней >>]
 
Bob Johnson
Статус: Профессиональный
Общий рейтинг: 150.31
URL: Программирование
[Подробней >>]
Eugene
Статус: Профессиональный
Общий рейтинг: 109.2
URL: мощный файловый архив
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 2917. Здравствуйте! Подскажите пожалуйста как написать резидент, который мог бы считывать нажатую клавишу... (ответов: 4)
Вопрос № 2918. Привет, эксперты! Кто-нибудь знаком с тем, как дос выделяет память при запуске программ? Нужно счита... (ответов: 2)
Вопрос № 2919. Здравствуйте уважаемые эксперты! 1. В Win 2K/XP некоторые программы типа Partition Magic, Diskeeper,... (ответов: 3)
Вопрос № 2920. Приветствую вас! Задумал тут такую интересную вещь(это не вирус :) так, экспериментирую). В общем, з... (ответов: 1)
Вопрос № 2921. Здраствуйте. Ниже кусок кода. Выводит на экран текст поверх всех окон. Как можно сделать так, чтобы ... (ответов: 1)
Вопрос № 2922. Господа эксперты, прокоментируйте подробнее кусок кода который должен выполняться сразу после перек... (ответов: 2)
Вопрос № 2923. Здравствуйте господа Эксперты. Вопрос такой: имеется RichEdit, посылаю ему EM_STREAMIN (хочу заполни... (ответов: 1)
Вопрос № 2924. Данная прога работает на пне втором,на пне четвертом,а вот на первом пне и на заморенной четверке не... (ответов: 1)
Вопрос № 2925. Здравствуйте, эксперты. Подскажите, пожалуйста! У меня, к примеру, в DS:SI находится число (001А)-ре... (ответов: 4)
Вопрос № 2926. Здравствуйте. У меня такой вот вопрос: Как можно считать и тут же выводить сколько записано на диске... (ответов: 3)
Вопрос № 2927. Добрый день, эксперты! У меня на работе сломан компьютер(процессор Celeron 366 MНz, причина такая: п... (ответов: 3)

Вопросов: 11, ответов: 25


 Вопрос № 2917

Здравствуйте!
Подскажите пожалуйста как написать резидент,
который мог бы считывать нажатую клавишу и выводить ее на экран.Если у кого есть что-то похожее, киньте мне на мыло.
ksa@mail.kz
Зарание благодарен.



Вопрос отправлен: 06.04.2003, 22:02
Отправитель: Stas (ksa@mail.kz)

[Следующий вопрос >>] [Список вопросов]

Отвечает Joy

Добрый день, Stas!
Пишешь резидент обрабатывающий прерывание 9h. В обработчике выводишь на экран тот символ, который в буфере.

Ответ отправлен: 09.04.2003, 11:56
Отправитель: Joy


Отвечает Ayl

Здравствуйте, Stas!
Для какой оси? Если для ДОСа - то все просто. Перехватываешь прерывание 9, получаешь нажатую клавишу и затем выводишь ее на экран.
Только тут нужно определиться, что ты хочешь в результате получить. Потому что 9-е прерывание вызывается всякий раз, когда клавиша нажимается или отпускается. Кроме этого, некоторые клавиши вызывают срабатывание прерывания 9 несколько раз подряд. К тому же контроллер клавиатуры (который и отвечает за вызов этого прерывания) выдает скен-код клавиши. Который совсем не похож на коды символов (например, ASCII).
То есть, если тебе просто нужно вывести скен-код клавиши - перехватываешь 9-е прерывание, читаешь код из порта 60h и выводишь его на экран в нужном тебе виде.
Если же ты хочешь вывести именно символ (с учетом клавиш-переключателей и т.п.), то тебе нужно либо самому заниматся переводом скен-кодов в символы, либо использовать следующий трюк:
1. Перехватываешь прерывание 9
2. В начале обработчика запоминаешь значение переменной по адресу 0040:001С. Это указатель на конец буфера клавиатуры - именно сюда будет занесена нажатая клавиша (если будет).
3. Вызываешь старый обработчик 9-го прерывания:
pushf
call dword ptr cs:[Old_Int09]
4. Проверяешь, что значение по адресу 0040:001C изменилось. Если нет - выходишь из обработчика
5. Выбираешь из буфера клавиатуры преобразованный символ (2 байта: старший - скен-код, младший - собственно ASCII-код). Если значение по адресу 0040:001C на 2-м шаге было сохранено в регистре bx (например), то выбор символа может быть осуществелен так:
push 0
pop es
mov ax, es:[bx]
6. Выводишь символ на экран и выходишь из обработчика прерывания.

Ответ отправлен: 07.04.2003, 12:31
Отправитель: Ayl


Отвечает keleb-glin

Приветствую Вас, Stas!
Ничего сложного. Вешаешь резидент на 9h - прерывание, а там - чтение из 60h - порта. Прочтёшь скан-код, а потом - переводи в ascii, предварительно осведомившись о флагах клавы по адр. 40h : 17h. Вообще, поищи где-нибудь какой-нибудь "SDK" под ДОС. Там обычно многое написано.


Ответ отправлен: 09.04.2003, 19:40
Отправитель: keleb-glin


Отвечает Maverick

Приветствую Вас, Stas!
Надеюсь знаком с резидентами?
Перехватываешь прерывание клавиатуры (int 09h)
В обработчике:
push ax
in al,60h ;теперь в al скан код, что хошь то и делай
pop ax
jmp -на старый обработчик


Приложение:

Ответ отправлен: 07.04.2003, 04:43
Отправитель: Maverick


 Вопрос № 2918

Привет, эксперты!
Кто-нибудь знаком с тем, как дос выделяет память при запуске программ? Нужно считать файл в другой сегмент и jmp на его первый байт, т.е. попытка выполнить его. Облом :(
Че то, чего я не перепробовал, возникает куча проблем.
Кто с этим знаком, мыльните на maverick@nightmail.ru
Спасибо
HEEEEEEEEEELP!!!!!!!!!!



Вопрос отправлен: 07.04.2003, 04:57
Отправитель: Maverick (maverick@nightmail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает St

Привет, Maverick!
Возможно вы не освободили память перед тем как писать туда содержимое файла? В будущем постарайтесь написать подробнее в чем собственно состоят эти проблемы, а то приходится гадать на кофейной гуще.
St

Ответ отправлен: 07.04.2003, 12:05
Отправитель: St


Отвечает Samodelkin

Доброе время суток, Maverick!
ну если у тя это оверлей, то и грузи как оверлей

Ответ отправлен: 08.04.2003, 04:59
Отправитель: Samodelkin


 Вопрос № 2919

Здравствуйте уважаемые эксперты!
1. В Win 2K/XP некоторые программы типа Partition Magic, Diskeeper, Scandisk могут выполняться до загрузки системы в консоли.
Как работают эти программы? И как можно свою программу выполнить до загрузки системы?
2. Зачем перед именем метки ставить @@ (две собаки), например: @@label ?
Что от этого меняется?
Спасибо.



Вопрос отправлен: 07.04.2003, 15:43
Отправитель: Sledge (sledge@nm.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает St

Привет, Sledge!
2) В Тасм это признак того что метка является локальной - то есть она действует в пределах данной процедуры, на нее нельзя перейти из другой процедуры, но зато в программе может быть несколько одинаковых меток (в разных процедурах конечно). Также @@ являются знаком и локальных переменных.
St

Ответ отправлен: 07.04.2003, 18:11
Отправитель: St


Отвечает keleb-glin

Добрый день, Sledge!
На первый овечать не буду, думать лень.
На второй отвечу. с @@ принять начинать имена локальных меток, а то когда много include_ов и т.д. сложно разбираться.

Ответ отправлен: 09.04.2003, 19:35
Отправитель: keleb-glin


Отвечает Bob Johnson

Здравствуйте, Sledge!
2. Это означает, что метка локальная. Локальная метка доступна только внутри процедуры, где она определена. Это позволяет нескольким различным процедурам содержать локальные метки с одинаковыми именами (например, @@1, @@2, ...), что достаточно удобно.


Ответ отправлен: 08.04.2003, 18:14
Отправитель: Bob Johnson


 Вопрос № 2920

Приветствую вас! Задумал тут такую интересную вещь(это не вирус :) так, экспериментирую). В общем, заменил вфайле system.ini Explorer.exe своей прогой. Моя прога выполняет сначала свои "чёрные" :) дела, а потом, чтобы виндапродолжала работу, должна запустить оригинальный Explorer.exe. Так вот, она как-то неправильно запускает, т.е. запускаетобычное explorer-овское окно, а не оболочку с taskbar-ом, значками и пр. Запускаю так(это из Delphi, но я думаю,понятно): ShellExecute(HWND(Nil),PChar('open'),PChar(c:WindowsExplorer.exe'),PChar(''),PChar(''),SW_SHOWNORMAL). Каксделать, чтобы запускалось то, что нужно, т.е. то, что винда сама запускает, как если бы в system.ini стоялExplorer.exe? Может, у Explorer.exe какие параметры есть, а может надо использовать более навороченную функциюCreateProcess(я в ней ничего не понимаю)? Если да, то приведите, пожалуйста, пример. Спасибо!



Вопрос отправлен: 07.04.2003, 17:26
Отправитель: Андрей V.

[Следующий вопрос >>] [Список вопросов]

Отвечает Maverick

Приветствую Вас, Андрей V.!
А не интересней и красивей ли будет написать программу, которая будет заражать explorer. В вирных журналах по этому пресс инфы... И ненадо ни system.ini нифига другого менять.


Ответ отправлен: 08.04.2003, 05:07
Отправитель: Maverick


 Вопрос № 2921

Здраствуйте.
Ниже кусок кода. Выводит на экран текст поверх всех окон.
Как можно сделать так, чтобы только текст выводился
на экран, а фона небыло. И чтобы при сверывании или развертовании
других окон текст не прятался. и еще как потом его уничтожить?


Приложение:


Вопрос отправлен: 07.04.2003, 18:59
Отправитель: Swi

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Приветствую Вас, Swi!
1. SetBkMode (hDc, TRANSPARENT);
> И чтобы при сверывании или развертовании
других окон текст не прятался
Никак. Только надо создавать свое окно, размещаеть его поверх всех (WS_EX_TOPMOST) в котором только рисовать текст (например, на WM_ERASEBKGND). В этом случае и уничтожить его будет можно простым закрытием окна (тогда windows сама перерисует все, что было под ним).


Ответ отправлен: 08.04.2003, 18:14
Отправитель: Bob Johnson


 Вопрос № 2922

Господа эксперты, прокоментируйте подробнее кусок кода который должен выполняться
сразу после переключения в Pmode. (речь идет о db 0eah и деле)
;вот кусок кода из книги Юрова (пример 17)
;переключаемся в защищенный режим
mov eax,cr0
or al,1
mov cr0,eax
;настраиваем регистры
db 0eah ;машинный код команды jmp
dw offset protect ;смещение метки перехода в сегменте команд
dw 30h ;селектор сегмента кода в GDT
---------------------
;(С) Александр Семенко
; Переходим в защищённый режим:
mov eax,cr0
or al,1
mov cr0,eax
; Процессор в защищённом режиме
db 0eah
dw P_Mode_entry
dw Code_selector



Вопрос отправлен: 07.04.2003, 19:26
Отправитель: bondlab

[Следующий вопрос >>] [Список вопросов]

Отвечает Eugene

Здравствуйте, bondlab!
Это всего навсего команда дальнего перехода. Только у Семенко вместо чисел стоят мнемонические обозначения. И ещё, адресация происходит немножко по другому, нечем в реальном режиме. В сегментных регистрах должны находится селекторы сегментов, а не их адреса. А дальний переход как раз и загружает их значения в сегментные регистры.

Ответ отправлен: 08.04.2003, 09:03
Отправитель: Eugene


Отвечает keleb-glin

Приветствую Вас, bondlab!
0eah - машинный код команды jmp far, после него должны стоять смещение и сегмент прыжка.


Ответ отправлен: 09.04.2003, 19:32
Отправитель: keleb-glin


 Вопрос № 2923

Здравствуйте господа Эксперты.
Вопрос такой: имеется RichEdit, посылаю ему EM_STREAMIN (хочу заполнить его содержимое текстом). Последний парамет EDITSTREAM указывает на функцию (см. приложение). Mem2 - указатель, возвращенный LocalLock и содержащий требуемый текст. Я так понял, что все параметры функции, кроме первого, надо заполнять мне самому (для EM_STREAMIN), так вот я и заполняю. Результата некакого, попробовал в этот самый буфер уже в процедуре записать чего-нить, тоже самое! И вообще эта процедура - это новый Thred или при ее выполнении вся моя прога стоит? Короче ничего не понимаю, направте меня на путь истинный, укажите где я тут опять все напутал... (хотелось-бы увидить пример работающей функции EditStreamCallback).


Приложение:


Вопрос отправлен: 07.04.2003, 19:37
Отправитель: GHopper

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Доброе время суток, GHopper!
> Я так понял, что все параметры функции, кроме первого, надо заполнять ...
А как вообще можно заполнять параметры внутри функции???
Первый тебе вообще не нужен.
Второй уже содержит указатель на буфер данных. Вот туда ты и будешь записывать данные.
Третий параметр определяет размер буфера - ты должен обработать не более этого количества байт.
Четвертый параметр содержит указатель на двойное слово, в которое (не в параметр!!!) ты занесешь, сколько байт ты занес в буфер. Ты можешь заносить меньше, чем размер полного буфера.


Ответ отправлен: 08.04.2003, 18:15
Отправитель: Bob Johnson


 Вопрос № 2924

Данная прога работает на пне втором,на пне четвертом,а вот
на первом пне и на заморенной четверке не хочет.В массиве
TIMERS переменные сами по себе меняют значения FALSE na TRUE и обратно,Пробовал настраивать в биосе порт ноизменения режимов SSP EPP and ECP ни привело к результату. Что делать непонятно Выходит что меньше чем пень второй этой проге не подходит ,но по моему это не так.
Управление через ЛПТ 2-9 нога через тумблера на 18 ногу.

Заранее спасибо.


Приложение:


Вопрос отправлен: 07.04.2003, 19:53
Отправитель: anton (oven_mars@rambler.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Joy

Доброе время суток, anton!
А что пишет? Если что-то типа "Рантайм эррор 200", то пиши на joy@stsland.ru - вышлю лекарство. У Паская какая-то ошибка с модулем CRT.

Ответ отправлен: 09.04.2003, 11:56
Отправитель: Joy


 Вопрос № 2925

Здравствуйте, эксперты. Подскажите, пожалуйста! У меня, к примеру, в DS:SI находится число (001А)-результат предыдущих обработок, но это уже строка. Как же мне вывести теперь это число с помощью ah=09h, dx=offset STR, int 21h?
Заранее благодарен Вам.



Вопрос отправлен: 07.04.2003, 22:56
Отправитель: Veles

[Следующий вопрос >>] [Список вопросов]

Отвечает keleb-glin

Доброе время суток, Veles!
Если в конце строки не стоит '$', то никак (разве что затереть следующий после конца байт). А вообще, можно скопировать в отдельный буфер и в конце поставить '$'


Ответ отправлен: 09.04.2003, 19:29
Отправитель: keleb-glin


Отвечает Bob Johnson

Здравствуйте, Veles!
Если у тебя ds:si указывает на строку в памяти, то просто
mov dx, si
mov ah, 9
int 21h
Только не забудь в ее конец дописать '$'. Это можно сделать так. Пусть bx = длина строки, тогда
mov byte ptr [bx + si], '$'


Ответ отправлен: 08.04.2003, 21:02
Отправитель: Bob Johnson


Отвечает Joy

Здравствуйте, Veles!
Почитай рассылку. Очень много примеров пролетало по мереводу чисел в строку ASCII.

Ответ отправлен: 09.04.2003, 11:56
Отправитель: Joy


Отвечает Maverick

Добрый день, Veles!
Че то непонятно... Напиши конкретно пример.
DS:SI указывают на строку? Если с помощью 9 ф-ии, то в конце строки должно стоять $.
mov ah,9h
mov dx,si
int 21h
....
или тебе надо вывести именно 001A

Ответ отправлен: 08.04.2003, 05:07
Отправитель: Maverick


 Вопрос № 2926

Здравствуйте.
У меня такой вот вопрос:
Как можно считать и тут же выводить сколько записано на дискетку баит, если для записи используется функция BIOS 03h int 13 ?



Вопрос отправлен: 08.04.2003, 00:59
Отправитель: Кислик

[Следующий вопрос >>] [Список вопросов]

Отвечает keleb-glin

Доброе время суток, Кислик!
Вообще, кол-во записанных байт будет в al, но ты лучше проверь.


Ответ отправлен: 09.04.2003, 19:27
Отправитель: keleb-glin


Отвечает Ayl

Здравствуйте, Кислик!
Так как функция 3 прерывания 13h выполняет запись на диск посекторно, то кол-во байт, записанных на дискету, равно числу в AL перед вызовом функции (количество записываемых секторов) на размер сектора в байтах (обычно 512).

Ответ отправлен: 09.04.2003, 14:22
Отправитель: Ayl


Отвечает Maverick

Приветствую Вас, Кислик!
Ну так перехватывай это прерывание. И смотри, если это ф-ия 03h, то гляди, что находится в регистрах, т.е. сколько хотят записать секторов и т.д. А потом переводи в байты.


Ответ отправлен: 08.04.2003, 05:07
Отправитель: Maverick


 Вопрос № 2927

Добрый день, эксперты!
У меня на работе сломан компьютер(процессор Celeron 366 MНz, причина такая: при загрузке выдается сообщение
"Trend ChipAwayVirus (R) On Guard Ver 1.64", если в Setupe
поменять в Anti-Virus Protection Enabled на Disabled, то все-равно Windows не загружается.
Что надо делать?



Вопрос отправлен: 08.04.2003, 01:25
Отправитель: niklaptev (niklaptev@rambler.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Здравствуйте, niklaptev!
Переустановить Windows.


Ответ отправлен: 08.04.2003, 21:03
Отправитель: Bob Johnson


Отвечает Maverick

Здравствуйте, niklaptev!
Проверь винчестер антивирусом на другом компе.
Можно сделать так:
грузись с дискеты
пиши fdisk.exe /mbr (вроде так)
И пробуй перезагрузится, если получилось, то не запускай никаких программ с винта, а ставь свежий антивирь и попер...
Это или корявый загрузочный вирь или деструктивный загрузочный.


Ответ отправлен: 08.04.2003, 05:07
Отправитель: Maverick


Отвечает Joy

Добрый день, niklaptev!
Есть вариант поменять покладку между клавиатурой и креслом :)
А если серьезно, то ты так и не написал, что происходит. После чего это случилось, что ты уже пробывал делать, и т.д. Напиши по-подробней что происходит (и что не происходит).

Ответ отправлен: 09.04.2003, 11:55
Отправитель: Joy



Форма отправки вопроса

Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (36)
C / C++ (27)
Perl (6)
Delphi (16)
Pascal (21)
Basic / VBA (10)
Java / JavaScript (9)
PHP (4)
MySQL / MSSQL (5)
Пользователю
Windows 95/98/Me (29)
Windows NT/2000/XP (23)
"Железо" (26)
Поиск информации (14)
Администратору
Windows NT/2000/XP (11)
Linux / Unix (12)
Юристу
Гражданское право (9)
Семейное право (5)
Трудовое право (5)
КоАП (6)

Отправить вопрос всем экспертам выбранной рассылки.




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное