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

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


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

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

Выпуск № 643
от 24.09.2003, 10:00

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


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

Bob Johnson
Статус: Профессиональный
Общий рейтинг: 151.9
URL: Программирование
[Подробней >>]
Hangatyr
Статус: Опытный
Общий рейтинг: 112.07
[Подробней >>]
_vt
Статус: Профессиональный
Общий рейтинг: 122.76
[Подробней >>]
 
Ayl
Статус: Профессиональный
Общий рейтинг: 117.55
[Подробней >>]
Beeblebrox
Статус: Профессиональный
Общий рейтинг: 107.24
URL: Beeblebrox / TMA HomePage
[Подробней >>]
Igoryk
Статус: Профессиональный
Общий рейтинг: 110.22
URL: CodeClimber.Com
[Подробней >>]


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

Вопрос № 4175. Доброго времни суток, уважаемые эксперты. В реальном режиме работы процессора с помощью 10h прерыван... (ответов: 1)
Вопрос № 4176. Привет, Bob Johnson! Вот вопрос (или ответ?) специально для тебя ;) Нет, я не второе пришествие НБ, ... (ответов: 1)
Вопрос № 4177. Есть ли IDE для Asma?... (ответов: 3)
Вопрос № 4178. Здравствуйте. уважаемые эксперты. Это снова я и снова с вопросами. не подкинет ли мне кто-нибудь из... (ответов: 1)
Вопрос № 4179. Здравствуйте эксперты! У меня такой вопрос, почему ни MASM ни TASM ни хотят компилировать мою прогу ... (ответов: 4)
Вопрос № 4180. Здравствуйте ,друзья. Невзыщите на счет тематикм вопроса,но к асму он тоже имеет отношение. Собрался... (ответов: 3)
Вопрос № 4181. Доброго время суток! У меня вопрос по защ. реж. Как перепрограмировать контроллер прерываний, чтоб п... (ответов: 1)
Вопрос № 4182. Доброе время суток, эксперты! Значит, ситуация такова: я пишу сервер и хочу сделать так, чтобы он пр... (ответов: 2)
Вопрос № 4183. Здраствуйте уважаемый эксперт! Я что-то не могу понять одну программу из рассылки №8(исходник прилаг... (ответов: 4)
Вопрос № 4185. Hello!!! Как можно определить (програмно) скорость вращения шпинделя в HD. Спасибо!... (ответов: 1)
Вопрос № 4186. Низко кланяюсь Вам господа эксперты.Мне уже 50 и я только заболел Ассемблером и вообще программирова... (ответов: 2)
Вопрос № 4187. Здравствуйте, уважаемые эксперты. Большое спасибо вам за ответы на мои предыдущие вопросы. Особенно ... (ответов: 1)
Вопрос № 4188. Здраствуйте уважаемый эксперт! Я в 10 рассылке не могу понять почему после метки ok_09 нужно сохрани... (ответов: 4)

Вопросов: 13, ответов: 28


 Вопрос № 4175

Доброго времни суток, уважаемые эксперты. В реальном режиме работы процессора с помощью 10h прерывания можно переключиьт разрешение, вывести пиксел и др. А как это делатьв зазищенном режиме работы процессора ведь прерывания БИОСа не доступны? На ум приходит только работа напрямую с портами, или я неправ? Если у кого-нибудь есть примеры или инфа по этому отправьте на мыло пожалуйста.



Вопрос отправлен: 18.09.2003, 18:53
Отправитель: GringoMan (GringoMan2002@mail.ru)

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

Отвечает --- Нет данных ---

Доброе время суток, GringoMan!
>Доброго времни суток, уважаемые эксперты. В реальном >режиме работы процессора с помощью 10h прерывания можно >переключиьт разрешение, вывести пиксел и др. А как это >делатьв зазищенном режиме работы процессора ведь >прерывания БИОСа не доступны? На ум приходит только работа >напрямую с портами, или я неправ? Если у кого-нибудь есть >примеры или инфа по этому отправьте на мыло пожалуйста.
Да вы совершенно правы, через порты ввода вывода видеоконтроллера. Пример будет слишком большим, посмотреть
можно в книге Кулакова "Программирование на аппаратном уровне" там есть хороший пример...
Удачи...



Ответ отправлен: 19.09.2003, 08:55
Отправитель: --- Нет данных ---


 Вопрос № 4176

Привет, Bob Johnson!
Вот вопрос (или ответ?) специально для тебя ;)
Нет, я не второе пришествие НБ, уж поверь (хотя тебя же все равно нет ;)), а вспомнилА я про нее просто так - в сегодняшнем выпуске ты ее упоминал, ну мне и стало интересно. Все просто.



