Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 408
от 04.11.2002, 15:40
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 1703 Отправлено ответов: 5384 Активность: 316.1 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Артём Шегеда Статус: Профессиональный Общий рейтинг: 116.06 URL: Пристанище неодинокого программиста [Подробней >>] |
Broken Sword Статус: Профессиональный Общий рейтинг: 130.82 URL: моя рассылка по Protected Mode [Подробней >>] |
Maverick Статус: Опытный Общий рейтинг: 137.82 URL: Страница по асму и вирмейку Телефон: 89039415024 (BiLine GSM) [Подробней >>] |
Beeblebrox Статус: Профессиональный Общий рейтинг: 113.11 URL: Beeblebrox / TMA HomePage [Подробней >>] |
masquer Статус: Профессиональный Общий рейтинг: 154.07 [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 155.27 [Подробней >>] |
St Статус: Доверительный Общий рейтинг: 116.15 [Подробней >>] |
ASMодей Статус: Профессиональный Общий рейтинг: 120.77 [Подробней >>] |
Gibbel Статус: Профессиональный Общий рейтинг: 108.64 URL: Страничка обо мне и моих друзьях [Подробней >>] |
Dark_Lord Статус: Профессиональный Общий рейтинг: 128.51 [Подробней >>] |
Atmion Статус: Доверительный Общий рейтинг: 124.5 [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 117.84 [Подробней >>] |
Sensey Статус: Профессиональный Общий рейтинг: 123.8 URL: Страничка рассылки по Паскаля... Телефон: +38 (0572) 41-76-04 дом. [Подробней >>] |
Dron Статус: Профессиональный Общий рейтинг: 116.16 URL: Операционная система с нуля! [Подробней >>] |
Biv Статус: Опытный Общий рейтинг: 113.25 [Подробней >>] |
LIFO Статус: Профессиональный Общий рейтинг: 128.76 Телефон: 8 01710 24758 [Подробней >>] |
Portnov Статус: Профессиональный Общий рейтинг: 118.46 URL: Мой сайтик... [Подробней >>] |
etz Статус: Начальный Общий рейтинг: 110.81 [Подробней >>] |
Eugene Статус: Доверительный Общий рейтинг: 113.79 [Подробней >>] |
Sub0 Статус: Начальный Общий рейтинг: 104.76 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 1655. Уважаемые эксперты объясните почему так... Первый раз вижу чтоб код менялся на глазах: программа &qu... (ответов: 5)
Вопрос № 1656. В общем ассеблер фактичиски не знаю (несколько первых здешних уроков) - но есть очень срочная пробле... (ответов: 8)
Вопрос № 1657. Почему моя программа не пашет? Я пользуюсь TASM 5.0.... (ответов: 8)
Вопрос № 1658. Это еще раз я. Спасибо ASMодею и LIFO, за то, что наставили меня на путь истинный. Теперь у меня поя... (ответов: 7)
Вопрос № 1659. >>В общем ассеблер фактичиски не знаю (несколько первых >>здешних уроков) - но есть очень срочная пр... (ответов: 1)
Вопрос № 1660. Некоторое время назад мне написал человек по имени Eraser с просьбой выслать ему исходник звонилки R... (ответов: 2)
Вопрос № 1661. Подскажите пожалуйста назначение и параметры функции GetDlgItem().... (ответов: 7)
Вопрос № 1663. Здравствуйте навсегда, эксперты.... несмотря на некоторое противоречие в ответах крупицы ценной инфо... (ответов: 3)
Вопрос № 1664. Экспертам всем здрасте! тут еще вдогонку как макросу передать две строки? чтоб не заморачиваться ско... (ответов: 1)
Вопрос № 1666. Иz иzвестного: В "системном таймере 53(54)" нулевой канал считает с частотой 1193180Hz, ча... (ответов: 2)
Вопрос № 1667. Здравствуйте, господа Эксперты! У меня такой вопрос возник: Как, имея идентификатор процесса, получи... (ответов: 4)
Вопрос № 1668. Всех с Днем! А почему у Вас в The Bat!1.34 button "Подтверждаю" не пашет? Хотя я догадываю... (ответов: 2)
Вопрос № 1669. ЭТО ДЛЯ -САШИ- ОН ТУТ ВОПРОС ЗАДАВАЛ НАЩЁТ ФИБАНАЧИ. А Я КАК РАЗ ТАКУЮ ЖЕ ПРОГУ ДЕЛАЛ И УЖЕ ВСЕХ ... (ответов: 1)
Вопрос № 1670. Прив, уважаемые знатоки! В ответе на вопрос 1571 было упомянуто, в частности, что можно получить дос... (ответов: 13)
Вопрос № 1671. Дастаточное ли условие для включения страничной адресации в защищенном режиме - установка 31-бит... (ответов: 4)
Вопросов: 15, ответов: 68
Вопрос № 1655 |
Уважаемые эксперты объясните почему так...
Первый раз вижу чтоб код менялся на глазах: программа "Essential NetTools" при трасировке без входа в тело функци (F8) в сайсе меняется код на глазах, думал сайс глючный поставил другой все одно и тоже. Я не профи поэтому как можно понятней, если не сложно.
З.Ы. Код меняется только в том месте где происходит проверка CRC
Приложение:
Вопрос отправлен: 30.10.2002, 19:01
Отправитель: Himoza (Himoza@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Артём Шегеда
Добрый день, Himoza!
В приложении две DOS-программы формата COM.
Первая - конечный результат. Загрузи в отладчик и пройдись без захода в функции.
Вторая - исходный текст, результат компиляции и компоновки которого следует ещё подредактировать (забить нулями диапазоны 000A-0012 и 0014-001A).
Инструкции NOP после вызова функций установлены умышленно (без них трассировка большинством отладчиков невозможна).
Приложение:
Ответ отправлен: 31.10.2002, 16:07
Отправитель: Артём Шегеда
Отвечает Broken Sword
Добрый день, Himoza!
Это все SEH проказит...
Ответ отправлен: 30.10.2002, 19:51
Отправитель: Broken Sword
Отвечает Maverick
Приветствую Вас, Himoza!
Такой программы я не знаю, но вот простейший пример.
..........
decriptor:
lea si, start
lea di, start
mov cx, size
loop_decr:
lodsb
xor al,13
stosb
loop loop_decr
Start:
............
Т.е. этот кусок кода будет шифровать, или расшифровывать столько байт после start, сколько в переменной size.
Если посмотришь, на это в отладчике, то все увидишь.
Ответ отправлен: 31.10.2002, 04:40
Отправитель: Maverick
Отвечает Beeblebrox
Приветствую Вас, Himoza!
Один из вариантов защиты - расшифровка кода в пошаговом режиме через int1 и int3. Ничего удивительного :)
Ответ отправлен: 31.10.2002, 10:02
Отправитель: Beeblebrox
Отвечает masquer
Добрый день, Himoza!
Подумаешь, самомодифицирующийся код, любой пакер/протектор этим балуется...
Ответ отправлен: 31.10.2002, 10:55
Отправитель: masquer
Вопрос № 1656 |
В общем ассеблер фактичиски не знаю (несколько первых здешних уроков) - но есть очень срочная проблема, а знакомых, которые могли бы помочь нет... Есть некая не очень большая програмка, в которой по нажатию клавиши 'таб' происходит одно действие - вопрос такой - возможно ли отключить это действие - чтобы на нажатие 'таба' программа не реагировала?
Вопрос отправлен: 30.10.2002, 19:10
Отправитель: Ivan
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Добрый день, Ivan!
Да, вполне. Если прога под ДОС - ишешь вызов функций работы с клавиатурой (обычно это - int 10h и функции 00 и 01h, или int 21h - но это в твоей проги вряд ли) и смотришь, как она работает с возвращенным значением. Находишь место, где она определяет, что это - таб и удаляешь соотв. jmp.
Если под виндой - тогда в процедуре окна смотришь обработку сообщения WM_CHAR или WM_WM_KEYDOWN и тоже находишь проверку.
Ответ отправлен: 31.10.2002, 13:04
Отправитель: Bob Johnson
Отвечает St
Здравствуйте, Ivan!
Под DOS, Windows? Под DOS проще тк он однозадачный и - до запуска проги надо перехвать клавиатурное прерывание и не пропускать дальше нажатие Tab.
Под Windows нужно фильтровать сообщения от клавиатуры и по хендлу окна - иначе можно испортить работу других программ.
Вам нужны подробности?
St
Ответ отправлен: 30.10.2002, 19:32
Отправитель: St
Отвечает Maverick
Доброе время суток, Ivan!
Да, возможно. Нужно перехватить прерывание 9h, сравнить нажата ли таб, если да, то ничего не делать, если нет, то передать управление оригинальному обработчику.
Одним словом написать простенький резидент.
Ответ отправлен: 31.10.2002, 04:40
Отправитель: Maverick
Отвечает ASMодей
Здравствуйте, Ivan!
Если используется DOS, то нужно написать свой обработчик
прерывания клавиатуры, и как только встретится код клавиши
TAB, делать вид что ничего не произошло :)
Ответ отправлен: 31.10.2002, 07:12
Отправитель: ASMодей
Отвечает Gibbel
Здравствуйте, Ivan!
Ответ: Возможно.
Если ты ожидаешь услышать как, то уточни, хотя бы, под какую операционку программа...
Ответ отправлен: 31.10.2002, 10:09
Отправитель: Gibbel
Отвечает masquer
Доброе время суток, Ivan!
Можно, все от операционной системы зависит. Под виндой нужно ловить сообщение WM_KEYUP (WM_KEYDOWN), под ДОСом тебе уже посоветовали, что делать. Вообще мало информации даешь, поэтому и ответы такие...
Ответ отправлен: 31.10.2002, 10:59
Отправитель: masquer
Отвечает Dark_Lord
Добрый день, Ivan!
Можно, наёди то место где она проверяет нажатую кнопку, и за место прыжка или вызова обработки процедуры запиши пару nop - ов!
Ответ отправлен: 31.10.2002, 20:59
Отправитель: Dark_Lord
Отвечает Atmion
Здравствуйте, Ivan!
Это можно. Перехвати до запуска этой программы прерывание 09h, и сохрани внутри твоего нового обработчика адрес старого обработчика 09h. Теперь, когда каждый раз при нажатии клавиши будет вызываться новый обработчик 09h, проверяй, является ли считанный из порта 60h код - скен-кодом клавиши Tab. Если является, то ничего не делай и просто возвращай управление программе, если НЕ является, то для обработки другого скен-кода вызывай старый обработчик 09h, адрес которого ты сохранил в своем обработчике.
Ответ отправлен: 31.10.2002, 21:17
Отправитель: Atmion
Вопрос № 1657 |
Почему моя программа не пашет? Я пользуюсь TASM 5.0.
Приложение:
Вопрос отправлен: 30.10.2002, 19:15
Отправитель: Faraon
[Следующий вопрос >>] [Список вопросов]
Отвечает Артём Шегеда
Добрый день, Faraon!
К ответам экспертов добавлю почти рабочий код. Сравнить его с исходным можно с помощью этой утилиты
Ответ отправлен: 31.10.2002, 16:23
Отправитель: Артём Шегеда
Отвечает Broken Sword
Здравствуйте, Faraon!
int 29h - вывод символа, ASCII-код которого (обрати внимание, что именно ASCII-код!!!) лежит в al. А у тебя чего? поэтому нужно либо кавычками выделять цифры после db (тогда это будут их ASCII кода), либо прибавлять 30h.
А вообще для твоего случая больше подойдет что то типа:
mov ah,9
mov dx,offset expr
int 21h
expr db '95+71=166',24h
p.s. к чему ты приплел таблицу hex-символов?
Ответ отправлен: 30.10.2002, 19:58
Отправитель: Broken Sword
Отвечает Ayl
Здравствуйте, Faraon!
А почему она должна работать?
Код узнаю - первоначально мой был. Но что с ним сделали? Ужас!
mov ax,[Num_1]
mov cx,ax
int 29h << это что такое??? Откуда? Что при этом будет выведено на экран? В регистре al находится 7. То есть выведется символ ASCII 7. В лучшем случае пропищит, в худшем - нарисует загогулину какую-нибудь. У меня на этом месте было call Print_AX.
mov ax,[Num_2]
add cx,ax
int 29h << та же фигня
xchg ax,cx
int 29h << опять то же самое. Но здесь надо просто убрать int 29h.
mov ax,4c00h
int 21h << ну а это нафига? Здесь стоял простой ret. Первые 2 раза отсюда был выход из подпрограммы, вызванной по call, а в конце - выход в DOS.
Нет, я, конечно, все понимаю, но если берешь рабочий код и начинаешь его править, то будь добр сначала понять, как он раньше работал, что б не спрашивать потом "а почему МОЯ программа не работает?".
Ответ отправлен: 30.10.2002, 19:48
Отправитель: Ayl
Отвечает St
Привет, Faraon!
Извините. В каком смысле не пашет - она же выводит на экран что-то. А что должна?
St
Ответ отправлен: 30.10.2002, 19:50
Отправитель: St
Отвечает Sensey
Добрый день, Faraon!
Тут Артём Шегеда отправил пример, а он почему-то на дошёл. Я его повторно посылаю.
Приложение:
Ответ отправлен: 31.10.2002, 16:32
Отправитель: Sensey
Отвечает Bob Johnson
Доброе время суток, Faraon!
Потому что int 29h выводит символ на экран, а не десятичное значение регистра. ЧТобы вывести значение регистра - надо его преобразовать в строку, а потом выводить обычными средствами.
Ответ отправлен: 31.10.2002, 13:04
Отправитель: Bob Johnson
Отвечает Maverick
Приветствую Вас, Faraon!
А с чего ты взял, что программа не пашет?
Программа прекрасно пашет, другой вопрос, что тебя не устраивает результат ее пахания :)
Так ты и напиши, что ты хочешь от нее получить, какой результат, конкретно, что тебе надо, чтоб она вывела на экран. И тогда тебе помогут, а сдесь телепатов нет, как сказал какой то эксперт :)
Maverick@nightmail.ru
Мыль, разберемся.
Ответ отправлен: 31.10.2002, 05:43
Отправитель: Maverick
Отвечает ASMодей
Добрый день, Faraon!
Нельзя просто так взять и вывести число на экран, сначала
его нужно преобразовать в строку символов, а затем эту строку
и выводить. Как это сделать - почитай рассылку, недавно этот
вопрос уже задавали.
Ответ отправлен: 31.10.2002, 07:13
Отправитель: ASMодей
Вопрос № 1658 |
Это еще раз я. Спасибо ASMодею и LIFO, за то, что наставили меня на путь истинный. Теперь у меня появилось еще парочка вопросов.
Почему во всех книгах, которые я читал, 0h - прерывания системного таймера, а на самом деле - это прерывание Division by 0?
И еще, как написать резидент под винду? А то которые под ДОС не идут, всплывающие программы мешают.
И еще один: есть какое-то аппаратное прерывание, которое срабатывает чаще, чем часы реального времени и имеет не самый низкий приоритет?
Вопрос отправлен: 30.10.2002, 19:57
Отправитель: X-RayMan
[Следующий вопрос >>] [Список вопросов]
Отвечает Broken Sword
Доброе время суток, X-RayMan!
1. Почему то очень часто встречающееся заблуждение. На самом деле путаются два понятия: IRQ0 и INT0. Разница налицо. IRQ - это приоритет запроса прерываний, а INT - это вектор. IRQ0 (таймер) - самый высокоприоритетный, IRQ15 (жесткий диск №2) имеет наименьший приоритет. А каждому IRQ ставится в соответствие вектор:
IRQ0 - INT 08h
...
IRQ7 - INT 0Fh
и
IRQ8 - INT 70h
...
IRQ15 - INT 77h
Нет, таймер - это самое высокоприоритетное аппаратное прерывание. Чаще таймера (если его не перепрограмировать) вызывается много чего, например, прерывание последовательного порта (около 20000 раз в сек)
Ответ отправлен: 30.10.2002, 21:33
Отправитель: Broken Sword
Отвечает Bob Johnson
Добрый день, X-RayMan!
1. Потому что есть различия между аппаратным irq 0 и программным int 0. Программное int 0 всегда отвечает за обработку деления на 0, а вот аппаратное irq 0 - это уже прерывание таймера, но благодаря программируемому контроллеру прерываний оно перенаправлено на программное int 8 (в досе).
2. В винде нет понятия резидента. Там все программы работают одновременно.
3. Под дос ты можешь перепрограммировать таймер и получить хоть 1 млн прерываний в секунду. Под виндой - нет, но там можно заставить этим заниматься отдельный поток команд.
Ответ отправлен: 31.10.2002, 13:05
Отправитель: Bob Johnson
Отвечает Atmion
Добрый день, X-RayMan!
Прерывание деления на ноль - это прерывание 0h
Прерывание таймера - это прерывание 08h
Однако! Прерывание от таймера поступает в контроллер прерываний по линии IRQ 0 (может отсюда и возникла путаница), и получив сигнал прерывания по линии IRQ 0, контроллер прерываний посылает в процессор по линиям данных число 08h (почему контроллер прерываний так делает? потому что процедура POST при начальной загрузке так его настроила, что он всегда прибавляет к НОМЕРУ линии IRQ число 08h, т.е. если контроллер прерываний получит сигнал по линии IRQ 0, то он пошлет в процессор номер прерывания 08h, если контроллер прерываний получит сигнал по линии IRQ 1, то он пошлет в процессор номер прерывания 09h, и т.д.)
Резидент под винду ты никак не напишешь. Ты можешь просто написать еще одно приложение Win32, которое при запуске просто не будет отображать свое окно, и в систем-трее тоже ничего не отобразит, а вместо этого будет перехватывать конкретную комбинацию горячих клавиш, и когда пользователь ее нажмет, вот тут-то программа и покажет окно. Но с точки зрения организации памяти, это твое приложение будет еще одним процессом Win32, и отобрать управление у операционки или других программ (как это было в случае TSR-программ под DOS'ом) оно не может, многозадачность - прерогатива винда. Но при перехвате горячих клавиш ТЫ НЕ МОЖЕШЬ знать, какое из запущенных приложений будет активным. Поэтому ты должен умудриться найти такую комбинацию клавиш, при нажатии которой всегда будет появляться окно твоей проги, и чтобы эти клавиши твоей проги НЕ СОВПАЛИ с горячими клавишами, которые любая другая прога или сама винда зарезервировали для себя.
Ответ отправлен: 31.10.2002, 20:06
Отправитель: Atmion
Отвечает ASMодей
Здравствуйте, X-RayMan!
Ты наверное спутал понятия IRQ (Interrupt ReQuest) и вектор
прерывания. У системного таймера IRQ действительно = 0, но
сопоставлен он вектору прерывания 08h (хотя это можно изменить
самому, перепрограммируя PIC - Programmable Interrupt Controller).
2. Если тебе нужен резидент для DOS-программ, то попробуй прописать
его в autoexec.bat, вроде бы у меня это когда-то работало. Ну
а для Windows понятия "резидентная программа" по-моему уже нет,
хотя можно сделать его аналог.
3. По-моему нет, но если очень нужно, то можно перепрограммировать
системный таймер и использовать INT 08h.
Ответ отправлен: 31.10.2002, 07:13
Отправитель: ASMодей
Отвечает Gibbel
Здравствуйте, X-RayMan!
1. Ты путаешь INT и IRQ. INT - это программное прерывание. INT 0 = Division by 0. IRQ - аппаратное прерывание. Каждому IRQ соответствует свой INT. IRQ 0 = INT 8 = Timer.
2. Под винду бывает много типов резидентов. Один из них, часто встречающийся, устанавливается с помощью SetWindowsHookEx.
3. Можешь использовать таймер звуковой платы...
Ответ отправлен: 31.10.2002, 10:18
Отправитель: Gibbel
Отвечает Dron
Доброе время суток, X-RayMan!
irq0 - прерывание таймера, но оно может располагаться на любом int... это зависит от того, как настроен контроллер прерываний.
но первые прерывания процессор использует для исключений, не зависимо ни от чего (перенастроить это нельзя). В реальном режиме используются 8 исключений (int 0 - int 7)
контроллер прерываний настраивается начиная с int 8 (прерывание таймера) до int 0fh, вторичный контроллер (старшие 8 irq) настраиваются с адреса 0x70.
так обстоит дело под DOS.
Ответ отправлен: 31.10.2002, 11:23
Отправитель: Dron
Отвечает Dark_Lord
Приветствую Вас, X-RayMan!
Прерывание 0 - это деление на ноль
Ответ отправлен: 31.10.2002, 21:01
Отправитель: Dark_Lord
Вопрос № 1659 |
>>В общем ассеблер фактичиски не знаю (несколько первых >>здешних уроков) - но есть очень срочная проблема, а >>знакомых, которые могли бы помочь нет... Есть некая не >>очень большая програмка, в которой по нажатию >>клавиши 'таб' происходит одно действие - вопрос такой - >>возможно ли отключить это действие - чтобы на >>нажатие 'таба' программа не реагировала?
-----------------------------------------------------------
>>Отвечает St
>>
>>Здравствуйте, Ivan!
>>Под DOS, Windows? Под DOS проще тк он однозадачный и - до >>запуска проги надо перехвать клавиатурное прерывание и не >>пропускать дальше нажатие Tab.
>>Под Windows нужно фильтровать сообщения от клавиатуры и >>по хендлу окна - иначе можно испортить работу других >>программ.
>>Вам нужны подробности?
>>St
За ответ спасибо. Програмка под Windows. Да - подробности нужны...
Вопрос отправлен: 30.10.2002, 20:18
Отправитель: Ivan
[Следующий вопрос >>] [Список вопросов]
Отвечает St
Привет, Ivan!
1) Найти handle окна сообщение которого надо перехватить (FindWindow - например по тексту заголовка)
2) Установить hook - SetWindowsHookEx с типом WH_GETMESSAGE
3) Написать процедуру GetMsgProc адрес которой передается в SetWindowsHookEx и проверять в структуре MSG, handle окна и сообщение WM_KEYDOWN или WM_KEYUP и если они совпадут то отслеживать какую клавишу (ее код) нажали - если Tab то - тут уж не знаю что делать - или удалять сообщение (GetMessage) или менять на другое - как нужно.
В общем примерно так. Подробности в хелпе - раздел Hooks.
St
Ответ отправлен: 30.10.2002, 23:27
Отправитель: St
Вопрос № 1660 |
Некоторое время назад мне написал человек по имени Eraser с просьбой выслать ему исходник звонилки RAS на асме. Я попытался отослать ему письмо с файлом, но такого адреса не оказалось... Поэтому Eraser, напиши мне ещеP.S. Кто-нибудь ответьте, plz.
Вопрос отправлен: 31.10.2002, 00:15
Отправитель: Bob Johnson (BobJohn@NewMail.Ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Biv
Доброе время суток, Bob Johnson!
Ответ отправлен: 31.10.2002, 01:38
Отправитель: Biv
Отвечает Maverick
Приветствую Вас, Bob Johnson!
Ответ отправлен: 31.10.2002, 04:40
Отправитель: Maverick
Вопрос № 1661 |
Подскажите пожалуйста назначение и параметры функции GetDlgItem().
Вопрос отправлен: 31.10.2002, 02:14
Отправитель: Speedy Gonsalez (kiselevo@mtu-net.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Dark_Lord
Приветствую Вас, Speedy Gonsalez!
Вообщем задаются её два параметра, диалог и идентификатор нужного для работы объекта. Функция возвращает handle на этот объект. Используется, например, при работе с объектом Edit, для посылки сообщений GetWindowText и SetWindowText нужен handle этого объекта!
Ответ отправлен: 01.11.2002, 11:20
Отправитель: Dark_Lord
Отвечает LIFO
Добрый день, Speedy Gonsalez!
Функция GetDlgItem
Описание:
function GetDlgItem(Dlg: HWnd; IDDlgItem: Integer): HWnd;
Считывает описатель оpгана упpавления, содеpжащийся в указанном блоке диалога.
Паpаметpы:
Dlg: Блок диалога, содеpжащий оpган упpавления.
IDDlgItem: Идентификатоp оpгана упpавления.
Возвpащаемое значение:
Идентификатоp оpгана упpавления; 0 - если указанный оpган упpавления не существует.
Ответ отправлен: 31.10.2002, 18:39
Отправитель: LIFO
Отвечает St
Привет, Speedy Gonsalez!
Контролы (кнопки, эдиты, списки и тд) в диалоговом окне загруженном из ресурсов имеют идентификаторы уникальные только в данном диалоговом окне. Однако в системе они (тк они являются окнами) имеют уже уникальные в масштабах всей состемы хэндлы. В большинстве случаев при работе с ними можно указывать их неуникальные идентификаторы и хэндл их родительского диалогового окна. Windows при этом сама изнает реальный хэндл контрола. Пример: GetDlgItemText - это аналог GetWindowText, но для работы с элементами диалоговых окон. Но некоторые функции работают только с хэндлами (например MoveWindow - для перемещения и изменения размеров окон) и в этом случае перед вызовом таких функций нужно самому узнать хэндл контрола и передать его в нужную функцию. Для этого и используется GetDlgItem. Параметры (см Приложение): hDlg - хендл диалогового окна, nIDDlgItem - идентификатор контрола в этом окне. Всё!
St
Приложение:
Ответ отправлен: 31.10.2002, 17:02
Отправитель: St
Отвечает Portnov
Добрый день, Speedy Gonsalez!
Сишное описание:
HWND GetDlgItem(HWND hDlg,// handle of dialog box
int nIDDlgItem // identifier of control
);
Возвращает хэндл нужного контрола по хэндлу диалога и идентификатору контрола. За подробностями см. Win32.Hlp.
С уважением, Portnov.
Ответ отправлен: 31.10.2002, 14:41
Отправитель: Portnov
Отвечает Bob Johnson
Здравствуйте, Speedy Gonsalez!
Функция GetDlgItem. Основное назначение: получение хэндла окна контрола диалога (hwnd). Реализована в user32.dll. Функция позволяет получить хэндл на любой контрол, находящийся в указанном диалоге по его идентификатору. Воспринимает два параметра: первый - хэндл окна диалога (HWND), второй - идентификатор контрола (int). Рекомендована к применению.
Ответ отправлен: 01.11.2002, 13:56
Отправитель: Bob Johnson
Отвечает Gibbel
Доброе время суток, Speedy Gonsalez!
Функция GetDlgItem возвращает хэндл окна элемента управления в заданном диалоговом окне.
HWND GetDlgItem(
HWND hDlg, // хэндл окна диалога
int nIDDlgItem // ID элемента управления
);
Если функция завершена успешно, возвращаемое значение является хэндлом окна элемента управления. Если при выполнении возникла ошибка, то функция возврашает NULL, что показывает на отсутствие элемента управления или на неверный хэндл окна диалога. Для получения информации об ошибке используй GetLastError.
Функцию GetDlgItem можно использовать с любой парой родительского-дочернего окон. При этом hDlg содержит хэндл родительского окна, а дочернее окно должно иметь уникальный идентификатор, передаваемый в nIDDlgItem (параметр hMenu при создании окна функцией CreateWindow или CreateWindowEx).
Работает во всех 32-битных версиях Windows.
Приложение:
Ответ отправлен: 31.10.2002, 10:32
Отправитель: Gibbel
Отвечает etz
Добрый день, Speedy Gonsalez!
Выдержка из win32.hlp
The GetDlgItem function retrieves the handle of a control in the specified dialog box.
HWND GetDlgItem(
HWND hDlg, // handle of dialog box
int nIDDlgItem // identifier of control
);
Parameters
hDlg
Identifies the dialog box that contains the control.
nIDDlgItem
Specifies the identifier of the control to be retrieved.
Return Values
If the function succeeds, the return value is the window handle of the given control.
If the function fails, the return value is NULL, indicating an invalid dialog box handle or a nonexistent control.
Ответ отправлен: 31.10.2002, 10:39
Отправитель: etz
Вопрос № 1663 |
Здравствуйте навсегда, эксперты.... несмотря на некоторое противоречие в ответах крупицы ценной информации находяться всегда. Я все еще ассемблю под винду (пока не разберусь как она работает вряд ли потеряю интерес, потом помотрим, может линух поставлю) и вопросы возникают один за другим... только вот не всегда успеваю задавать, чаще сам натыкаюсь на ответ. только иногда... вот например:
в каких единицах указываются размеры окон, контролов в ресурсах?
пикселов-то в итоге получается значительно больше нежели эти численные значения
может из-за плотности 96 dpi вместо стандартных прежде 72?
но не до такой же степени 96/72 =1,(3)... а тут расхождение по ширине в 1,5
раза, по высоте в 1,62 или 1,63 раза
как это учесть в программе чтоб не вызывать лишний раз GetClientRect
вручную я уже пробовал подобрать фактические границы контрола в клиентской
области окна - получилось... см.прил.
Но вручную подбирать (в примере подобрано значение 106) - подход в корне неверный... (ну разве так можно программить чтоб еще вручную цифирки подбирать?!)
А вот как учитывая ресурс вычислить и подставить необходимое число?
Или я перемудрил и есть более простой способ resize control, когда parent получает WM_SIZE
Приложение:
Вопрос отправлен: 31.10.2002, 04:53
Отправитель: Samodelkin (transacter@mailru.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает masquer
Здравствуйте, Samodelkin!
окон - в device units, диалогов - в dialog units. Как оно такм пересчитывается в сантиметры в МСДН смотреть нужно. Честно говоря, я не вижу здесь проблемы.
Ответ отправлен: 31.10.2002, 13:56
Отправитель: masquer
Отвечает Bob Johnson
Здравствуйте, Samodelkin!
Размеры контролов в диалоге задаются в Dialog Units. Это полный вперед. Эти юниты определяются исходя из размеров шрифта диалога и считаются девайсонезависимыми. По вертикали один ДЮ = 1/8 высоты шрифта, по горизонтали - 1/4 ширины среднего символа. Что тут можно придумать? Обрабатывать WM_SIZE - полный абсурд (ты же не станишь субклассить каждый батон или другой контрол, чтобы отнять у него WM_SIZE). Тут просто следует заметить, чему равен это ДЮ в твоем шрифте и самому посчитать на арифмометре.
Ответ отправлен: 01.11.2002, 13:57
Отправитель: Bob Johnson
Отвечает Gibbel
Добрый день, Samodelkin!
Хочу тебя огорчить, но подход, где ты задаешь примерно подсчитанное число пикселей, в корне не верный.
Дело в том, что размеры твоего диалогового окна пересчитываются на каждой(!) машине по-своемому. Все зависит от настроек экрана (Display в Control Panel).
Ответ отправлен: 31.10.2002, 10:39
Отправитель: Gibbel
Вопрос № 1664 |
Экспертам всем здрасте! тут еще вдогонку
как макросу передать две строки? чтоб не заморачиваться скобками <>, а просто
вызывать макрос таким образом: macro_name "primary string","secondary string"
Эксперту GGibbel'у: "А WS_DISABLED - это вообще не сообщение, а стиль окна." - я вообще-то имел ввиду послать BM_SetStyle с указанием стиля WS_DISABLED... но похоже реакция возможна только на стили с префиксом ВS
Вопрос отправлен: 31.10.2002, 04:59
Отправитель: Samodelkin (transacter@mailru.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Здравствуйте, Samodelkin!
А в чем у тебя собственно проблемы - у меня вот так работает (см. приложение).
Приложение:
Ответ отправлен: 01.11.2002, 13:57
Отправитель: Bob Johnson
Вопрос № 1666 |
Иz иzвестного: В "системном таймере 53(54)" нулевой канал считает с частотой 1193180Hz, частота полного просчёта (0..FFFF) 1193180/65536=18.2Hz. OS с этой частотой инкрементирует 5-ти байтовую переменную 0:46Ch. Вывожу в лог содержимое ЭТОЙ переменной и zначение счётчиков нулевого канала таймера: на одно иzменение (+1) ПЕРЕМЕННОЙ приходится ДВА перехода череz ноль таймера. Такое ощущение, что он работает на удвоенной частоте, а ПЕРЕМЕННУЮ OS инкрементит "череz раz". Проверено на двух машинах: Celeron+Win98 и 486SX+DOS-6.22. Идея иzмерить промежуток времени с точностью более чем 55мс пошла прахом?
Вопрос отправлен: 31.10.2002, 05:33
Отправитель: Морковка
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Доброе время суток, Морковка!
Такого не должно быть. Причиной этого может быть конопля или другие марихуановые растения. Таймер на 486 полностью совместим с 8253 (наш аналог - КР580ВИ53А). Эта микросхема не умеет делить больше, чем на 65536. В ДОСЕ же реально прерывания приходят 18,2 раза - т.к. сам когда-то проверял. Попробуй вышли прогу, которая это считает, тогда и посмотрим.
p.s. "Утро вечера..." - ну ты знаешь...
p.p.s. Твой вопрос получил номер 1666... Весьма символично...
Ответ отправлен: 01.11.2002, 13:57
Отправитель: Bob Johnson
Отвечает ASMодей
Здравствуйте, Морковка!
Насколько я знаю, эта переменная 4-байтная, может из-за этого
твоя прога неправильно показывает ее значение. А вообще,
привел бы исходник, а то писать и проверять самому лень.
PS. Есть такая шутка: если факты не подтверждают теорию, то
от них нужно избавляться :)
Ответ отправлен: 31.10.2002, 07:14
Отправитель: ASMодей
Вопрос № 1667 |
Здравствуйте, господа Эксперты!
У меня такой вопрос возник:
Как, имея идентификатор процесса, получить его хэндл?
И еще вопрос: на сколько я понимаю, хэндл - это указтель на некий объект, в связи с этим - на что он указывает?
С УВАЖЕНИЕМ Bocha.
Вопрос отправлен: 31.10.2002, 07:43
Отправитель: Bocha (olpt@mail.primorye.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Dark_Lord
Добрый день, Bocha!
В смысле, идентификатор?! Это ж и есть handle, если есть имя процесса, то GetModuleHandle, а так не понимаю вопроса.
Handle - говорит Windows, какой именно этот процесс, это как в досе (да и в Windows) файлы открывать, нам Handle ничего не говорит, а Windows под каждый такой по папочке информации имеет!
Ответ отправлен: 01.11.2002, 11:27
Отправитель: Dark_Lord
Отвечает masquer
Здравствуйте, Bocha!
Смотри OpenProcess
Ответ отправлен: 31.10.2002, 13:04
Отправитель: masquer
Отвечает Bob Johnson
Приветствую Вас, Bocha!
Он может указывать на все что угодно. А почему ты решил, что это указатель - может это просто индекс таблицы какой-нибудь.
Получить хэндл очень просто - функция OpenProcess.
Ответ отправлен: 01.11.2002, 13:57
Отправитель: Bob Johnson
Отвечает Atmion
Приветствую Вас, Bocha!
Хендл процесса можно получить, даже не зная идентификатора процесса. Просто вызови функцию GetCurrentProcess, и она вернет хэндл процесса. Однако! Это будет не НАСТОЯЩИЙ хэндл, а псевдо-хэндл. И все же этот псевдо-хэндл будет работать правильно, когда ты будешь передавать его любой функции, которая требует хэндл процесса. Почему так? А потому что псевдо-хэндл - это заранее определенное значение 7FFFFFFFh, и любая функция будет ИНТЕРПРЕТИРОВАТЬ это значение как ХЭНДЛ ТЕКУЩЕГО процесса! А что же такое настоящий хэндл процесса? Это просто базовый адрес отображения PE-файла в память, т.е. значение 400000h. То есть настоящий хэндл (причем это хэндл ЛЮБОГО процесса, т.е. все процессы Win32 обычно начинаются с одного и того же линейного адреса 400000h) уже известен заранее, и не надо вызывать какую-то функцию, чтобы его получить. В отличие от хэндла, идентификатор процесса - это указатель на базу данных процесса (служебную структуру данных кольца защиты 3, которую KERNEL32 использует для управления процессом). И кстати, функция GetCurrentProcessId ТОЖЕ ( как и функция GetCurrentProcess) возвращает не настоящий идентификатор, а псевдо-идентификатор, т.е. не указатель на базу данных процесса, а какое-то другое число (фактически, это число - зашифрованный указатель на базу данных процесса). Однако, если псевдо-хэндл всегда один и тот же, то псевдо-идентификатор всегда РАЗНЫЙ! Ну и вот еще что: процессы и потоки единственные среди объектов Win32, которые имеют и хэндл, и идентификатор. Все другие объекты имеют только хэндл, ПРИЧЕМ хэндл окна или таймера имеет такой же смысл, как ИДЕНТИФИКАТОР процесса или потока. Т.е. хэндл окна - указатель на окно-объект Win32, и идентификатор процесса - указатель на объект-процесс Win32. А хэндлы процессов и потоков как бы сами по себе. Другими словами, процессы и потоки - особые объекты Win32, отличающиеся от остальных объектов Win32 (ну скажем они отличаются тем, что процесс, является объектом Win32, но включает в себя ДРУГИЕ объекты Win32, а поток вообще не может ничего включать в себя, потому что он нематериален).
Ответ отправлен: 31.10.2002, 20:07
Отправитель: Atmion
Вопрос № 1668 |
Всех с Днем!
А почему у Вас в The Bat!1.34 button "Подтверждаю"
не пашет?
Хотя я догадываюсь, так как читаю ВАШУ рассылку до дыр в
мониторе:) - но интересно узнать мнение Эксперта:) или
как там господина:)
Share your planet - annimal planet..
Приложение:
Вопрос отправлен: 31.10.2002, 08:46
Отправитель: Rastenie (zoofish@rambler.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Добрый день, Rastenie!
Не работает? Значит сломалась.
P.S. Какая минимальная конфигурация компьютера приемлема для игры в Unreal Tournament 2003?
Ответ отправлен: 01.11.2002, 13:58
Отправитель: Bob Johnson
Отвечает Maverick
Добрый день, Rastenie!
Потому что все написано для IE.
Там даже сказано, что в бате может не работать.
Ответ отправлен: 01.11.2002, 05:25
Отправитель: Maverick
Вопрос № 1669 |
ЭТО ДЛЯ -САШИ-
ОН ТУТ ВОПРОС ЗАДАВАЛ НАЩЁТ ФИБАНАЧИ. А Я КАК РАЗ ТАКУЮ ЖЕ ПРОГУ ДЕЛАЛ И УЖЕ ВСЕХ ДОСТАЛ ТУТ СО СВОИМИ ВОПРОСАМИ ПО ЭТОЙ ТЕМЕ. ОБЗИМИ УСИЛИЯМИ ВСЁ БЫЛО НАПИСАНО. ВОТ ТЕКСТ.
Правда прога нихрена не оптимизирована... но уж как могу. Сами понимаете - я человек испореченный Visual Basic. Некоторы даже говорят, что человек програмившый на VB навсегда теряет способность к программингу =))))
Приложение:
Вопрос отправлен: 31.10.2002, 09:21
Отправитель: Эдвард Самохвалов (zeleniy_kot@yahoo.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает Eugene
Здравствуйте, Эдвард Самохвалов!
То что она не оптимизирована, это ещё мягко сказано.
Ответ отправлен: 31.10.2002, 11:46
Отправитель: Eugene
Вопрос № 1670 |
Прив, уважаемые знатоки!
В ответе на вопрос 1571 было упомянуто, в частности, что можно получить доступ к командной строке в комовском файле по смещению 82h. Я решил использовать сие обстоятельство в личных корыстных целях. Для начала неплохо было бы глянуть, что там такого идет начиная со смещения 82h до 100h. Написал прогу, а она ничего не кажет (впрочем, первое время, помнится, первый символ из командной строки отображала). Запускаю я ее, пишу <имя_проги>.com 123123djs
и т п, а на экран пустая строка выводится. Помогите, pls, люди добрые, а то извелся совсем. Спасибо.
Приложение:
Вопрос отправлен: 31.10.2002, 12:10
Отправитель: equalizer
[Следующий вопрос >>] [Список вопросов]
Отвечает St
Привет, equalizer!
Во-первых для Loop следует использать CX, а не CL
Во вторых ваша строка в памяти заканчивается кодом 0Dh поэтому используйте не 7eh циклов, а проверяйте не равен ли AL этому числу, а если равен то в строковой переменной вместо него запишите $.
St
Ответ отправлен: 31.10.2002, 18:33
Отправитель: St
Отвечает Dark_Lord
Здравствуйте, equalizer!
Ну, во-первых не 82h, а 81h, а в 80h длинна строки, поэтому копирование можно легче сделать (см. пример). Мне кажется что-то ты криво написал!
Приложение:
Ответ отправлен: 01.11.2002, 11:35
Отправитель: Dark_Lord
Отвечает Beeblebrox
Приветствую Вас, equalizer!
Настрой di :)
Ответ отправлен: 31.10.2002, 18:18
Отправитель: Beeblebrox
Отвечает Артём Шегеда
Здравствуйте, equalizer!
А так пробовал (см. приложение)?
Приложение:
Ответ отправлен: 31.10.2002, 16:42
Отправитель: Артём Шегеда
Отвечает etz
Здравствуйте, equalizer!
Разбираться в проге я не стал, просто дам совет - пускани avputil.com <имя_проги>.com 123123djs и авпутилей гляди чего там на 82h :) Кстати.. на 81h начинается строка параметров. Так же в приложении гляди пример разбора параметров. Это просто кусок проги. (писалось для тасма)
Приложение:
Ответ отправлен: 31.10.2002, 13:07
Отправитель: etz
Отвечает Gibbel
Приветствую Вас, equalizer!
Приложение:
Ответ отправлен: 31.10.2002, 12:27
Отправитель: Gibbel
Отвечает Sub0
Доброе время суток, equalizer!
По-моему со смещения 81h, кидаю код кот. должен работать, но в XP у меня со смещения 81h пусто.
Приложение:
Ответ отправлен: 01.11.2002, 14:38
Отправитель: Sub0
Отвечает Bob Johnson
Доброе время суток, equalizer!
А кто за тебя будет ноль в регистр di заносить перед меткой m1???
А зачем ты в цикле делаешь dec cl, ведь loop это и сам может?
Почему ты инициализируешь только cl, когда loop работает с сх?
А вот теперь ты все это изменил и увидел, что програ все равно не работает...
Потому, что в конце командной строки содержится код 13 - возврат каретки. Когда функция 9 встречает этот код, она переходит на самый первый символ текущей строки. Таким образом затирая все, что вывела ранее. Вот как можно получить параметры проги (см приложение).
Приложение:
Ответ отправлен: 01.11.2002, 13:58
Отправитель: Bob Johnson
Отвечает Portnov
Доброе время суток, equalizer!
Видимо, вы мой ответ имели ввиду.
Вобщем, с вашей программой примерно все ясно... Хотя при запуске она первый раз выдала почему-то что-то про деление на ноль, а во второй завесила машину...
Вы пытаетесь выводить весь диапазон с PSP:82h по PSP:100h. Он только в исключительных случаях бывает заполнен командной строкой! В общем, положение дел таково:
byte at PSP:80h - длина командной строки (без последнего символа, см.ниже)
byte at PSP:81h - чаще всего пробел, иногда что-то другое
from PSP:82h - командная строка, завешается байтом 0Dh (ASCII-код клавиши Enter). После нее идут всякие разные внутренние структуры DOS (DTA, FCB, etc). Если все это выводить на консоль, я за результат не ручаюсь (там ведь в основном управляющие коды)! Для вывода командной строки рекомендую следующее (см. приложение). Хотя для оптимизации на скорость следует еще заменить строковые команды обычными.
C уважением, Portnov.
Приложение:
Ответ отправлен: 31.10.2002, 15:58
Отправитель: Portnov
Отвечает Atmion
Доброе время суток, equalizer!
Ну ты и намудрил :) Ладно, начнем по порядку. Когда тебе нужно загрузить COM-файл, загрузчик DOS определяет сегментный адрес свободного блока памяти. Потом - грузит COM-файл ПО СМЕЩЕНИЮ 0 от этого сегментного адреса. Но еще для управления файлом DOS должна создать PSP (префикс программного сегмента), и в случае с COM-файлом DOS создает PSP прямо В ПЕРВЫХ 100h байт COM-файла, вот почему и должна обязательно быть директива org 100h в начале исходника COM-файла (эта директива говорит ассемблеру, что транслировать мнемоники в машинный код надо не с самого начала COM-файла, а начиная со смещения 100h байт от начала файла). PSP делится на 2 равных части - первая часть занимает 80h и начинается со смещения 0 (отсчитанного от сегментного адреса загрузки COM-файла) - эта часть PSP содержит разные служебные поля. Вторая часть PSP тоже занимает 80h байт, и начинается СРАЗУ после первой части, т.е. по смещению 80h. Вот в эту вторую часть PSP DOS и помещает командную строку твоего COM-файла. То есть, если взять PSP целиком, то командная строка будет помещена по смещению 80h! Еще точнее: по смещению 80h будет находиться один байт, содержащий ДЛИНУ командной строки, а дальше, по следующему смещению 81h будут начинаться сами символы командной строки. И в конце командной строки будет символ 0Dh (код клавиши Enter). Поэтому, чтобы прочитать из буфера командную строку, тебе надо только поставить директиву org 100h в начале COM-файла, и все! Ты зарезервируешь начало файла для PSP, а DOS заполнит служебные поля и командную строку в PSP. Потом, тебе просто надо будет прочитать длину командной строки по смещению 80h, а потом прочитать саму командную строку по смещению 81h. Нет необходимости читать ВСЕ 80h байт второй части PSP, если можно сначал узнать длину командной строки. Но, поскольку ЗАРАНЕЕ длина командной строки неизвестна, надо выделить в COM-файле буфер размером 80h. У тебя какая-то ерунда: cmdline db ? , да еще директива org 82h в начале файла. Достаточно ТОЛЬКО только директивы org 100h. Вот смотри, что получается: ассемблер начинает транслировать COM-файл. Видит директиву org 82h и ПРОПУСКАЕТ от начала файла 82h байт! Дальше ассемблер видит директиву cmdline db ? - и резервирует еще один байт. Теперь ассемблер видит директиву org 100h - и пропускает ЕЩЕ 100h байт. Таким образом, собственно КОД COM-файла (первую команду) ассемблер начинает формировать со смещения 183h, а должен формировать со смещения 100h. А почему? Да потому что при загрузке COM-файла в память загрузчик DOS всегда устанавливает значение 100h в регистре IP! Т.е. загрузчик ВСЕГДА рассчитывает, что в COM-файле исполняемый код начинается по смещению 100h, и ни по какому другому смещению, и после загрузки передает управление именно по адресу 100h! (в EXE-файле это по-другому, там в заголовке можно указать точку входа в исполняемый файл, ДЛЯ ЭТОГО СОБСТВЕННО и нужно ставить метку start:
перед той командой, которая выполнится первой. Еще точнее: в конце директивы END можно поставить ЛЮБУЮ метку, не обязательно с названием start, и где бы еще в файле не была ЭТА метка, вот там и будет точка входа. ПОЭТОМУ директива END с меткой имеет значение ТОЛЬКО для EXE-файлов, а для COM-файлов, НЕ ИМЕЮЩИХ заголовка для настройки программы, такая метка В ПРИНЦИПЕ не нужна, потому что после загрузки COM-файла загрузчик всегда передает управление по адресу 100h). Еще одна твоя ошибка: ты поставил директиву определения данных cmdline db ? ПЕРЕД первой командой, а данные в COM-файле нужно определять КАК МИНИМУМ после первой команды (или после второй или после третьей команды, или после ВСЕХ команд, в самом конце COM-файла), поэтому если данные расположены после какой-то команды, НО НЕ В САМОМ конце файла, то команда непосредственно перед данными должна быть БЕЗУСЛОВНЫМ переходом, обходящим данные.
Правильный исходник - в приложении.
Приложение:
Ответ отправлен: 31.10.2002, 19:24
Отправитель: Atmion
Отвечает Ayl
Приветствую Вас, equalizer!
Ну так все понятно... А что ты хотел? Ты копируешь 37h символов (в лучшем случае), а кто тебе сказал, что все их можно на экран выводить?
Мне понравилась конструкция:
dec cl
...
loop m1
loop'у мы, значит, не доверяем уменьшать регистр cx! Сами его уменьшим! :-)
В общем, прога должна выглядить как-то так (см. Приложение)
Кстати, я не понял, зачем надо командную строчку куда-то копировать, ну да ладно...
Приложение:
Ответ отправлен: 31.10.2002, 13:21
Отправитель: Ayl
Отвечает Broken Sword
Добрый день, equalizer!
А чего тут изводиться?
Во-первых, не 82h, а 81h (а вообще по 80h лежит еще и длина командной строки). Это во первых.
Во-вторых, mov s_cmd[di],al - ты случайно не забыл di обнулить? Ато у тебя строка переносится и порит сам код.
А потом, зачем еще dec cl? loop по твоему чем занимается? И зачем ты ее переносишь куда-то вообще?
Вообщем, не то это все. См. в приложении как надо (это красивый, 14 байтный вариант), есть еще меньше - 12 байт, но некрасивый)
Приложение:
Ответ отправлен: 31.10.2002, 13:30
Отправитель: Broken Sword
Отвечает ASMодей
Здравствуйте, equalizer!
Вот так работает (см приложение).
Приложение:
Ответ отправлен: 01.11.2002, 07:46
Отправитель: ASMодей
Вопрос № 1671 |
Дастаточное ли условие для включения страничной адресации в защищенном режиме - установка 31-бита в cr0 (не считая подготовки таблиц страниц, какталога страниц, загрузки адреса каталога страниц в cr3) ?
Вопрос отправлен: 31.10.2002, 14:37
Отправитель: shusha
[Следующий вопрос >>] [Список вопросов]
Отвечает Dron
Здравствуйте, shusha!
помоему достаточно...
я вот только не уверен сработает ли это в реальном режиме. :)
Ответ отправлен: 31.10.2002, 15:16
Отправитель: Dron
Отвечает Bob Johnson
Здравствуйте, shusha!
Да. После этого следует выполнить jmp на какой-нибудь адрес (можно даже на следующую команду) - для очистки кэша (по крайней мере так надо в 486).
Ответ отправлен: 01.11.2002, 13:58
Отправитель: Bob Johnson
Отвечает Broken Sword
Приветствую Вас, shusha!
я бы только уточнил, что установка бита 31 в CR0 является НЕОБХОДИМЫМ и ДОСТАТОЧНЫМ условием для включения режима страничной адресации
Ответ отправлен: 31.10.2002, 15:25
Отправитель: Broken Sword
Отвечает Atmion
Приветствую Вас, shusha!
Дастаточное :) Это если ты хочешь работать со страницами размером в 4 Кб (ну и конечно бит PE тоже должен быть включен). А если хочешь поюзать странички 2 Мб или 4 Мб - придется вспомнить о битах PSE и PAE в регистре CR4.
Ответ отправлен: 31.10.2002, 21:17
Отправитель: Atmion
Форма отправки вопроса |
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
© 2002 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (42) C / C++ (26) Perl (4) Delphi (15) Pascal (22) Basic / VBA (8) Java / JavaScript (10) PHP (8) MySQL / MSSQL (9) |
Пользователю Windows 95/98/Me (30) Windows NT/2000/XP (18) "Железо" (27) Поиск информации (11) |
Администратору Windows NT/2000/XP (10) Linux / Unix (12) |
Юристу Гражданское право (10) Семейное право (6) Трудовое право (5) КоАП (6) |
Отправить вопрос всем экспертам выбранной рассылки.
© 2002 Россия, Москва. Авторское право: RusFAQ.ru |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||