Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 407
от 03.11.2002, 15:40
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 1694 Отправлено ответов: 5366 Активность: 316.7 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Supra Статус: Доверительный Общий рейтинг: 117.05 [Подробней >>] |
Maverick Статус: Опытный Общий рейтинг: 136.93 URL: Страница по асму и вирмейку Телефон: 89039415024 (BiLine GSM) [Подробней >>] |
Beeblebrox Статус: Профессиональный Общий рейтинг: 113.18 URL: Beeblebrox / TMA HomePage [Подробней >>] |
Portnov Статус: Профессиональный Общий рейтинг: 118.61 URL: Мой сайтик... [Подробней >>] |
masquer Статус: Профессиональный Общий рейтинг: 154.29 [Подробней >>] |
Eugene Статус: Доверительный Общий рейтинг: 114.28 [Подробней >>] |
etz Статус: Начальный Общий рейтинг: 112.9 [Подробней >>] |
ASMодей Статус: Профессиональный Общий рейтинг: 120.99 [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 155.26 [Подробней >>] |
igorash Статус: Профессиональный Общий рейтинг: 118.04 [Подробней >>] |
baldr Статус: Профессиональный Общий рейтинг: 114.67 URL: Сайт об ОС DOS. Всем, кто любит эту ОС! [Подробней >>] |
Broken Sword Статус: Профессиональный Общий рейтинг: 130.92 URL: моя рассылка по Protected Mode [Подробней >>] |
St Статус: Доверительный Общий рейтинг: 116.73 [Подробней >>] |
Dark_Lord Статус: Профессиональный Общий рейтинг: 128.68 [Подробней >>] |
DiGiT[old] Статус: Опытный Общий рейтинг: 107.94 [Подробней >>] |
Gibbel Статус: Профессиональный Общий рейтинг: 108.64 URL: Страничка обо мне и моих друзьях [Подробней >>] |
LIFO Статус: Опытный Общий рейтинг: 128.82 Телефон: 8 01710 24758 [Подробней >>] |
Sub0 Статус: Начальный Общий рейтинг: 105.4 [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 117.92 [Подробней >>] |
Atmion Статус: Доверительный Общий рейтинг: 124.46 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 1638. Вопрос к эксперту oleg, ты сам то тгде родился? Кто тебе сказал, что протокол IP-это протокол для пе... (ответов: 2)
Вопрос № 1639. Всем привет! Помагите. Нужен файл с описанием команд 386 проца.Мне нужно чтобы там по каждой команде... (ответов: 8)
Вопрос № 1640. Уважаемые эксперты, опять не могу ничего сделать. Вот мой вопрос: Мне нужно чтобы я мог обращатся к ... (ответов: 4)
Вопрос № 1641. Доброе время суток ув. Эксперты. У меня возникла проблема вызова 16 битных функций(16 битные DLLки) ... (ответов: 3)
Вопрос № 1642. Здравстуйте, Эксперты ! Как написать программу,которая создает дисковой файл. и Как написать програм... (ответов: 4)
Вопрос № 1643. Здравствуйте, уважаемые эксперты. Мне 15 лет, загорелся желанием изучить ассемблер. До уневерситета ... (ответов: 7)
Вопрос № 1644. Здравстуйте, Эксперты ! дополнение к вопросу № 1642 Как написать программу,которая создает дисково... (ответов: 4)
Вопрос № 1645. Просьба не обижаться и не поднимать флейм. Получаю рассылку с самого начала.Сейчас пробежался по N40... (ответов: 4)
Вопрос № 1646. Добрый день,уважаемые эксперты. Ответте пожалуйста на вопрос: Каким способом и функцией кроме GetWi... (ответов: 5)
Вопрос № 1647. Maverick! Ты занимаешься вирусами и у тебя полюбак может быть исходник OneHalf. Не вышлешь мне? Хочу... (ответов: 1)
Вопрос № 1648. Есть вопрос по резидетам. Есть у меня такая прога (см. ниже). И она не работает, хотя по идее должна... (ответов: 3)
Вопрос № 1650. Здравствуйте уважаемые эксперты! я спросить хочу о программировании на асм под виндой .... при вызов... (ответов: 5)
Вопрос № 1652. Здравствуйте уважаемые эксперты! я спросить хочу о программировании на асм под виндой .... "про... (ответов: 8)
Вопрос № 1653. Здравствуйте снова! опять я! В описании MoveWindow сказано что она "посылает окну сообщение wm_... (ответов: 4)
Вопрос № 1654. Здраствуйте, уважаемые эксперты! Мне необходимо измерять интервалы времени с очень большой точностью... (ответов: 5)
Вопросов: 15, ответов: 67
Вопрос № 1638 |
Вопрос к эксперту oleg, ты сам то тгде родился? Кто тебе сказал, что протокол IP-это протокол для передачи данных в сети Ethernet, он работает в любой сети! Сеть Ether сама данные передает по своему протоколу. Выговор тебе за незнание!
Вопрос отправлен: 29.10.2002, 18:01
Отправитель: slavai
[Следующий вопрос >>] [Список вопросов]
Отвечает Supra
Здравствуйте, slavai!
Круто-что тут еще сказать!!!!!!!!!!!
Ответ отправлен: 01.11.2002, 19:46
Отправитель: Supra
Отвечает Maverick
Здравствуйте, slavai!
Шлите, плиз, персонально свою критику экспертам.
И насколько я помню, здесь базар не про протокол шел, а про регистр процессора IP.
Мдааа.
Ответ отправлен: 30.10.2002, 13:36
Отправитель: Maverick
Вопрос № 1639 |
Всем привет!
Помагите. Нужен файл с описанием команд 386 проца.Мне нужно чтобы там по каждой команде довались следующие данные:
1)Мнемоника
2)Опкод
3)Размер в байтах
4)СКОРОСТЬ ВЫПОЛНЕНИЯ В ТАКТАХ
Для меня это очень важно(нужно как воздух). Хочу заняться оптимизацией по скорости а без этого ни как. Все что я находил не имело информации по скорости.
Please!!! буду очень рад.
Вопрос отправлен: 29.10.2002, 18:17
Отправитель: Kiselev (kiselev@inbox.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Beeblebrox
Приветствую Вас, Kiselev!
А зачем именно 386? Или ты думаешь, что и для пентиума все останется в силе? Ничего подобного, две трубы и многоуровневый кеш требуют совсем другого подхода для оптимизации.
Кстати, даже в интеловских мануалах я не нашел инфы по тактам!
Ответ отправлен: 29.10.2002, 18:26
Отправитель: Beeblebrox
Отвечает Portnov
Доброе время суток, Kiselev!
Надеюсь, 216 килобайт пройдет...
Ответ отправлен: 29.10.2002, 20:28
Отправитель: Portnov
Отвечает masquer
Приветствую Вас, Kiselev!
1, 2, 3 есть в интеловских мануалах, а вот 4-е будет отличаться на каждом поколении и производителе процессора (отличия в реализации FPU, кеш, предсказание ветвлений - у всех по разному реализованы).
По оптимизации Agner Fog читай, сайт не помню, в поисковике смотри.
Ответ отправлен: 30.10.2002, 11:13
Отправитель: masquer
Отвечает Eugene
Доброе время суток, Kiselev!
Послал.
Ответ отправлен: 29.10.2002, 19:06
Отправитель: Eugene
Отвечает etz
Приветствую Вас, Kiselev!
Есть opcodes.hlp (84килобута) - только опкоды, мнемоники, размеры, такты
Есть helppc2 (под дос. резидент) - не только это но и куча инфы под дос: таблы всякие, инфы по прерываниям доса и прочее.
Пиши etz@ngs.ru - вышлю.
Ответ отправлен: 30.10.2002, 06:46
Отправитель: etz
Отвечает Supra
Добрый день, Kiselev!
Загляни на wasm.ru
Ответ отправлен: 01.11.2002, 19:48
Отправитель: Supra
Отвечает ASMодей
Приветствую Вас, Kiselev!
Послал, лови.
Ответ отправлен: 30.10.2002, 14:48
Отправитель: ASMодей
Отвечает Bob Johnson
Доброе время суток, Kiselev!
А что, у тебя 386? Если нет, то тебе нужны данные по более новому процу, например Intel PIII. Потому что на 386 команда loop выполнялась быстрее, чем dec ecx; jnz, а вот на пеньке луп занимает тактов 5, в то время как dec и jnz "спариваются" (только не давай волю воображению) и занимают обе 1 такт (это в пустом цикле). Т.е. в 5 раз быстрее!
Кроме того, многое зависит от кэша, поэтому если хочешь оптимизировать свою программу обрати внимание и на это.
Более того, когда пишешь прогу под пенек можно еще начать команды по конвеерам раскладывать (это уже совсем сильно), а в 386 такого близко не было.
Ответ отправлен: 31.10.2002, 00:14
Отправитель: Bob Johnson
Вопрос № 1640 |
Уважаемые эксперты, опять не могу ничего сделать. Вот мой вопрос:
Мне нужно чтобы я мог обращатся к переменным по именам
_ax,_bx,_cx,_dx _ah,_al,_bh,_bl и т.д. При этом я не хочу обращатся через структуру или обьединение, но _ah+_al=_ax
_bh+_bl=_bx. Ну как бы регистры только в памяти.
Приложение:
Вопрос отправлен: 29.10.2002, 18:13
Отправитель: Merilyn Manson
[Следующий вопрос >>] [Список вопросов]
Отвечает igorash
Здравствуйте, Merilyn Manson!
попробуй:
ax_:
al_: db ?
ah_: db ?
bx_:
bl_: db ?
bh_: db ?
потом пиши что-то типа word ptr ax_, byte ptr ah_
Ответ отправлен: 29.10.2002, 21:47
Отправитель: igorash
Отвечает masquer
Приветствую Вас, Merilyn Manson!
А чем тебя структура не устраивает, имхо, в твоем случае самы удобный вариант, чтобы не запутаться
Ответ отправлен: 30.10.2002, 11:16
Отправитель: masquer
Отвечает baldr
Приветствую Вас, Merilyn Manson!
Эх, елки... Дорогой мой человек, зачем же так извращаться? Если просто хочется создать
переменную с доступом к различным ее частям, то можно сделать так:
_AX label byte
_AH db 0
_AL db 0
И все... Только учти, что регистрами в полном смысле этого слова они не будут. Не будут они и обладать свойствами регистров: при записи в эти переменные будет производиться запись в память
со всеми последствиями...
Ответ отправлен: 30.10.2002, 00:51
Отправитель: baldr
Отвечает Bob Johnson
Здравствуйте, Merilyn Manson!
Вот, пожалуйста.
Приложение:
Ответ отправлен: 31.10.2002, 00:14
Отправитель: Bob Johnson
Вопрос № 1641 |
Доброе время суток ув. Эксперты.
У меня возникла проблема вызова 16 битных функций(16 битные DLLки) в 32 битных приложениях, как в консольных ,так и в GUI.
Нашёл такую вещь, как Thunks функции. Подскажите как с ними можно работать на ассемблере и что они из себя представляют.
Если есть исходники по даному вопросу вышлите, плиз, на мыло ( er_val@ukrpost.net ).
P.S. to Broken Sword:
Вышли пожалуйста информацию по SEH о которой ты говорил когда-то в рассылке.
P.S2. to ALL:
подскажите серийный код на SoftICE Driver Suite v2.7 - ссылка сайта http://21softs.com/download/softice.htm (URL http://202.108.34.12:8888/vdown/sice/down@vdown.net.sice27r01.zip)
Вопрос отправлен: 29.10.2002, 19:41
Отправитель: Valera
[Следующий вопрос >>] [Список вопросов]
Отвечает igorash
Здравствуйте, Valera!
p.s.2. попробуй 7747-B8C9F6-77
Ответ отправлен: 29.10.2002, 20:43
Отправитель: igorash
Отвечает Broken Sword
Доброе время суток, Vale
серийник на SI 2.7
7749-7B10FF-FC
SEH смотри на мыле
Ответ отправлен: 29.10.2002, 20:38
Отправитель: Broken Sword
Отвечает masquer
Приветствую Вас, Valera!
Про thunks лучше у Matt Pietrek-а читай. Мне это просто не нужно...
Ответ отправлен: 30.10.2002, 11:27
Отправитель: masquer
Вопрос № 1642 |
Здравстуйте, Эксперты !
Как написать программу,которая создает дисковой файл.
и Как написать программу, которая выводит файл на экран
Вопрос отправлен: 29.10.2002, 19:51
Отправитель: Саш
[Следующий вопрос >>] [Список вопросов]
Отвечает St
Привет, Саш!
Под DOS, Win3.1, Win98, WinXP, WinCE, Linux, BeOS, QNX, Solaris, MacOS или вы пишите свою систему?
St
Ответ отправлен: 29.10.2002, 20:04
Отправитель: St
Отвечает Supra
Дмюоме аоекз ъяпми, Ъчэ!
Ответ отправлен: 01.11.2002, 21:56
Отправитель: Supra
Отвечает Bob Johnson
Добрый день, Саш!
Если под Windows - то функция CreateFile (см. MSDN), если под ДОС - int 21h функция 3Ch.
mov ah, 3Ch
mov cx, 0; attributes
mov ds, offset filename
int 21h
;ax = Descriptor
...
filename db '1.txt', 0
На экран - в каком виде? Просто как текст - самый простой вариант - читать файл по байту (функция 3Fh) и выводить на экран по символу (функция 02h).
Ответ отправлен: 31.10.2002, 13:02
Отправитель: Bob Johnson
Отвечает etz
>>>Здравстуйте, Эксперты !
Приветствую Вас, Саш!
>>>Как написать программу,которая создает дисковой файл.
используй CreateFileA, ReadFile, SetFilePointer, WriteFile
или прерывания 21h (если под дос). Инфу по 21h ищи в helppc или книжках/руководствах по досу.
>>>>и Как написать программу, которая выводит файл на экран
можно выводить и командой мс-досы: copy 1.txt con (или more 1.txt).. Встречный, собственно, вопрос - как именно тебе нужно выводить? и под какой системой? (дос or вынь)
Ответ отправлен: 30.10.2002, 06:55
Отправитель: etz
Вопрос № 1643 |
Здравствуйте, уважаемые эксперты. Мне 15 лет, загорелся желанием изучить ассемблер. До уневерситета мне еще далеко, вся инфа, которую смог достать, не дает представления о том, как можно все-таки научиться кодить на ассемблере.
Подскажите, пожалуйста, какие хорошие ресурсы есть по этому вопросу. Заранее благодарен.
Вопрос отправлен: 29.10.2002, 19:58
Отправитель: Prizrak (prizraknht@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает igorash
Доброе время суток, Prizrak!
Не пожалей денег и купи книгу Зубкова, ну или найди у кого-то из друзей и почитай.... из хороших ресурсов - например wasm.ru
Ответ отправлен: 29.10.2002, 21:06
Отправитель: igorash
Отвечает St
Привет Prizrak!
Думаю для начала вам стоит почитать какие-нибудь книги. Можно начать с тех которые есть в инете (сравнительно старые, но новые найти там сложнее). Например Джордэйн (Журден) - Справочник программиста на персональном компьютере фирмы IBM (http://alex-justasu.narod.ru/index.html).
Еще несколько ссылок: http://nicki-site.narod.ru/asm/knigi.htm; http://proge.ru/go.php?id=2; http://src.fitkursk.ru/books.asp
Однако большинство книг (по крайней мере на русском), которые вы найдете посвящены программированию под DOS. Однако программирование под Windows в значительной степени проще, тк много вызовов функций API, которые общем похожи на то, что пишется на C.
Кроме книг по самим алгоритмам еще нужны справочники по инструкциям процессора и по компиляторам. Кое-что можно также найти во вышеуказанным ссылкам.
St
Ответ отправлен: 29.10.2002, 20:28
Отправитель: St
Отвечает Dark_Lord
Здравствуйте, Prizrak!
Мне тоже 15. Просто я книжки люблю читать. Вот тебе мой совет, купи Зубкова (под дос) или Пирогова (под Windows), на мой взгляд самые понятные книги!
Ответ отправлен: 29.10.2002, 21:38
Отправитель: Dark_Lord
Отвечает Supra
Доброе время суток, Prizrak!
Купи книгу Фигурнова, еще Зубкова.
скачай asm.kalashnikoff.ru
Ответ отправлен: 01.11.2002, 21:51
Отправитель: Supra
Отвечает baldr
Добрый день, Prizrak!
Ну что же... Желание похвальное...
Если не хочешь покупать бумажные книги (и очень зря - в разы легче!), то поищи в Инете вот что:
- Народ советует Джеффри Рихтера. Сам не читал, но у меня лежит... Вроде умная вещь...
- Я начинал со старой книжки Питера Абеля. Это классика. Есть почти везде.
- Для программирования под WinApi довольно хорошо пишет Чарльз Петцольд.
- Питер Нортон. Названия точно не помню, но что-то про DOS..
Ответ отправлен: 30.10.2002, 00:51
Отправитель: baldr
Отвечает etz
Приветствую Вас, Prizrak!
www.wasm.zite.ru
А вообще - есть около 90 мегов инфы по асму.. Пиши чего конкретно нужно - вышлю.
Ответ отправлен: 30.10.2002, 06:59
Отправитель: etz
Отвечает Maverick
Добрый день, Prizrak!
Архив рассылки Калашникова.
Ответ отправлен: 30.10.2002, 13:36
Отправитель: Maverick
Вопрос № 1644 |
Здравстуйте, Эксперты !
дополнение к вопросу № 1642
Как написать программу,которая создает дисковой файл.
и Как написать программу, которая выводит файл на экран
Программа под DOC
Вопрос отправлен: 29.10.2002, 20:18
Отправитель: Саша
[Следующий вопрос >>] [Список вопросов]
Отвечает igorash
Добрый день, Саша!
Ответ на как написать может быть только один - РУЧКАМИ (если ты конечно не Билли :))
А вот как в своей программе реализовать....
в общем так (под ДОС): создание файла - 21h прерывание, функция 3Ch, Вывод файла на экран - открыть файл, прочитать или весь или кусок в память, вывести на экран, закрыть файл (все это тоже делается с помощью 21 прерывания)
т.е. в первой проге что-то типа
mov ah, 3ch
mov cx, 0
mov dx, offset name
int 21h
name db "blabla.txt",0
второй пример писать в лом... сам подумай... и скачай Ralf Brown Interrupt List
Ответ отправлен: 29.10.2002, 21:04
Отправитель: igorash
Отвечает St
Привет, Саша!
Думаю вам стоит почитать какую нибудь книгу (например http://alex-justasu.narod.ru/index.html). Там есть главы посвященные работе с файлами и выводом на экран.
Кроме того не ясно, хотите ли вы создать полноценный вьюер или просто вывести на экран маленький файл, который поместится на одном экране. Как вы понимаете второй случай гораздо проще.
Если надо сделать вьюер, то надо также обрабатывать нажания клавиш прокрутки и тд, возможно перекодировку (ASCII/ANSI/...) и еще что-нибудь. Тут в двух словах не объяснишь. Я когда-то писал несложный вьюер (~4 кБ) код занял около 2000 строк.
St
Приложение:
Ответ отправлен: 29.10.2002, 20:41
Отправитель: St
Отвечает etz
Доброе время суток, Саша!
INT 21,3C Create file using handle
INT 21,3D Open file using handle
INT 21,3E Close file using handle
INT 21,3F Read file or device using handle
INT 21,40 Write file or device using handle
INT 21,41 Delete file
INT 21,42 Move file pointer using handle
Это для работы с файлами.
Для вывода можно использовать int 21,9
можно юзать процы, которые я привел в приложении. Писал я их сто лет назад, так что за их работу не отвечаю :)
(кстати их вроде нужно будет отформатировать, а то форма похоже 0Dh,0Ah где попало ставит...)
Да - писал я их под тасм, дос.
Млин. длина процы превышает 2048 байта, не пропускает :(
Пиши на etz@ngs.ru я тебе отвечу.
Ответ отправлен: 30.10.2002, 07:17
Отправитель: etz
Отвечает Maverick
Приветствую Вас, Саша!
Какой файл выводит, в каком виде?
Это же надо написать.
А создание файла, это 3ch прерывания 21h
Можно еще создавать временные файлы.
Условия поконкретнее пожалуйста.
Ответ отправлен: 31.10.2002, 05:46
Отправитель: Maverick
Вопрос № 1645 |
Просьба не обижаться и не поднимать флейм.
Получаю рассылку с самого начала.Сейчас пробежался по N403.Однажды даже стал экспертом.Из поступающих вопросов лишь единицы заслуживали внимания и ответа.Система посчитала меня неактивным и выбросила :) К чему это? А будет ли разделение на подгруппы,типа АСМ для самоваров,АСМ для утюгов и тд. или будет единая помойка АСМ для всех?
Вопрос отправлен: 29.10.2002, 20:32
Отправитель: Вася Пупырышкин
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Доброе время суток, Вася Пупырышкин!
"Из поступающих вопросов лишь единицы заслуживали внимания и ответа." Почему это ты так решил? Если бы мы также думали как ты, то твой вопрос тоже не мог бы не заслужить ответа ни одного эксперта.
Разделения (как мне кажется) не будет. Да оно и ни к чему. Не так уж много вопросов приходит в день, чтобы еще разделять рассылку. Помойкой это тоже называть не стоит - кто то читает все выпуски и доволен, потому что просто сталкивается с интересными ситуациями, на которые иногда находится решение. Другие же просто обращаются к ресурсу для решения конкретных проблем. Все вроде ОК.
А то, что тебя выкинули за неактивность - наверное, ты не отвечал в течении 20 дней (я где-то видел эту цифру). Это мне тоже кажется не очень правильно - может человеку пришлось просто уехать на месяц. Что тогда?
Ответ отправлен: 31.10.2002, 13:02
Отправитель: Bob Johnson
Отвечает DiGiT[old]
Приветствую Вас, Вася Пупырышкин!
Ага меня тоже покиляла, за то что два месяца был неактивным :)А вопросы ты прав, в основном дряновые и повторяющиеся. Ну рассылка и расчитана на свой уровень. Поюзай в фидо группы, там иногда прилично и уровень неплохой и без оффтопика :))
ЗЫ. Извиняюсь перед экспертами, если обидел.
Ответ отправлен: 30.10.2002, 08:08
Отправитель: DiGiT[old]
Отвечает Portnov
Доброе время суток, Вася Пупырышкин!
А вот интересный вопрос попался :) Если честно, у меня та же самая проблема, вопросы приходят: как вывести число на экран? Как определить активное окно? Как выглядит число 74 в шестнадцатеричной системе? Объясните мне в двух словах про защищенный режим! И т.д. Неохота отвечать совершенно. Или приходят вопросы довольно сложные, но я знаю, что на них в десять раз лучше чем я ответят BrokenSword или masquer. Идея давно витает, а кто бы ее реализовал...
С уважением, Portnov.
Ответ отправлен: 30.10.2002, 13:20
Отправитель: Portnov
Отвечает Maverick
Приветствую Вас, Вася Пупырышкин!
Насколько я помню, то система удаляет эксперта после 20 дней молчания, а за 20 дней, всяко стоящие вопросы проходят. Насчет разделения, это к Олегу, хотя зачем это?
Вот дополнения к ответам сделать, это надо.
Бывает отправишь ответ на вопрос, думаешь, помог человеку.
А потом как глянешь на свой ответ, другими глазами, и стремно становится, а исправить уже нифига нельзя.
Ответ отправлен: 31.10.2002, 04:39
Отправитель: Maverick
Вопрос № 1646 |
Добрый день,уважаемые эксперты.
Ответте пожалуйста на вопрос:
Каким способом и функцией кроме GetWindowText и GetDlgItemText можно считать содержимое окна в буфер.
Спасибо.
Вопрос отправлен: 29.10.2002, 20:42
Отправитель: Rust (eleron@inbox.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Здравствуйте, Rust!
Послать окну сообщение WM_GETTEXT:
char txt [80];
SendMessage (hwnd, WM_GETTEXT, 80, txt);
Ответ отправлен: 31.10.2002, 13:03
Отправитель: Bob Johnson
Отвечает masquer
Добрый день, Rust!
Послать сообщение окну WM_GETTEXT через SendMessage
Ответ отправлен: 30.10.2002, 11:19
Отправитель: masquer
Отвечает Gibbel
Доброе время суток, Rust!
Можно послать окну сообщение WM_GETTEXT.
Остальные, более "низкие" способы не универсальны и зависят от класса окна.
Ответ отправлен: 30.10.2002, 10:24
Отправитель: Gibbel
Отвечает Eugene
Здравствуйте, Rust!
memcpy
Ответ отправлен: 30.10.2002, 09:44
Отправитель: Eugene
Отвечает ASMодей
Добрый день, Rust!
Содержимое окна в Windows - это графическая картинка, так что
используй функции Set(Get)ClipboardData, BitBlt и DC нужного окна.
Ответ отправлен: 30.10.2002, 14:49
Отправитель: ASMодей
Вопрос № 1647 |
Maverick!
Ты занимаешься вирусами и у тебя полюбак может быть исходник OneHalf. Не вышлешь мне?
Хочу пустить его себе пожить на винт ведь он ничего плохого не сделает?
Пожалуйста!!!
PS Желательно с комментариями
PS на русском
Вопрос отправлен: 29.10.2002, 22:23
Отправитель: Kiselev (kiselev@inbox.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Добрый день, Kiselev!
Хмм, а с чего ты взял, что я занимаюсь вирусами?
Погляжу, мож есть.
Ты лучше запусти к себе пожить wincih95, веселье гарантируется, особенно если у тебя флэшбиос доступен.
Вобщем скину, если найду.
Ответ отправлен: 30.10.2002, 13:36
Отправитель: Maverick
Вопрос № 1648 |
Есть вопрос по резидетам.
Есть у меня такая прога (см. ниже). И она не работает, хотя по идее должна. Не могли бы вы мне помочь, рассказать в чем заключается ошибка. Заранее благодарен, X-RayMan
CSeg Segment
assume cs:CSeg,ds:CSeg,ss:CSeg,es:CSeg
org 100h
begin:
jmp Init
inter proc
nop
nop
int 60h
push ax
push bx
push cx
mov ah,09
mov al,65
mov bl,0Fh
mov cx,01
int 10h
pop cx
pop bx
pop ax
iret
inter endp
Init proc
push dx
push ax
push bx
push di
push es
cli
xor ax,ax
mov es,ax
mov di,00
mov ax,es:[di]
mov OldOff,ax
mov ax,es:[di]+2
mov OldSeg,ax
mov di,60h
shl di,1
shl di,1
mov ax,OldOff
mov es:[di],ax
mov ax,OldSeg
mov es:[di]+2,ax
mov ax,cs
mov bx,offset inter
mov di,00
mov es:[di],bx
mov es:[di]+2,ax
sti
pop ax
mov es,ax
pop di
pop bx
pop ax
mov dx,offset Init
int 27h
pop dx
OldSeg dw ?
OldOff dw ?
Init endp
CSeg ends
end begin
Вопрос отправлен: 30.10.2002, 01:03
Отправитель: X-RayMan (x_rayman@vinnitsa.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Доброе время суток, X-RayMan!
Потому что прерывание 0, которое ты перехватываешь - это обработчик ошибки переполнения деления. А что ты делаешь в его обработчике - вызываешь старый, который завершает программу. Таким образом твоя программа сразу же прекращает работать.
Второе - перед выводом символа задай страницу (в рег. ВН).
Ответ отправлен: 31.10.2002, 13:03
Отправитель: Bob Johnson
Отвечает ASMодей
Доброе время суток, X-RayMan!
Насколько я понял, ты пытаешся заменить обработчик прерывания
"Divizion by zero" своим, в котором сначала вызываешь оригинальный
обработчик. Вот в этом то и ошибка - дело в том, что ситуация
деления на 0 считается фатальной ошибкой выполнявшейся программы,
и поэтому управление ей (а значит и твоему обработчику) не
возвращается.
Ответ отправлен: 30.10.2002, 14:49
Отправитель: ASMодей
Отвечает LIFO
Добрый день, X-RayMan!
Интересно, а как она должна работать.
Ты посадил резиднт на 0 прерывание (зачем- это аварийное прерывание), ты бы хоть в отладчике свою прогу посмотрел.
Перенес адрес обработчика этого прерывания на int 60h
и в начале своей проги (резидентной части вызываешь int 60h, программа аварийно завершается и символ 'A' не выводится.
Во вторых, нужно перед тем как оставить прогу резид. нужно очистить стек, у тебя pop dx почему- то после int 27h
1. убери команду int 60h
2. поставь pop dx перед int 27h
Запусти прогу, а в качестве теста забацай вот это
Int 0; после этого выведется твой символ
Xor ax,ax
Int 16h; ты его увидишь
Int 20h
Ответ отправлен: 30.10.2002, 17:48
Отправитель: LIFO
Вопрос № 1650 |
Здравствуйте уважаемые эксперты! я спросить хочу о программировании на асм под виндой ....
при вызове функции MoveWindow я частенько забывал последний параметр
Repaint: Bool положить в стек, то есть помещал в стек 5 параметров вместо 6-ти,
тем не менее никаких глюков не отмечено... насчет передачи параметров как в Си
я что-то слышал... но как повидло в карамельки запихивают, тьфу, то есть откуда
MoveWindow знает сколь я ей параметров передал и сколь их потом из стека
выталкивать... глюки начались только когда я MoveWindow применял к двум
контролам подряд, до тех пор все шло нормально
Вопрос отправлен: 30.10.2002, 12:16
Отправитель: Samodelkin (transacter@mailru.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Здравствуйте, Samodelkin!
Функция не знает, сколько ты ей передал параметров - она считает, что все. Так что она использовала в качестве 6-го параметра то, что находилось в стеке на его месте (и очищала стек, исходя из этого), т.е. двойное слово, которое извлеклось бы командой pop, поставленной вместо вызыва этой функции. А вот что у тебя уже там находилось - это зависит от места вызова. А так как назначение bool предельно просто (0 - false, все остальное - true) - то программа работала.
P.S. Чтобы не путать с параметрами - в TASM есть такой способ определения прототипов функций:
SetParent ProcDesc StdCall :DWord, :DWord
После этого, никак, кроме как с двумя параметрами ты эту функцию не вызовешь! (ну... только можно вообще без них, но в этом случае TASM считает, что ты их сам поместил в стек). Пример:
Call SetParent, eax - ошибка - 1 параметр вместо 2
Call SetParent, eax, ebx - ok
push ebx
push eax
Call SetParent - тоже ок
Ответ отправлен: 31.10.2002, 13:03
Отправитель: Bob Johnson
Отвечает Sub0
Доброе время суток, Samodelkin!
Сишный метод передачи параметров - это передача их через стек причём справа налево они заносятся. По идее функция просто ожидает верного количества и типа параметров, но существуют функции типа printf которые первым делом считывают количество переданных параметров. В твоём случае я думаю тебе просто повезло на стеке вместо 6го параметра был 0 или 1. Причём в Сишном методе вызывающая функция должна потом чистить стек.
Ответ отправлен: 31.10.2002, 12:26
Отправитель: Sub0
Отвечает Ayl
Здравствуйте, Samodelkin!
Ну, если прототип функции описан как void _cdecl MoveWindow ..., то она только обращается к параметрам через [bp + xx], а за передачу параметров и очистку стека отвечает вызывающая процедура. Соответственно, пока у тебя по адресу bp+xx находится корректное значение с точки зрения процедуры, то все будет ок. Иначе будет глючить. Остается вариант, если значение корректное, но выполняет действие, отличное от предполагаемого - ну тут, надеюсь, результат понятный...
А вот если бы функция была описана с модификатором pascal, то тогда именно она бы занималась освобождением стека (например, командой ret n) и вот тогда бы ошибка передачи параметров сработала бы сразу же.
Ответ отправлен: 30.10.2002, 12:34
Отправитель: Ayl
Отвечает masquer
Здравствуйте, Samodelkin!
Стек нарушается от таких ошибок, а это уже чревато...
Функция предполагает что ты засунешь в стек 6 параметров и в конце она настрот стек на эту разницу, чтобы вернуться к твоему процессу. Так что лечше не рискуй с этим.
Ответ отправлен: 30.10.2002, 12:49
Отправитель: masquer
Отвечает Gibbel
Доброе время суток, Samodelkin!
Оно ни откуда не знает... Просто тебе повезло, и ты не вызывал MoveWindow такое количество раз, чтоб затереть жизненно важную информацию на стеке...
Ответ отправлен: 30.10.2002, 13:41
Отправитель: Gibbel
Вопрос № 1652 |
Здравствуйте уважаемые эксперты! я спросить хочу о программировании на асм под виндой ....
"процедура не должна изменять регистры EBP,EDI,ESI и EBX !"
почему оконная процедура должна придерживаться этого требования,
приведенного Зубковым? это же системные функции windows придерживаются такого
правила и не обязаны сохранять значения других регистров за исключением
указанных... но зачем процедуре моего окна придерживаться такого требования?
Вопрос отправлен: 30.10.2002, 12:16
Отправитель: Samodelkin (transacter@mailru.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает Atmion
Доброе время суток, Samodelkin!
Ну это просто общепринятое соглашение об использовании регистров перед вызовом (после вызова) функций в Windows. Одни регистры ( конкретно: ebx, edi, esi и ebp) обязательно надо сохранять при входе в функцию, и восстанавливать при выходе из функции, потому что считается, что ВЫЗЫВАЮЩАЯ функция имеет какие-то данные в этих регистрах, и она РАССЧИТЫВАЕТ на то, что ВЫЗЫВАЕМАЯ функция ничего в них не изменит (а значит если вызываемой функции надо использовать эти регистры, то надо их сначала сохранить, а перед возвратом управления вызывающей функции - восстановить). А насчет других регистров ( конкретно: eax, ecx и edx) считается, что в них не содержится ничего важного перед вызовом функции Win32, и она может использовать их как захочет, и не должна восстанавливать перед возвратом управления твоей функции. Но если их не надо восстанавливать, то значит в одном (или нескольких)из них можно передать вызывающей функции какие-то данные (что и происходит с регистром EAX - через него вызываемая функция возвращает результат своей работы вызывающей функции). Это - общепринятое соглашение, которое распространяется НА ВСЕ функции в Windows, а значит ему должны следовать НЕ ТОЛЬКО функции Win32, но и твои функции! Потому что КАК твоя функция ожидает, что вызванная функция Win32 не изменит регистры ebx, edi, esi и ebp (и поэтому может НЕ СОХРАНЯТЬ их содержимое ПЕРЕД вызовом функции Win32), ТАК И функции Win32 ожидают, что твоя функция тоже не изменит ebx, edi, esi и ebp, и поэтому функции Win32 тоже не сохраняют значения этих регистров перед вызовом твоих функций (в частности, перед вызовом функции WndProc). Поэтому если в WndProc тебе надо использовать регистры ebx, edi, esi и ebp - ты должен их сохранить в оконной процедуре, а перед выходом из нее - восстановить.
Ответ отправлен: 30.10.2002, 21:27
Отправитель: Atmion
Отвечает Ayl
Добрый день, Samodelkin!
Ну, на самом деле при программировании на чистом асм ты волен сам следить за регистрами. Подозреваю, что Зубков писал о функциях, которые должны вызываться из программы на Си. Для них действительно необходимое требование сохранение регистров EBP, EDI, ESI и EBX, потому что в этих регистрах компилятор хранит регистровые переменные.
Ответ отправлен: 30.10.2002, 12:44
Отправитель: Ayl
Отвечает Bob Johnson
Доброе время суток, Samodelkin!
Потому что твоя оконная процедура вызывается системой, которая считает, что она (процедура) придерживается этих правил.
Ответ отправлен: 31.10.2002, 13:03
Отправитель: Bob Johnson
Отвечает St
Привет, Samodelkin!
Свои личные прцедуры в программе можете писать как хотите, но процедура окна возвращает управление в Windows, который ожидает от вас выполнения некоторых правил (в том числе и правильного числа параметров передаваемых в процедуры API). Ведь если писать систему с "защитой от дурака" на ВСЕХ функциях, то она будет тормозить как как XP на XT (а он и на 1 ГГц не шибко быстр :)
St
Ответ отправлен: 30.10.2002, 12:48
Отправитель: St
Отвечает masquer
Доброе время суток, Samodelkin!
По своему опыту скажу что в 9х можешь не придерживаться этого правила, а НТ системах получишь кучу сложноотлавливаемого гемора, вплоть до полной неработоспособности программы, т.к. эти подразумевается, что эти регистры только системой используются. Просто сохраняй их в начале и восстанавливай в конце каждой процедуры, их меняющей...
Ответ отправлен: 30.10.2002, 12:53
Отправитель: masquer
Отвечает Portnov
Добрый день, Samodelkin!
Винда использует эти регистры в своих целях и не ожидает, что вы будете изменять их. Тем не менее, изменять их можно, но с умом! Например, если вам приспичило что-то сделать с EBP, то надо писать
push ebp
mov ebp,...
call....
...
pop ebp
Тогда в результате выполнения вашей процедуры эти регистры не изменятся!
С уважением, Portnov.
Ответ отправлен: 30.10.2002, 13:25
Отправитель: Portnov
Отвечает Gibbel
Доброе время суток, Samodelkin!
Оконная функция вызывается системой, которая построена с расчетом на то, что ни одна из вызываемых функций, как внутренних(системных), так и внешних не будут изменять эти регистры.
Ответ отправлен: 30.10.2002, 13:46
Отправитель: Gibbel
Отвечает Dark_Lord
Добрый день, Samodelkin!
Это всё от случая к случаю, у зубкова ebp = адреса на параметры стека, edi,esi - handle программы и окна, насколько я помню книгу, и т.д.
Ответ отправлен: 31.10.2002, 20:57
Отправитель: Dark_Lord
Вопрос № 1653 |
Здравствуйте снова!
опять я!
В описании MoveWindow сказано что она "посылает окну сообщение wm_Size.
Значения ширины и высоты, переданные в wm_Size, совпадают с размерами области
пользователя.... " а нельзя послать wm_Size с помощью sendmessage? а для
контрола? почему-то с MoveWindow изменить размер не проблема, а на посланное
с помощью sendmessage (или SendDlgItemMessage) wm_Size никакой контрол не
реагирует
чую что подлость в том что процедура моего окна, получив WM_SIZE и послав
в ответ моему окну WM_SIZE, кончит тем что само собой посланное и получит
вновь... или же нет?
в таком случае почему в описании MoveWindow сказано что она "посылает окну
сообщение wm_Size? как и от кого это сообщение попадает на обработку в мою
процедуру окна и куда его все-таки отправляет MoveWindow?
вообще у меня явный пробел в понимании системы сообщений windows, например до
сих пор не пойму почему задизаблить кнопку нельзя просто послав ей сообщение
wm_Enabled, а нужно опять же функцию вызывать EnableWindow... да к тому же
если это кнопка есть же BM_SetStyle вот бы ограничиться посылкой ей WS_DISABLED
Вопрос отправлен: 30.10.2002, 12:20
Отправитель: Samodelkin (transacter@mailru.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Приветствую Вас, Samodelkin!
Потому что на счет WM_SIZE ты понял все наоборот!
Это сообщение НЕ ЗАСТАВЛЯЕТ окно изменить размер. Оно лишь СООБЩАЕТ ему, что его размер изменился. И твоя процедура может на это отреагировать (например, что-то добавить в окно, т.к. его размер стал больше). Вот поэтому MoveWindow (которая РЕАЛЬНО меняет размер) и посылает это (и еще неск. других) сообщений.
Оно попадает в обработку твоей процедуры посредством SendMessage, которая передает управление НЕПОСРЕДСТВЕННо твоей оконной процедуре (если окно принадлежит твоей программе). Т.е. ты вызываешь MoveWindow, она вызывает SendMessage, которая снова вызывает твою оконную процедуру.
2. Так уж придумали Windows. WM_ENABLE это тоже информационное сообщение - оно сообщает окну, что его разрешили или запретили (ну вот так перевел enable и disable).
В общем - читай MSDN - там все отлично написано (только на английском).
Ответ отправлен: 31.10.2002, 13:03
Отправитель: Bob Johnson
Отвечает masquer
Приветствую Вас, Samodelkin!
по идее SendMessage должна работать, у себя баги ищи.
Более расширенно про все это читай у Рихтера - must have любого программера под винды.
Ответ отправлен: 30.10.2002, 13:01
Отправитель: masquer
Отвечает St
Привет, Samodelkin!
Вот кусок из хелпа
MoveWindow sends WM_WINDOWPOSCHANGING, WM_WINDOWPOSCHANGED, WM_MOVE, WM_SIZE, and WM_NCCALCSIZE messages to the window.
Так что одним WM_SIZE дело не обходится.
Кстати не понятно: вы пишите свои программы или разбираетесь как работает Windows? Если первое, то за исключением отдельных случаев (когда вас не устраивает скорость работы или размер программы) не стоит изобретать обходные пути, когда есть прямой.
St
Ответ отправлен: 30.10.2002, 13:09
Отправитель: St
Отвечает Gibbel
Доброе время суток, Samodelkin!
WM_SIZE - это лишь оповещающее сообщение. В своей оконной функции, в ответ на это сообщение, необходимо изменить соответствующим образом все внутренние элементы. А MoveWindow вообще никаким сообщением эмулировать не удасться. Да и зачем лишний геморой???
То же и насчет WM_ENABLE.
А WS_DISABLED - это вообще не сообщение, а стиль окна. И устанавливается он функцией SetWindowLong. Стили просматриваются при перерисовке окна, так что после его установки тебе еще кучу сообщений придется послать.
Ответ отправлен: 30.10.2002, 13:56
Отправитель: Gibbel
Вопрос № 1654 |
Здраствуйте, уважаемые эксперты!
Мне необходимо измерять интервалы времени с очень большой точностью (меньше одной 1мс). API функции
timeGetTime();timeEndPeriod();
timeBeginPeriod(); мне не помогают, так как максимальная точность таймера, которую мне может Windows предоставить 1мс. и
то при использовании функции timeEndPeriod(); timeBeginPeriod(); (по умолчанию 56 мс).
Недавно я на одном сайте увидел кусок кода, где писалось о перепрограммировании таймера (код у меня есть), после
чего прерывания происходили с периодом 836 нс. Однако этот код был написан под DOC. Проблема заключается в том , что этот
код необходимо написать под Windows, но я то нахожусь в третьем кольце защиты и привилегированные команды мне недоступны. В
нулевом кольце я могу работать только на уровне VxD. Теоретически я думаю, что можно заменить стандартный драйвер таймера на
свой собственный, который будет давать отдельные прерывания 836 нс, а также стандартное прерывание таймера 56 мс., чтобы
вытесняющая многозадачность Винды не полетела.
Все это я только предполагаю. Я очень буду Вам благодарен, если Вы поделитесь своими соображениями по этому поводу.
Вопрос отправлен: 30.10.2002, 15:31
Отправитель: Alex
[Следующий вопрос >>] [Список вопросов]
Отвечает St
Привет, Alex!
Можно создать свой таймер в отдельном потоке с GetTickCount (или более точной QueryPerformanceCounter) использованием функции Sleep, но она принимает интервалы только до миллисекунды.
Попробуете почитать о функции SetWaitableTimer (см приложение). Там упоминаются 100-наносекундные интервалы. Но она работает только на NT-ях и Win98 и выше.
St
Приложение:
Ответ отправлен: 30.10.2002, 16:37
Отправитель: St
Отвечает baldr
Здравствуйте, Alex!
Я не знаю какого уровня у тебя знания, но вот я бы такие вещи даже придумывать бы не стал...
Понимаешь, VXD-драйвера вызываются своей виртуальной машиной, которая все же выше находится, чем
обработчик системного таймера. Вполне возможно, что он-то сам и гораздо быстрее вызывается, чем
по умолчанию в DOS или BIOS. Но практически любая современная операционная система основана на
обработке таймера в первую очередь. Это и многозадачность, и системные сообщения и много чего еще... В общем, это зашито глубоко внутри системы и тебе вряд ли это так просто достанется...
Короче говоря, надо идти немного другим путем. Вот, например, на MSVC++ у меня на работе используется класс, который представляет собой таймер с довольно точным тиком - в функции можно
задать время генерации аж через каждую наносекунду (!!!)... Правда, очень не факт, что оно будет
работать, ибо даже при частоте вызова более 1 кГц система через десяток секунд конкретно рухает
(правда, там вывод на экран еще много жрет!)... Выслать не проси - я, честно говоря, не уверен, какие библиотеки ему там надо.
Ответ отправлен: 30.10.2002, 23:27
Отправитель: baldr
Отвечает Bob Johnson
Добрый день, Alex!
Ты, конечно, прав. Но вот только вспомни - все гениальное просто. Зачем тебе так усложнять себе жизнь? Я сам писал драйвер, который патчил прерывания таймера. Причем патчил IDT без всяких там сервисов. Вот что из этого получилось - когда работает дос, т.е. управление передается другой виртуальной машине - у нее своя таблица прерываний... Может просто надо было вызывать сервис, но ... теперь уже поздно думать.
В общем у тебя есть еще (плюс к тому, что сам придумал) 2 варианта.
1. Использовать VTD_Get_Real_Time или QueryPerformanceCounter (первое для драйвера, второе - обычная апи функция), которая возвращает время с точностью 836нс (как я понимаю - эта функция просто читает значения из регистров таймера). Достаточно точная функция, применяется нек. играми.
2. Использовать rdtsc. Это максимально точная вещь, т.к. основана на тактовой частоте. Для применения необходимо вначале измерить эту частоту (замерить разность значений, возвращаемых этой командой за заданный интервал времени (который можно и с пом. timeGetTime отмерить) и поделить). Только эта команда поддерживается начиная с Pentium.
Ответ отправлен: 31.10.2002, 13:04
Отправитель: Bob Johnson
Отвечает masquer
Приветствую Вас, Alex!
В качестве соображений скажу, что винда со свистом вылетит после таких перепрограммирований. Пробуй rdtsc использовать.
Ответ отправлен: 30.10.2002, 18:15
Отправитель: masquer
Отвечает ASMодей
Доброе время суток, Alex!
Точно отмерить время под Windows скорее всего не удастся,
так как это не "Real Time OS". Даже если перепрограммировать
таймер (что вряд ли удастся в Win2000 и XP), он все равно
будет работать неточно из-за многозадачности.
Ответ отправлен: 31.10.2002, 07:12
Отправитель: ASMодей
Форма отправки вопроса |
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
© 2002 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (43) C / C++ (28) Perl (5) Delphi (16) Pascal (23) Basic / VBA (9) Java / JavaScript (11) PHP (8) MySQL / MSSQL (11) |
Пользователю Windows 95/98/Me (30) Windows NT/2000/XP (18) "Железо" (26) Поиск информации (10) |
Администратору Windows NT/2000/XP (10) Linux / Unix (13) |
Юристу Гражданское право (10) Семейное право (6) Трудовое право (5) КоАП (6) |
Отправить вопрос всем экспертам выбранной рассылки.
© 2002 Россия, Москва. Авторское право: RusFAQ.ru |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||