Вопрос отправлен: 18.09.2003, 19:22
Отправитель: Kate (kate@pochta.ws)

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

Отвечает Bob Johnson

Здравствуйте, Kate!
> специально для тебя
Быстро ты отреагировала :)
> Нет, я не второе пришествие НБ, уж поверь
Ну...
> хотя тебя же все равно нет
Вот именно :) Хотя последнее время мне начинает казаться, что я все-таки есть, видимо глюки :)
> а вспомнилА
Ну прямо ее приемы :)
> ты ее упоминал
Кстати да... Я уже успел забыть...
Если действительно интересно, то посмотри в выпусках их рассылок, хотя там ничего нет кроме того, о чем я уже написал. А ты получается давно читаешь нашу?
Если верить, что ты действительно "...А" (а что мне еще делать?), то что же может заинтересовать девушку в таком предельно жестком и подчиненном логике языке как ассемблер, где нужно постоянно следовать правилам; и "шаг влево" или "вправо" уже рассценивается как Basic или C++? Только не говори, что ты разрабатываешь свою ОС и знание асма просто необходимо в такой ситуации :)

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 18.09.2003, 19:46
Отправитель: Bob Johnson


 Вопрос № 4177

Есть ли IDE для Asma?



Вопрос отправлен: 18.09.2003, 21:13
Отправитель: Sezemin

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

Отвечает --- Нет данных ---

Доброе время суток, Sezemin!
Масса. Например Visual Assembler, RAD assembler и т.д.
Но на кой он тебе ? На то он и ассемблер, чтобы весь процесс самому контролировать.
Удачи .


Ответ отправлен: 19.09.2003, 08:55
Отправитель: --- Нет данных ---


Отвечает Hangatyr

Доброе время суток, Sezemin!
Спрашиваешь... конечно есть. Например, http://radasm.visualassembler.com/download/radasm.html

Ответ отправлен: 18.09.2003, 22:10
Отправитель: Hangatyr


Отвечает _vt

Здравствуйте, Sezemin!
Мой больной вопрос - есть! FAR Manager! :)
Всё остальное - лажа!
Можно "прикрутить" всё это дело к Visual Studio, но с ограничениями... Также можно написать самому, с нужными для тебя самого функциональными возможностями... Я вот сам себе это пишу (заодно наконец-то разбираюсь в WinAPI, ведь DOS все-таки умер, как ни печально!)
Из известных могу порекомендовать ASM Editor (его юзают и рекламируют на WASM.RU) и Aditor (это вообще универсально для любого программинга), но всё это неполноценно...

*** E-Man 1.5 (edition 04) - life is just a game...if you a student:) ***


Ответ отправлен: 19.09.2003, 00:17
Отправитель: _vt


 Вопрос № 4178

Здравствуйте. уважаемые эксперты. Это снова я и снова с вопросами.
не подкинет ли мне кто-нибудь из вас на мэйл примерчик работающей прожки которая проигрывает хотя бы одну нотку через MIDI. и если можно то чтоб всё было напрямую без всякмх там разных WinAPI.



Вопрос отправлен: 18.09.2003, 22:54
Отправитель: Мирослав Махрук

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

Отвечает --- Нет данных ---

Доброе время суток, Мирослав Махрук!
>Здравствуйте. уважаемые эксперты. Это снова я и снова с >вопросами.
>не подкинет ли мне кто-нибудь из вас на мэйл примерчик >работающей прожки которая проигрывает хотя бы одну нотку >через MIDI. и если можно то чтоб всё было напрямую без >всякмх там разных WinAPI.
В WIndows без API не получится... Используй API функции для работы с секвенсером:
в MSDN смотри: MIDI functions, это тебе поможет
Пока !


Ответ отправлен: 19.09.2003, 08:55
Отправитель: --- Нет данных ---


 Вопрос № 4179

Здравствуйте эксперты!
У меня такой вопрос, почему ни MASM ни TASM ни хотят
компилировать мою прогу
В MASM пишу так
masm 1.asm
и потом он просит имена файлов, но среди них нет COM-файла
В ML пишу так:
ML.EXE 1.asm /AT
говорит об ошибке LINK
обьясните пожалуйста что такое LINKER
А если убираю LINK
ML.EXE /c 1.asm /AT
то он горорит, что все нормально, но файл не создает
В TASM вообще ни создает EXE файл и ничего не пишет.
Помогите пожалуйста, а то этот FLAT ASSEMBLER меня уже достал!!!



Вопрос отправлен: 18.09.2003, 23:00
Отправитель: DimaS

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

Отвечает --- Нет данных ---

Доброе время суток, DimaS!
А код программы можно ?
Вообще ассемблер обычно создает т.н. объектный файл, который исполняемым файлом не является. Преобразование в исполняемый файл как раз выполняет программа линкер.Он в качестве параметров принимает объектные файлы. Почитай документацию по tasm masm а также по программе tlink

Всего хорошего !


Ответ отправлен: 19.09.2003, 08:56
Отправитель: --- Нет данных ---


Отвечает Bob Johnson

Добрый день, DimaS!
На тасме пиши так:
@echo off
tasm 1.asm /m2
tlink 1.obj /t

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 19.09.2003, 19:32
Отправитель: Bob Johnson


Отвечает Ayl

Здравствуйте, DimaS!
А программку кинуть?А так только могу сказать, что твоя прога не соответствует соглашениям, принятым в MASM/TASM.
Linker - это программа, которая из нескольких obj и lib файлов создает исполняемый модуль - com или exe.
TASM'ом надо компилить так:
tasm prog.asm
tlink prog.obj


Ответ отправлен: 19.09.2003, 10:15
Отправитель: Ayl


Отвечает _vt

Доброе время суток, DimaS!
> но среди них нет COM-файла
> вообще ни создает EXE файл
Ты уж определись :)
> а то этот FLAT ASSEMBLER
Это ты про fasm? Или про что?
Короче, если с самой программой всё нормально, то:
1) Для MASM: смотри версию линкера... В пакете MASM 6.11 LINK.EXE может собирать DOS-программы, а в более старших версиях (по моему, начиная с 6.13) не может... Если у тебя MASM32, то собрать dos-приложение точно нельзя, найди LINK.EXE более старой версии... Если надо, пиши-вышлю...
2) Для tasm всё проще - возможно ты с параметрами запутался - для dos-программы формата com tasm prog.asm
tlink /t prog.obj
3) Вообще-то, надо текст ошибок приводить...
4) Причем здесь flat assembler ??? :)) Если ты писал под него, то ничего не выйдет - у него синтаксис отличается...

*** E-Man 1.5 (edition 04) - life is just a game...if you a student:) ***


Ответ отправлен: 19.09.2003, 20:18
Отправитель: _vt


 Вопрос № 4180

Здравствуйте ,друзья. Невзыщите на счет тематикм вопроса,но
к асму он тоже имеет отношение. Собрался я удалить всплывающие окно с рекламой из одной проги на делфи-metlcord.exe это игрушка кто хочет стать миллионером.
Найдя в программе функцию CreateWindowExA ,которая создает
это окно. Я безуспешно пытался забить Nop-и всю эту процедуру
все push передающие параметры APi функции,следя за колличеством байт,во втором случае попытался забить вызов
этой процедуры из кода проги Виндовс немного "Ругался"
Подскажите где я ошибся.
Заранее благодарен Юрий.



Вопрос отправлен: 18.09.2003, 23:23
Отправитель: Yury

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

Отвечает --- Нет данных ---

Доброе время суток, Yury!
Скорее всего ошибся в кол-ве инструкций NOP, внимательнее
посмотри суммарную длину инструкций PUSH и call, а также
внимательно посмотри состояние стека до и после call, возможно что после вызова процедуры, как то модифицируется стек.


Ответ отправлен: 19.09.2003, 08:56
Отправитель: --- Нет данных ---


Отвечает Beeblebrox

Здравствуйте, Yury!
Обходи коротким переходом:
push p1 ; <- jmp _label
push p2
...
call proc
_label:

Ответ отправлен: 19.09.2003, 09:50
Отправитель: Beeblebrox


Отвечает _vt

Доброе время суток, Yury!
Что то слишком сложно, а что замена 75 на EB не помогает? :)Откуда ты знаешь, что процедура должна возвращать? А если знаешь, то это надо учитывать...

*** E-Man 1.5 (edition 04) - life is just a game...if you a student:) ***


Ответ отправлен: 19.09.2003, 20:18
Отправитель: _vt


 Вопрос № 4181

Доброго время суток!
У меня вопрос по защ. реж.
Как перепрограмировать контроллер прерываний, чтоб прерывание от таймера правильно работало.
Нужно чтобы правильно время отсчитывалось, какой обработчик писать?
И еще одно почему когда я пишу sti после перехода в защ. реж. у меня комп перегружается, но когда я просто вызываю прерывание через int , то все работает. В чем проблема?
Когда я обращаюсь к какому-то левому селектору, то работает GP и выводит символ (обработчик такой).
Спасибо за ответы!



Вопрос отправлен: 18.09.2003, 23:56
Отправитель: Madman (yo-ho@km.ru)

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

Отвечает --- Нет данных ---

Здравствуйте, Madman!
>Доброго время суток!
>У меня вопрос по защ. реж.
>Как перепрограмировать контроллер прерываний, чтоб >прерывание от таймера правильно работало.
см. приложение
>Нужно чтобы правильно время отсчитывалось, какой >обработчик писать?
стандартно прерывание от таймера приходит с частотой 18.2 Гц (точное значение - 1193180/65536 раз в секунду). В обработчике делаешь инкремент счетчика и тем самым контролируешь время, с момента запуска системы.
>И еще одно почему когда я пишу sti после перехода в защ. >реж. у меня комп перегружается, но когда я просто вызываю >прерывание через int , то все работает. В чем проблема?
А в том что у тебя контроллер прерываний запрограммирован,
так что разрешены все прерывания, а обработчиков у тебя нет.
Поэтому когда ты разрешаешь прерывания (sti) приходит, прерывание от таймера (или чего либо ещё), и система переходит по недействительному адресу обработчика прерываний или просто перезагружается.
см. приложение, в самом конце, там запрещаются все прерывания, кроме таймера (0) и клавиатуры (1).
>Когда я обращаюсь к какому-то левому селектору, то >Работает GP и выводит символ (обработчик такой).
>Спасибо за ответы!
Удачи !


Приложение:

Ответ отправлен: 19.09.2003, 08:57
Отправитель: --- Нет данных ---


 Вопрос № 4182

Доброе время суток, эксперты!
Значит, ситуация такова: я пишу сервер и хочу сделать так, чтобы он принимал подключения только с компов из определенного диапазона адресов. Как определить, кто именно к тебе подключился?
Спазибо за внимание.



Вопрос отправлен: 19.09.2003, 09:18
Отправитель: Dr.00py (stepipatov@mail.ru)

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

Отвечает Hangatyr

Приветствую Вас, Dr.00py!
Используй API getpeername.
int getpeername(SOCKET s, struct sockaddr* name, int* namelen);


Ответ отправлен: 19.09.2003, 09:52
Отправитель: Hangatyr


Отвечает --- Нет данных ---

Здравствуйте, Dr.00py!
>Доброе время суток, эксперты!
>Значит, ситуация такова: я пишу сервер и хочу сделать так, >чтобы он принимал подключения только с компов из >определенного диапазона адресов. Как определить, кто >именно к тебе подключился?
>Спазибо за внимание.
Погляди на функцию Windows Sockets API recvfrom, она должна
помочь тебе с решением этой проблемы...
Пока !



Ответ отправлен: 19.09.2003, 11:17
Отправитель: --- Нет данных ---


 Вопрос № 4183

Здраствуйте уважаемый эксперт!
Я что-то не могу понять одну программу из рассылки №8(исходник прилагается)
Зачем там заносить ax в Handle а потом Handle в bx когда можно сразу занести ax в bx и тем самым обойтись без переменных.
Ну а если я предположим не прав то почему тогда мы не сохраняем bx(push bx) ведь сначало мы в него вносим ax а затем Handle.Как такое может быть?
Да и еще почему когда я открываю файл то я не могу прочесть его содежимое.Как видно при выводе строки его можно посмотреть в отладчике, а можно ли его просмотреть в Dos'е?
Заранее благодарю


Приложение:


Вопрос отправлен: 19.09.2003, 14:53
Отправитель: Семен

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

Отвечает Bob Johnson

Добрый день, Семен!
В данном случае можно. Видимо переменная использована для упрощения понимания всей программы.
> а можно ли его просмотреть в Dos'е
Непонятно выразился, но думаю, что можно.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 19.09.2003, 19:41
Отправитель: Bob Johnson


Отвечает Igoryk

Добрый день, Семен!
Здесь имеется в виду, что указатель файла пригодится позднее. В данном же примере можно избежать использование переменных предлагаемым Вами способом. Насчет просмотреть в DOSe - если Вы имеете в виду вывести на экран, то выводите Bufer общеизвестными способами, добавив $ в конце или еще как-нибудь.

Ответ отправлен: 22.09.2003, 20:14
Отправитель: Igoryk


Отвечает Ayl

Добрый день, Семен!
Сохраняем дискриптор файла в переменной, чтобы потом можно было с ним потом работать. Например, когда нужно будет закрыть файл.
В данном примере, безусловно, можно работать и просто с регистром bx, не сохраняя в памяти. Но ведь это учебный пример, а не задача COMPO. Здесь описаны ПРИНЦИПЫ работы с файлами средствами DOS. Строка mov Handle, ax как раз и показывает, что результат функции открытия файла очень важен и требует сохранения. Ну а как ты будешь выполнять это сохранение - целиком и полностью на твое усмотрение.

Насчет сохранения с помощью push. Во-первых, если этот дискриптор должен использоваться в процедурах (типа глобальной переменной), то ты затрахаешься его из стека доставать. Далее, перед повторным использованием дискриптора необходимо, чтобы стек был в состоянии, предшествующем push'у. Что неудобно и не всегда выполнимо. В-третьих, при каждом использовании дискриптора его нужно извлекать и снова класть на место - никакой выгоды от использования стека не получаем.
Лучше всего, конечно, использовать регистр, но их так мало, что обычно они все задействованы.

Насчет вывода файла. В ДОСе или с помощью этой программы?
В ДОСе есть команда type. Но ее можно использовать только для текстовых файлов. Либо просмотреть файл в любой файловой оболочке.

Если выводить программно, то зависит от того, текстовый или бинарный файл. С помощью этой программы содержимое файла считывается в буфер. Теперь нужно:
- для текстового файла
* сформировать по данным, находящимся в этом буфере, строки (строки разделяются символами с кодами 10 и 13).
* вывести сформированные строки
- для бинарного файла
* написать процедуру преобразования байта в строку текста
* вывести буфер по-байтно, используя данную процедуру


Ответ отправлен: 19.09.2003, 15:28
Отправитель: Ayl


Отвечает --- Нет данных ---

Добрый день, Семен!
>Здраствуйте уважаемый эксперт!
>Я что-то не могу понять одну программу из рассылки №8(исходник прилагается)
>Зачем там заносить ax в Handle а потом Handle в bx когда >можно сразу занести ax в bx и тем самым обойтись без >переменных.
Приводим код:
Begin:
mov ax,3D00h ;---> Функция открыть файл
mov dx,offset File_name ;---> ds:dx = смещение имени файла
int 21h ; ->> Вызываем функцию DOS
jc Error_file ;-> если ошибка вывести ошибку
mov Handle,ax ;-> если нет то в Handle - дескриптор файла
смотрим далее:
mov bx,ax ;---> Из ax в bx дескриптор файла
mov ah,3Fh ;---> Функция "чтение из файла"
mov cx,0FF00h ;----> в cx кол-во читаемых байт
mov dx,offset Buffer ;---> ds:dx буфер для рез-та чтения
int 21h ;---> наконец читаем
тут в ax уже не адрес Handle (для этого собственно и переменная - Чтобы сохранить дескриптор для дальнейшего
использования)
смотрим далее:
mov ah,3Eh ;-->Функция закрыть файл
mov bx,Handle ;--> Восстанавливаем дескриптор из памяти
int 21h ;---> call the fucking DOS :-)
Ну вот теперь должно быть понятно, зачем нужна переменная
handle в памяти - для хранения дескриптора файла т.к.
регистры затераются функциями DOS.
>Ну а если я предположим не прав то почему тогда мы не >сохраняем bx(push bx) ведь сначало мы в него вносим ax а >затем Handle.Как такое может быть?
А стек тут не используется потому, что это
должен быть com файл (об этом говорит ORG 100h вначале)
, и для простоты сегмент стека тут не описывается и регистр ss не инициализируются, поэтому push делать низяяяя !
>Да и еще почему когда я открываю файл то я не могу >прочесть его содежимое.Как видно при выводе строки его >можно посмотреть в отладчике, а можно ли его просмотреть в >Dos'е?
>Заранее благодарю
Дык файл блокируется пока ты его не закроешь IMHO.
Ну все за сим прощаюсь !

Ответ отправлен: 19.09.2003, 15:40
Отправитель: --- Нет данных ---


 Вопрос № 4185

Hello!!!
Как можно определить (програмно) скорость вращения шпинделя в HD.
Спасибо!



Вопрос отправлен: 19.09.2003, 17:12
Отправитель: Sergei (prm_serg@list.ru)

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

Отвечает --- Нет данных ---

Приветствую Вас, Sergei!
Думаю, никак !!!
До свидания !


Ответ отправлен: 22.09.2003, 08:39
Отправитель: --- Нет данных ---


 Вопрос № 4186

Низко кланяюсь Вам господа эксперты.Мне уже 50 и я только заболел Ассемблером и вообще программированием.С помощью божей и многочислинных ... мать кое-как собрал программку которая хорошо работает под
DOS на PC и абсолютно отказывается работать на ноутбуке.Попробовал два ноутбука -результат тот же.
В моём возрасте и так уснуть нелегко ну, а с такими проблемами сами понимаете.Если кто-то откликница ,могу выслать начальный кусок.Господа не оставьте моих детей
сиротами.



Вопрос отправлен: 19.09.2003, 22:12
Отправитель: Rosa (comtech@gmx.de)

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

Отвечает Igoryk

Добрый день, Rosa!
Возможно всплывает проблема "переносимости" программ на ассемблере. Попробуйте откомпилировать программу на ноутбуке, если не поможет, то тогда прийдется код посылать.

Ответ отправлен: 22.09.2003, 20:14
Отправитель: Igoryk


Отвечает Ayl

Приветствую Вас, Rosa!
Присылайте - посмотрю.

Ответ отправлен: 22.09.2003, 11:44
Отправитель: Ayl


 Вопрос № 4187

Здравствуйте, уважаемые эксперты.
Большое спасибо вам за ответы на мои предыдущие вопросы. Особенно я благодарен эксперту Bob'у Johnson'у за то, что он поделился своим мнением о функционировании КЭШа процессора (вопрос: 4050). Теперь, перейду к вопросу.
В одном из предыдущих писем, я задавал вопрос о том, почему моему приложению не приходит сообщение: WM_QUERYENDSESSION, при выключении компьютера(ATX) кнопкой POWER. К сожалению, приемлемых для меня ответов я на него не получил. Пришлось копать самому. Выяснилось, что вместо этого сообщения посылается другое: подсообщение PBT_APMQUERYSUSPEND сообщения WM_POWERBROADCAST. Я узнал это экспериментальным путем. В описании этого подсообщения (я пользуюсь сейчас инфой из пакета Visual Studio 6) сказано, что если в ответ на него вернуть значение: BROADCAST_QUERY_DENY, то выключение компьютера будет отменено.
На практике, этого не происходит. Какое бы значение я не возвращал, компьютер все равно выключается. Вот мой обработчик:
...
.elseif eax==WM_POWERBROADCAST
.if wParam==PBT_APMQUERYSUSPEND
mov eax, lParam
and eax, 1
.if eax==1
; Здесь программа спрашивает: можно выключать
; компьютер или нет?
invoke MessageBox, hWin, offset Str1, offset Str2, MB_ICONWARNING and MB_YESNO
.if eax==IDYES
mov eax, TRUE
.else
mov eax, BROADCAST_QUERY_DENY
.endif
.else
mov eax, BROADCAST_QUERY_DENY
.endif
ret
.endif
.elseif...
в моем файле WINDOWS.INC константа BROADCAST_QUERY_DENY определена следующим образом:
BROADCAST_QUERY_DENY equ 424D5144h
Недавно я узнал, что для того чтобы процесс мог управлять питанием компьютера с ОС Windows 2000 Pro, ему нужно назначить соответствующие привилегии. Я решил, что моя проблема связанна с этим и решил дать ему их. Сделал я это следующим кодом, который выполняется сразу после запуска программы:
.data?
hProcess HANDLE ?
hTokenABC HANDLE ?
tkp TOKEN_PRIVILEGES <>
.code
invoke GetCurrentProcess
mov hProcess, eax
invoke OpenProcessToken,hProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,addr hTokenABC
invoke LookupPrivilegeValue, NULL, SADD("SeShutdownPrivilege"), addr tkp.Privileges[0].Luid
mov tkp.PrivilegeCount, 1
mov tkp.Privileges[0].Attributes, SE_PRIVILEGE_ENABLED
invoke AdjustTokenPrivileges, hTokenABC, FALSE, addr tkp, 0, NULL, 0
(SADD() - это макрос, который позволяет, для удобства, указывать текстовую строку прямо в команде)
а перед выходом из программы выполняется следующий код:
mov tkp.Privileges[0].Attributes, 0
invoke AdjustTokenPrivileges, hTokenABC, FALSE, addr tkp, 0, NULL, 0
короче, указанные привилегии я получаю нормально, но это не помогает. Компьютер продолжает выключаться даже если я отказываюсь от выключения... Может быть, я даю не те привелегии?
Внимание вопрос: почему после отработки моего обработчика я получаю не тот результат, на который рассчитываю, т.е. почему компьютер продолжает выключаться, даже если я отказываюсь от выключения? И как мне исправить это? Может быть, кто ни будь из Вас знает, в чем тут проблема? На моем компьютере стоит ОС Windows 2000 Pro SP3.
P.S. Кто ни будь из Вас подписался на рассылку по API? Ко мне еще не пришло ни одно письмо, в котором была бы хоть какая то инфа кроме рекламы! А я получил их уже несколько... Может быть, кто ни будь знает в чем тут дело? А то я уже собираюсь отписаться от нее, чтобы зря не засоряла мой почтовый ящик... И еще, уважаемые эксперты, не могли бы вы дать мне свои номера ICQ, а то иногда есть желание пообщаться с вами в ON-LINE... А так же время, в которое вас обычно можно застать в сети.



Вопрос отправлен: 20.09.2003, 09:38
Отправитель: Олег (Oleg_SK@e-mail.ru)

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

Отвечает _vt

Приветствую Вас, Олег!
Мне кажется, ты просто запутался с переходами - с этими .if - .elseif нихрена не понятно - гораздо удобней обычный синтаксис... Если всё правильно, то
.if wParam==PBT_APMQUERYSUSPEND
mov eax, lParam
<-- а это зачем??? По-моему, в eax должна быть просто единичка
and eax, 1
.if eax==1

*** E-Man 1.5 (edition 04) - life is just a game...if you a student:) ***


Ответ отправлен: 20.09.2003, 22:21
Отправитель: _vt


 Вопрос № 4188

Здраствуйте уважаемый эксперт!
Я в 10 рассылке не могу понять почему после метки ok_09 нужно сохранить регистры.Почему там push cs есть, а pop cs не ту???
Я еще не могу понять iret.Для чего он и можно ли обойтись без него?
И почему мы пишем mov word... а потом mov dword...Есть ли разница?


Приложение:


Вопрос отправлен: 20.09.2003, 09:56
Отправитель: Олег

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

Отвечает Ayl

Доброе время суток, Олег!

> почему после метки ok_09 нужно сохранить регистры
Потому что у нас обработчик прерывания. И при его вызове предполагается, что регистры (кроме специально описанных случаев) не должны изменяться.

> Почему там push cs есть, а pop cs не ту???
"не ту" - а что? Вообще-то, слово "нету" пишется слитно.
pop cs - такой команды вообще нет в системе команд x86.
А если ты посмотришь, то там присутствует такая последовательность:
push cs
pop ds
которая устанавливает сегментный регистр DS равным сегментному регистру CS. Для обеспечения доступа к переменным.

Или ты считаешь, что работа со стеком производится по именованным ячейкам? То есть для каждого, например, push ax, должен быть свой pop ax? Это не так. В стек просто последовательно помещаются значения, причем последнее оказывается на самом верху стека. При выборе значений из стека берется самое верхнее и помещается в указанное место.

> Я еще не могу понять iret.Для чего он и можно ли обойтись без него?
Команда iret выполняет выход из обработчика прерывания. Она берет с вершины стека 3 числа и помещает их последовательно в регистры IP, CS и Flags.
Обойтись - при желании можно, но зачем? Правда, когда не нужно восстанавливать значение регистра флагов при выходе из обработчика, то можно вместо iret использовать команду retf 2, которая выполнит выход из дальней процедуры (восстановит CS и IP) и уберет с вершины стека 2 байта.

> И почему мы пишем mov word... а потом mov dword...Есть ли разница?
Ну ты уже совсем обленился! А первые выпуски перечитать? Там должно быть объяснение.
word ptr - модификатор, указывающий, что операнд представляет собой слово (2 байта, 16 бит);
dword ptr - модификатор, указывающий, что операнд представляет собой двойное слово (4 байта, 32 бита);
Ну и как, есть разница?
А используются в соответствующем контексте. Кстати, mov dword ptr я в коде не увидел, только jmp dword ptr и call dword ptr.
Когда нужно записать адрес старого обработчика, то в соответствующую переменную записываются отдельно сегмент и смещение. Причем переменная у нас 4 байта, а сегмент и смещение - по 2 байта. Поэтому при записи используется модификатор word ptr.
Когда же происходит вызов старого обработчика (в командах jmp и call), то к переменной нужно обращаться как к двойному слову. Вот тут используется модификатор dword ptr.

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


Отвечает _vt

Приветствую Вас, Олег!
> Почему там push cs есть, а pop cs не ту???
Так там есть pop ds...
> Я еще не могу понять iret
Это выход из обработчика прерывания... (можно и обойтись)
> а потом mov dword
Не нашел...

*** E-Man 1.5 (edition 04) - life is just a game...if you a student:) ***


Ответ отправлен: 20.09.2003, 22:21
Отправитель: _vt


Отвечает Bob Johnson

Добрый день, Олег!
Там есть pop ds - таким образом значение из cs передается в ds.
iret - возврат из обработчика прерывания. Раз ты пишешь свой обработчик, то должен в конце выполнить iret - он восстановит флаги, занесенные в стек процессором при вызове прерывания.
word -потому что заносим 2 байта, dword - потому что нужно выполнить дальний вызов, которому требуется 4 байта.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 21.09.2003, 20:55
Отправитель: Bob Johnson


Отвечает --- Нет данных ---

Здравствуйте, Олег!
>Здраствуйте уважаемый эксперт!
>Я в 10 рассылке не могу понять почему после метки ok_09 >нужно сохранить регистры.Почему там push cs есть, а pop cs >не ту???
Ну посмотрим на код:
cseg segment ; cs=Теекущий сегмент
org 100h ; это похоже com файл
Start:
jmp Init ; Переход на Init
int_21h_proc proc ;Обработчик прерывания
pushf ;сохраняем флаги
cmp ah,9 ;ah=9 ?
jz Ok_09 ;Jump если да
popf ;Восстановить флаги
jmp dword ptr cs:[int_21h_vect];перейти на оригин.обработчик
Ok_09: ;тут наш код прерывания 9
push ds ;сохраняем сегмент данных
push dx ;сохраняем dx
push cs ;сохраняем сегмент кода
pop ds ; делаем ds=cs, т.к. это com файл
mov dx,offset My_string ;dx=указатель на строку
pushf ;сохраним флаги
call dword ptr cs:[int_21h_vect] ;и call старый обработчик
pop dx ;восстанавливаем сохраненый push'ем dx
pop ds ;восстанавливаем сохраненный push'ем ds
popf ;восстанавливаем флаги
iret ;выход из нашего обработчика прерывания
int_21h_vect dd ?
My_string db "my string!$"
int_21h_proc endp
Init:
mov ax,3521h
int 21h
mov word ptr int_21h_vect,bx
mov word ptr int_21h_vect+2,es
mov ax,2521h
mov dx,offset int_21h_proc
int 21h
mov dx,offset Init
int 27h
cseg ends
end Start
>Я еще не могу понять iret.Для чего он и можно ли обойтись >без него?
ret отличается от iret, тем что по iret из стека извлекается регистр флагов (FLAGS(EFLAGS)) (который туда записывается командой int), а при ret только сохраненный в стеке адрес команды следующей за call'ом
>И почему мы пишем mov word... а потом mov dword...Есть ли >разница?
Есьественно,
call dword ptr cs:[int_21h_vect]
переходит по адресу который dword (двойное слово cs:[int_21h_vect],
а mov word ptr int_21h_vect,bx
записывает слово (16 бит) из bx в int_21h_vect, т.е. первую половину адреса
Ну вроде все. Пока

Ответ отправлен: 22.09.2003, 08:40
Отправитель: --- Нет данных ---



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

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
Assembler (32)
C / C++ (28)
Perl (7)
Builder / Delphi (22)
Pascal (23)
Basic / VBA (11)
Java / JavaScript (13)
PHP (14)
Криптография (10)
WinAPI (16)
Пользователю
Windows 95/98/Me (54)
Windows NT/2000/XP (63)
"Железо" (43)
Поиск информации (24)
Администратору
Windows NT/2000/XP (31)
Linux / Unix (14)
Юристу
Гражданское право (10)
Семейное право (8)
Трудовое право (8)
КоАП (6)

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




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А.


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

В избранное