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

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


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

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

Выпуск № 348
от 21.08.2002, 11:50

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


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

Топор
Статус: Профессиональный
Общий рейтинг: 117.34
URL: Хорошая Русская Металлическая команда
Телефон: (8462)500298
[Подробней >>]
GL
Статус: Опытный
Общий рейтинг: 106.07
[Подробней >>]
Dark_Lord
Статус: Опытный
Общий рейтинг: 143.24
[Подробней >>]
 
ASMодей
Статус: Опытный
Общий рейтинг: 126.99
[Подробней >>]
LIFO
Статус: Опытный
Общий рейтинг: 138.88
Телефон: 8 01710 24758
[Подробней >>]
copycon
Статус: Доверительный
Общий рейтинг: 113.37
[Подробней >>]
 
Portnov
Статус: Опытный
Общий рейтинг: 120.57
URL: Один магнитогорский сайт - для тех, кто первый раз слышит про такой город..
[Подробней >>]
Broken Sword
Статус: Профессиональный
Общий рейтинг: 136.59
URL: моя шедевра
[Подробней >>]
Pablo
Статус: Опытный
Общий рейтинг: 129
URL: Моя страничка
[Подробней >>]
 
masquer
Статус: Профессиональный
Общий рейтинг: 159.09
[Подробней >>]
Александр
Статус: Профессиональный
Общий рейтинг: 117.61
[Подробней >>]
Артём Шегеда
Статус: Профессиональный
Общий рейтинг: 119.71
URL: Пристанище неодинокого программиста
[Подробней >>]
 
Igoryk
Статус: Опытный
Общий рейтинг: 113.43
URL: В помощь программисту
[Подробней >>]
nix
Статус: Доверительный
Общий рейтинг: 116.91
[Подробней >>]
Sinner
Статус: Доверительный
Общий рейтинг: 106.3
[Подробней >>]
 
Ayl
Статус: Профессиональный
Общий рейтинг: 121.81
[Подробней >>]
Painbringer
Статус: Профессиональный
Общий рейтинг: 191.59
URL: Музычка, стишки и прочая дрянь
[Подробней >>]
baldr
Статус: Профессиональный
Общий рейтинг: 116.49
URL: Сайт об ОС DOS. Всем, кто любит эту ОС!
[Подробней >>]


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

Вопрос № 1001. Уважаемые эксперты, спасибо вам за ответы, но вы меня наверное опять не поняли. Дело в том что я не ... (ответов: 6)
Вопрос № 1002. Привет эксперты! помогите решить вопрос: чему равен 0 в 0 степени ??? виндовский калькулятор пишет 1... (ответов: 12)
Вопрос № 1003. Здравствуйте Уважаемые Эксперты! Я нуждаюсь в рабочем, простом примере функции int 33h, AX=0Ch. То е... (ответов: 3)
Вопрос № 1004. Здравствуйте, уважаемые эксперты! У мня такая проблема: 1) Пытаюсь понять как работает система сообщ... (ответов: 2)
Вопрос № 1005. Здравствуйте уважаемые эксперты. Сейчас изучаю ассемблер по книге Олега. Нижеследующая программулина... (ответов: 2)
Вопрос № 1006. Помогите пожалуйста! Это резидент ,в DOS, должен перехватывать нажатие клавиш и записывать Scan-код... (ответов: 5)
Вопрос № 1007. 1) Уважаемые эксперты! Подскажите сылку по сообщениям Винды, котрые приходят от различных объектов и... (ответов: 2)
Вопрос № 1008. Уважаемые эксперты, Расскажите мне пожалуйста в чем же она разница между LEA reg,mem и MOV reg,OFF... (ответов: 8)
Вопрос № 1009. Здравствуйте Уважаемые Господа Эксперты! Вопрос такой? Как из винды 2000 получить доступ к жесткому ... (ответов: 2)
Вопрос № 1010. Уважаемые эксперты! Действительно я сильно загнул на счет описания сообщений! Виноват, исправлюсь! :... (ответов: 2)
Вопрос № 1011. Уважаемые эксперты, скажите, можно ли использовать яз. assembler для создание Web-страницы и какие и... (ответов: 7)

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


 Вопрос № 1001

Уважаемые эксперты, спасибо вам за ответы, но вы меня наверное опять не поняли.
Дело в том что я не могу изменять не config.sys не autoexec.bat(но читать их могу) и debuggeroв на тачке нет и даже записать на диск я ничего не могу. Из всех программ можно писать проги только в паскале. Вот я и решил написать прогу которая методом трассировки проходит через все (драйвера) обработчики прерываний и сохраняет их адреса (если сегмент меняется). Я думаю что админ поставил в autoexec.bat резидент на int 21h с защитой от трассировки(Потому что я ему рассказал как моя прога работает)
Меня интересует следующее
1.Dos востанаваливет вектора после того как прога заканчивает работу?
1.В Паскале я описываю процедуру на ASM {$I Roman.obj}
(Из всех программ можно запускать только паскаль)
2.Затем я ее вызываю и нахожу возможные адреса обработчиков Int 21h
3.Кидаю int 21h на ориг. обработчик (наугад)
[4.Переписаваю config.sys (в config.sys прописана эта защита)]
5.end
?? Защита снова работает (надо перезагружаться)
2.Можно ли каким нибудь другим путем узнать где этот самый обработчик нах-тся?



Вопрос отправлен: 16.08.2002, 16:10
Отправитель: Merilyn Manson

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

Отвечает Топор

Доброе время суток, Merilyn Manson!
Эх, ну кто же админам такой интим рассказывает? Ну да ладно.
Восстанавливать старые вектора - обязанность программера, а не DOS. Особенно если это ассемблерная прога, прилинкованная к паскалевой. Учти ещё, что сам TP (BP) перехватывает кучу прерываний и 21h в том числе, так что в режиме прогона можешь нужного результата и не получить. А кто тебе мешает из-под асмового куска посмотреть (и изменить) массив векторов прерываний, прямым чтением/писаниной в память, если 21h блокирована? Или на другой машине (не в этом классе) напиши свою прогу, а на нужной - запусти её с дискеты...


Ответ отправлен: 16.08.2002, 18:48
Отправитель: Топор


Отвечает GL

Доброе время суток, Merilyn Manson!
А F5 при загрузке что, не нажимается???
Пропускаешь загрузку автоекзека и конфига и никаких резидентов не будет. Или F8 и пошаговая загрузка...


Ответ отправлен: 17.08.2002, 13:06
Отправитель: GL


Отвечает Dark_Lord

Добрый день, Merilyn Manson!
Принеси туда всё на дискете;) Читать-то с неё мона!

Ответ отправлен: 16.08.2002, 20:33
Отправитель: Dark_Lord


Отвечает ASMодей

Приветствую Вас, Merilyn Manson!
Я довольно долго наблюдал как ты пытаешься отрубить защиту
и не могу понять, зачем нужно так усложнять? Если при
загрузке DOS во время появления надписи "Starting MS-DOS"
нажать клавишу F8, то можно по шагам пройти и config.sys
и autoexec.bat и не дать загрузиться этому защитному
резиденту (или вы работаете под наблюдением админа,
как в гестапо? ;).
Что касается твоих вопросов, то отвечаю:
1. DOS не может восстановить векторы прерываний, так как
не отслеживает, какие именно векторы программа изменяет.
2. Узнать где находился оригинальный обработчик прерывания
можно, если программа-резидент использовала стандарт
AMIS (INT 2Dh).


Ответ отправлен: 17.08.2002, 19:56
Отправитель: ASMодей


Отвечает LIFO

Здравствуйте, Merilyn Manson!
Во сказал 'debuggeroв на тачке нет' - debug.com!
1.сохраняются оригинальные вектора в какой нибудь области памяти, старые меняются на новые, а потом перезаписываются.
Если у тебя резидент на 21-ом, то посмотри в volcove и в стартапе(реестре)


Ответ отправлен: 17.08.2002, 22:15
Отправитель: LIFO


Отвечает copycon

Добрый день, Merilyn Manson!
Туманные вопросы (по подробнее о проге) и не совсем по теме :)
Но все-равно:
1. DOS - ничего не востанавливает!
А вот его программка - может запросто. Висит например на int 21h, 08h, 09h..... и каждый обработчик проверяет все эти N векторов.
2. В своем обработчике я могу и сто раз сегментный регист менять, ты лучше по MCB найди где реально DOS живет и трассируй до этого сегмента.
3. Как я уже писал, не только 21h. Если защищен весь логический диск то скорее всего int 25h/26h и на всякий случай 13h
4. А ты точно уверен что защита грузиться из config.sys или autoexec.bat? Там еще и boot может быть :) а в confige просто какая-то лабуда или интерфейсная часть (видел и такое)
И вообще, тебе скорее fido.crack подойдет.
Удачи.


Ответ отправлен: 17.08.2002, 00:46
Отправитель: copycon


 Вопрос № 1002

Привет эксперты!
помогите решить вопрос: чему равен 0 в 0 степени ???
виндовский калькулятор пишет 1, простой калькулятор пишет неопределенно, а как на самом деле ???



Вопрос отправлен: 16.08.2002, 19:31
Отправитель: Дмитрий

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

Отвечает Dark_Lord

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

Ответ отправлен: 16.08.2002, 20:39
Отправитель: Dark_Lord


Отвечает ASMодей

Приветствую Вас, Дмитрий!
В школе нас учили, что любое число в нулевой степени
есть единица, так что калькулятор Windows похоже прав!


Ответ отправлен: 17.08.2002, 19:57
Отправитель: ASMодей


Отвечает Portnov

Добрый день, Дмитрий!
Отвечаю как математик. Ноль в степени ноль не определен, т.е. понятие степени на этот случай не распространяется. Что-то конкретное может получиться только если имеем дело с пределом вида lim (x-3)^(3-x) при x->2, тогда получается неопределенность вида "ноль в степени ноль", которую надо раскрывать, и тогда есть шанс получить какое-то конкретное число, может, 1, может, бесконечность, а может, 22.
С уважением, Portnov.


Ответ отправлен: 19.08.2002, 10:02
Отправитель: Portnov


Отвечает Broken Sword

Добрый день, Дмитрий!
очень интересно вообще...
В "Виртуальной школе Кирилла и Мефодия" :) считают, что: "Любое число, кроме нуля, в нулевой степени равно единице. Но, нуль в нулевой степени не имеет смысла!"
но существует также расхожее мнение, что ноль в нулевой - единица.
Я больше склоняюсь к Кириллу и Мефодию.. )
И вообще все это из серии "Ахиллес и Черепаха"...

Ответ отправлен: 16.08.2002, 21:16
Отправитель: Broken Sword


Отвечает Pablo

Добрый день, Дмитрий!
Единице и равно 0 в степени 0, это решение я по слухам какимито математикми принято было!))))

Ответ отправлен: 16.08.2002, 22:36
Отправитель: Pablo


Отвечает LIFO

Добрый день, Дмитрий!
Все в нулевой степени равно 1.

Ответ отправлен: 17.08.2002, 18:59
Отправитель: LIFO


Отвечает masquer

Добрый день, Дмитрий!
Это из школы, кажется - любое число, возведенное в степень 0 равно 1.

Ответ отправлен: 16.08.2002, 19:56
Отправитель: masquer


Отвечает Александр

Доброе время суток, Дмитрий!
Правильно говорит "простой" калькулятор. Математики так и не сошлись во мнении как определить 0^0.


Ответ отправлен: 17.08.2002, 08:50
Отправитель: Александр


Отвечает Артём Шегеда

Здравствуйте, Дмитрий!

Я не понял - здесь что, людей с высшим образованием нет?
Да будет Вам известно, что
a0 = a/a
откуда
00 = lim x/x
при x стремящемся к 0. А предел этот равен 1.
А Вы тут дискуссию развели!

Ответ отправлен: 17.08.2002, 13:48
Отправитель: Артём Шегеда


Отвечает Igoryk

Доброе время суток, Дмитрий!
Открываем справочник по математике и видим:
Если a <> 0, то a ^ 0 = 1, причем 0 ^ 0 не определен.
Теперь от себя. Если стоит степень 0, то по правилам:
a ^ 0 = a : a
Но если a = 0, то 0 ^ 0 = 0 : 0 - а на 0 делить нельзя!!

Ответ отправлен: 17.08.2002, 16:11
Отправитель: Igoryk


Отвечает nix

Здравствуйте, Дмитрий!
Ноль в степени ноль - число бесконечно малое(высшая математика), но никак не 1-> Если а - любое число, кроме 0 (а<>0) то а^0=1 (Школьный курс математики)

Ответ отправлен: 19.08.2002, 06:53
Отправитель: nix


Отвечает Sinner

Приветствую Вас, Дмитрий!
Любое число в нулевой степени равно единице.

Ответ отправлен: 19.08.2002, 08:26
Отправитель: Sinner


 Вопрос № 1003

Здравствуйте Уважаемые Эксперты!
Я нуждаюсь в рабочем, простом примере функции int 33h, AX=0Ch. То есть установить драйвер событий мыши. Желательно exe.
Пожалуйста, напишите такой пример.
Заранее спасибо.



Вопрос отправлен: 16.08.2002, 22:00
Отправитель: Alex (alexneta@aport2000.ru)

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

Отвечает LIFO


Лень писать:)
Определись сам, какая подфункция тебе нужна.
AX = 000Ch
CX = call mask (see #2426)
ES:DX -> FAR routine (see #2427)

Copied from Ralf Brown's Interrupt List
Table 2426
Bitfields for mouse call mask:
Bit(s) Description
0 call if mouse moves
1 call if left button pressed
2 call if left button released
3 call if right button pressed
4 call if right button released
5 call if middle button pressed (Mouse Systems/Logitech/Genius mouse)
6 call if middle button released (Mouse Systems/Logitech/Genius mouse)
7-15 unused
Note: some versions of the Microsoft documentation incorrectly state that CX
bit 0 means call if mouse cursor moves

Table 2427
Values interrupt routine is called with:
AX = condition mask (same bit assignments as call mask)
BX = button state
CX = cursor column
DX = cursor row
SI = horizontal mickey count
DI = vertical mickey count
Notes: some versions of the Microsoft documentation erroneously swap the
meanings of SI and DI
in text modes, the row and column will be reported as a multiple of
the character cell size, typically 8x8 pixels



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


Отвечает Dark_Lord

Здравствуйте, Alex !
Проверьте свой ящик на писмо от Dark_Lorda!

Ответ отправлен: 17.08.2002, 12:16
Отправитель: Dark_Lord


Отвечает copycon

Здравствуйте, Alex !
Вот, писанул.....
Правда не .exe - не люблю я exe, особенно в таких маленьких програмках.
Работает, хотя и со странностями (for ALL - подскажите):
под TD - все OK (даже при простом запуске F9, я там для отладки клавиатуру жду)
а под DOS - реагирует только на нажатие кнобки :(
Удачи.


Приложение:

Ответ отправлен: 17.08.2002, 00:30
Отправитель: copycon


 Вопрос № 1004

Здравствуйте, уважаемые эксперты!
У мня такая проблема:
1) Пытаюсь понять как работает система сообщений виндов: создал окошко, нарисовал кнопку, хочу, чтоб при нажатии её выходила мессаджбокса (для начала обычная окейка, хотя б) и после нажатия ОК чтоб мессаджбокса исчезла. Имею: при нажатии кнопки мессаджбокса появляется, но при нажатии ОК (кстати там появляется ещё и кнопка "Справка" -!?)она не исчезает. Когда закрываю Main window - вылазит ошибка и весит систему (см приложение).
Возможно всё из-за того, что я не понимаю когда необходимо, а где не обязательно ставить TranslateMessage и DispatchMessage, как правильно вылавливать сообщения от окон, и как (не совсем понимаю) происходит формирование сообщений (где "лежит" очередь, кем контролируется и т.д).
У меня куча инфы для ДОС программерства, а вот по виндам - маловато. Есть туториал Iczelion'a, но там для Masm, а я как-то привык к Tasm'у (хотя кнопку нарисовал изучая эти туториалы...). Я пользуюсь книжкой "Assembler" Зубкова, есть ещё Юров - но там про винду совсем уж плохо описано для моего понимания. Помогите кто чем, как грится, может, плз.
2) Интересно, какие инструкции получает процессор, когда происходит программная перезагрузка (ну, например, когда выбираешь "Перезагрузить компьютр!" в виндах)?


Приложение:


Вопрос отправлен: 16.08.2002, 22:08
Отправитель: 86 a5 ad ef

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

Отвечает masquer

Приветствую Вас, 86 a5 ad ef!
Куча ошибок, даже комментировать ничего не буду, сравни просто и увидишь где чего. В данных только изменения отображены.

Приложение:

Ответ отправлен: 16.08.2002, 23:08
Отправитель: masquer


Отвечает Dark_Lord

Добрый день, 86 a5 ad ef!
А зачем создавать так много окон, есть же мессаджбокс! В книге Зубкова "Assembler для Dos,Windows и Unix" это очень хорошо описано!

Ответ отправлен: 17.08.2002, 12:16
Отправитель: Dark_Lord


 Вопрос № 1005

Здравствуйте уважаемые эксперты. Сейчас изучаю ассемблер по книге Олега. Нижеследующая программулина демонстрирует забитие двадцатого прерывания путём запихивания в стэк содержимого регистра AX, в который предварительно поместили два NOP-а. Так вот вопрос - почему она работает в случае когда опускаем строку mov ax,9090h, а также во всех вариантах типа push DX, push DI, push ES также без помещения в них 9090h? И ещё - может есть у кого русская документация по SoftIce? Если есть - киньте на мыло плиз.
Спасибо.


Приложение:


Вопрос отправлен: 16.08.2002, 23:45
Отправитель: MacSeem (maximsign@mail.ru)

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

Отвечает ASMодей

Приветствую Вас, MacSeem!
Ничего она не срабатывает! Может ты забыл ее заново
скомпилировать?


Ответ отправлен: 18.08.2002, 13:37
Отправитель: ASMодей


Отвечает copycon

Здравствуйте, MacSeem!
Если не ошибаюсь, все дело в новомодных процессорах, по общепринятой трактовке есть сегмент(ы) кода и есть
сегмент(ы) данных. Код не принято менять на ходу :)
В процессоре работает cache комманд и твои комманды уже закешированны и обрабатываються из него.
после push ax сделай jmp $+0 - то-есть пустой джамп
(при нем происходит сброс кеша)
p.s. Пробегала даже маленькая програмка определения процессора по размеру кеша, что-то типа:
установка стека, регистров и
mov cx, nnnn
mov ax, 90h
jmp $+0 ; сброс кеша
rep stosb
inc bx ; сюда заносятся 90h
inc bx
........
inc bx
и исходя из того сколько у тебя получаеться в bx и вычисляеться размер кеша.
Удачи.


Ответ отправлен: 17.08.2002, 01:09
Отправитель: copycon


 Вопрос № 1006

Помогите пожалуйста!
Это резидент ,в DOS, должен перехватывать нажатие клавиш и записывать Scan-код нажатой клавиши в файл.
Но почемуто программа не открывает файл. Я так же пробовал, записывать данные с помощъю INT 13h в сектор
диска но безрезультатно.
Процессор "Celeron 667", ОС"Windows 2000 professional", Асемблер "MASM 5.10"
Укажите пожалуйста ошибку,
************************************************************************************************************************
ASSUME CS:CodeSegment
;-----------------------------------------------------------
CodeSegment SEGMENT PARA
ORG(100h)
Start:
Main PROC NEAR
;
;
JMP initial
;
saved_int9:
DD 00 ;адреса прерывания 9Н
K_prer:
DW 10Ah ;начальный адрес буфра ScanCode
num_zap:
DB 00 ;учитывает количество прерываний 9H
;первое нажатие на клавишу
;второе- клавиша отпускается
;т.о. добиваемся занесения 1 го Skan кода
ScanCode:
DB 40h dup (0) ;буфер хранения SkanCode нажатой клавиши
Adres:
DB 'c:w.txt',0
;-----------------------------------------------------------
int9_treater:
push ax ;сохранение регистров
push bx
push cx
push dx
pushf
;-----------------------------------------------------------
mov cl,byte ptr cs:[109h] ;109h-смещение на num_zap
cmp cl,00
jne end_proc ;пропустить это прерывание
;для вызова программы через раз
mov bx,word ptr cs:[107h] ;107Н-смещение на K_prer
in al,60h
and al,01111111B ;проверка, для помещения в буфер
;Skan код клавиши т.к. при отпускании 7 ой бит
;устанавливается в 1
mov byte ptr cs:[bx],al ;сохранение в буфере SkanCode нажатой клавиши
inc bx ;увеличиваем адрес
cmp bx,14Ah ;проверка конца буфера
jne a10 ;буфер не полон
mov bx,10Ah ;установить буфер на начальный адрес
mov word ptr cs:[107h],bx
;-----------------------------------------------------------
; Начало проблем!!!!!!!!!
;-----------------------------------------------------------
mov ax,3D02h ;открытие файла для чтения/записи
mov dx,offset Adres ;ASCIIZ-строка
int 21h
;--------------------------------
mov bx,ax ;файловый номер
mov ah,40h ;запрос записи
mov cx,40h ;длина записи
mov dx,10Ah ;адрес хранения Scan-кода нажатых клавиш
int 21h
;--------------------------------
mov ah,3Eh ;закрытие файла
int 21h
jmp a30
;-----------------------------------------------------------
a10:
mov word ptr cs:[107h],bx ;т.е. следующий адрес буфера
a30:
mov byte ptr cs:[109h],01
jmp a20
;-----------------------------------------------------------
end_proc:
mov byte ptr cs:[109h],00
a20:
popf ;востановление регистров
pop dx
pop cx
pop bx
pop ax
;-----------------------------------------------------------
JMP dword ptr CS:[saved_int9]
rezident_end:
;-----------------------------------------------------------
initial: XOR DX,DX
MOV DS,DX
MOV AX,DS:[24h] ;сохртяем в saved_int9
MOV word ptr CS:[saved_int9],AX ;адреса обработчика
MOV AX,DS:[26h] ;прерывания клавиатуры
MOV word ptr CS:[saved_int9+2],AX

CLI
MOV AX,OFFSET int9_treater ;помещаем новые
MOV word ptr DS:[24h],AX ;адреса в таблицу прерываний
PUSH CS
POP AX
MOV word ptr DS:[26h],AX
STI
MOV DX,OFFSET rezident_end
INT 27h
;----------------------------------------------------------
Main ENDP

CodeSegment ENDS
END Start
************************************************************************************************************************
Спасибо.



Вопрос отправлен: 17.08.2002, 03:21
Отправитель: pasha

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

Отвечает Broken Sword

Добрый день, pasha!
плз в след. раз в приложение пихай код, если он такой немаленький..
ошибка стандартная - mov dx,offset ASCIIZ с именем файла по умолч. в качестве префикса берет DS, а тебе нужно CS (почему - читай предыдущие выпуски).
Другие ошибки не смотрел, просто уже заранее знал где у тебя ошибка
если у тебя есть там дето в обработчике push cs pop ds то тогда never mind :)

Ответ отправлен: 17.08.2002, 13:27
Отправитель: Broken Sword


Отвечает LIFO

Приветствую Вас, pasha!
Вот рабочая процедура открытия файла.
.data
handle dw 0
filename db 'my.txt',0
point_n dd filename
.code
xor cx,cx
lds ,point_n
mov ah,3ch
int 21h
jc exit; это должно быть, т.к. у тебя если файл не откроется , то все равно пойдет прога дальше(ну сам подумай для чего тогда cf устанавливается в 1 - чтоб фиксировать ошибку)!!!
mov ah,handle
;....
exit:
;...


Ответ отправлен: 17.08.2002, 22:16
Отправитель: LIFO


Отвечает masquer

Добрый день, pasha!
Ну не даст тебе 2к резидентом остаться - ты под отладчиком хоть побегал, прежде чем писать. В чистом досе пробуй.

Ответ отправлен: 17.08.2002, 07:09
Отправитель: masquer


Отвечает copycon

Добрый день, pasha!
Существует такая неприятная вещь, как "неинтерабельность доса" - то-есть при выполнении некоторых прерываний и функций доса и биоса НЕЛЬЗЯ выполнять ЭТИ и некоторые другие прерывания.
Пример: Текущая программа выполняет функцию int 21h и в этот момент твой резидент так-же лезет в int 21h, результат: дос в глубокой %%%%, а в месте с ним и ты.
Есть куча способов это обойти:
0. Ты должен организовать в своей программе буфер где хранить информацию до удобного момента записи.
1. Садиться на int 28h: работает как int 1Ch (Timer) но только когда DOS свободен.
Минусы: а)иногда дос не совсем свободен
б)28h не вызываеться при работе Командной строки
(совсем чистый дос)
2. Садиться на int 21h и отслеживать когда оно вызываеться и
а) писать на диск когда нет вызова 21
б) писать прямо внутри каково-нибуть вызова
Минусы: вроде самый нормальный способ но может понадобиться
большой буфер
3. Использовать недокументированную функцию по смене внутреннего стека доса (не помню точно какая - поищи)
тогда писать можно практически в любой момент
Минусы: недокументированное оно и есть недокументированное
и хрен его знает на каком досе будет работать
А вообще вот тебе моя маленькая заготовка, на ней десятки програмок писаны и работают. Плюс там меняеться обычный стек, зачастую не хватает.
p.s. ======== < между комментариями и пиши свой код
Удачи.


Приложение:

Ответ отправлен: 18.08.2002, 00:50
Отправитель: copycon


Отвечает Ayl

Приветствую Вас, pasha!
Ошибок несколько.
Во-первых, не устанавливается регистр DS на сегмент данных резедентной программы в обработчике прерывания. Там должна быть такая последовательность:
push ds
push cs
pop ds
...
и перед вызовом старого обработчика:
pop ds
Во-вторых, даже после этого изменения программа может работать нестабильно. Аппаратное прерывание плохо тем, что может наступить в любой произвольный момент времени. В том числе и тогда, когда прерванныя прога сама производит обращение к функциям 21-го прерывания. А DOS - система нереентерабельная. Вот и все - у DOS'а съезжает крыша. Соответственно, вызывать int 21h нужно только тогда, когда он свободен. Определить это можно следующими способами:
1. С помощью прерывания 28h - генерируется самой DOS в том случае, когда она свободна и можно обращаться к ее функциям.
2. С помощью флага InDos (адрес флага можно получить в момент инсталляции с помощью функции 34h прерывания 21h). Соответственно, для обработки этого флага нужно перехватить еще прерывание 8 (таймер) и в нем проверять флаг и в случае, если он равен 0, вызывать процедуру записи буфера в файл.
3. Перехватить 21-е прерывание и в случае вызова функций старше 0ch устанавливать флаг занятости прерывания. В остальных случаях писать можно.
В-третьих, непонятна обработка количества вызовов 9-го прерывания. И главное, определение за счет этого нажатия или отпускания клавиши... А если я нажал клавишу и не отпустил ее? Клава сначала пошлет код нажатия клавиши. Потом по истечении некоторого времени она повторно пошлет код нажатия клавиши. И т.д. до момента отпускания клавиши, когда наконец-то будет послан код отпускания.
Возможен также вариант нажатия одновременно нескольких клавиш... Тоже не будет обрабатываться...


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


 Вопрос № 1007

1) Уважаемые эксперты! Подскажите сылку по сообщениям Винды, котрые приходят от различных объектов и/или посылаются этим объектам, на русском, а то у меня есть, но очень неполная и это приводит к глупым вопросам, а иногда даже ставитв тупик. Так как я понял, есть очень много объектов,а какими сообщениями они обрабатываются стоит только догадываться...
Для примера, скажем: ListBoxTree32 и остальное в том же духе!
2) Раз здесь нет фишки что-бы посылать благодарности, поэтому пользуясь случаем, хочу поблагодарить всех тех экспертов и остальных за оказанную помощь. Кнопки я научился блокировать. Правда пришлось повозиться, я взял из всех ответов по-немногу и сложил вместе! СПАСИБО ВАМ!!!!!



Вопрос отправлен: 17.08.2002, 08:57
Отправитель: Андрей (assing@glazov.net)

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

Отвечает LIFO

Доброе время суток, Андрей!
delphi.mastak.run (справочник по API)
www.wasm.ru - класс!


Ответ отправлен: 17.08.2002, 22:12
Отправитель: LIFO


Отвечает masquer

Здравствуйте, Андрей!
Проще всего в MSDN посмотреть, а на русском разве что обрывочную информацию можно найти, объем то большой - одних WM_ сообщений около 300, а у контролов своих хватает.

Ответ отправлен: 17.08.2002, 09:14
Отправитель: masquer


 Вопрос № 1008

Уважаемые эксперты,
Расскажите мне пожалуйста в чем же она разница между
LEA reg,mem и
MOV reg,OFFSET mem?
Пожалуйста, объясните, ибо я разницы не вижу.
С благодарностью, Саня



Вопрос отправлен: 17.08.2002, 09:44
Отправитель: Саня

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

Отвечает masquer

Здравствуйте, Саня!
LEA - Load Effective Addreыs, а offset mem и есть этот эффективный адрес. Здесь эти команды равнозначны.

Ответ отправлен: 17.08.2002, 09:59
Отправитель: masquer


Отвечает ASMодей

Здравствуйте, Саня!
Разница по-моему только в занимаемой командой памяти и
времени ее исполнения.


Ответ отправлен: 18.08.2002, 13:38
Отправитель: ASMодей


Отвечает Pablo

Приветствую Вас, Саня!
В данной записи отличий в этих двух коммандах нет, потому что ассемблер интерпретирует эти комманды как обычную загрузку числа в регистр и в данном случае в виде этого числа выступает адрес переменной (ячейки памяти с адресом mem). Но в ассемблере есть ействительные команды lea и они интерпретируются как таковые когда в качестве опренда выступает регистры и/или адрес памяти, а иногда еще и кожффициент.

Ответ отправлен: 17.08.2002, 14:05
Отправитель: Pablo


Отвечает Dark_Lord

Здравствуйте, Саня!
Если reg 16 бит и 16-битный режим адресации, то разницы нет!
Если reg 32 бита, тотже режим, то старшее слово reg будет 0 при команде lea
Если reg 16 бит, 32-битный режим адресации, в reg будет младшее слово адресас командой lea, на команду mov будет выдана ошибка разрядности!


Ответ отправлен: 17.08.2002, 12:16
Отправитель: Dark_Lord


Отвечает Igoryk

Добрый день, Саня!
В данном случае разницы действительно нет, но LEA используется для нахождения эффктивного адреса, а MOV для копирования между регистрами. Например LEA reg, [bx+ax] переместит в reg сумму ax и bx. Но mov этого не может. Так же можно с помщью lea можно суммировать смещения двух переменных.

Ответ отправлен: 17.08.2002, 16:11
Отправитель: Igoryk


Отвечает Painbringer

Доброе время суток, Саня!
lea - команда процессора - выполняется в ходе программы.
offset - директива компилятора, т.е. значение высчитывается при компиляции и подставляется в код в виде непосредственного операнда (посмотри в дебагере то и другое и увидишь).

Ответ отправлен: 19.08.2002, 00:09
Отправитель: Painbringer


Отвечает Portnov

Приветствую Вас, Саня!
В таком простом случае, как вы показали, разницы нет, но второе быстрее, и Tasm ассемблирует первое во второе. LEA - LoadEffectiveAddress. Удобна для случаев с расширенной адресацией (массивы), а также - для простеньких вычислений. Так, Lea ax,[2*bx+di] положит в AX значение выражения 2*bx+di.
С уважением, Portnov.


Ответ отправлен: 19.08.2002, 10:12
Отправитель: Portnov


Отвечает baldr

Здравствуйте, Саня!
LEA загружает АДРЕС переменной, а MOV - просто численное значение... В твоем примере разницы
нет абсолютно никакой. Однако, например, С.В. Зубков указывает, что "команда LEA может также
использоваться для быстрого умножения одного регистра на другой"... Пример не привожу, сам
можешь догадаться. Если нет - расскажу. ;)


Ответ отправлен: 20.08.2002, 00:33
Отправитель: baldr


 Вопрос № 1009

Здравствуйте Уважаемые Господа Эксперты!
Вопрос такой? Как из винды 2000 получить доступ к жесткому диску используя С++ и асм и перенести данные с одного диска на другой побайтно или есче как. Знаю есть Easy Recovery, но хочется свою написать, типа проход по всему диску и перекачка на другой диск. Скачал ДДК, лазил по инету, но толком док никаких не нашел. В ДДК нет таких примеров. (Или я ошибаюсь?) Проблема нужна, потому-что
ДОС не видит диски большего объема. Ткните носом пожалуйста.
Заранее Вам благодарен.
ЗЫ. Если есть исходники, то буду очень благодарен.



Вопрос отправлен: 17.08.2002, 10:14
Отправитель: Юрий (admin@spark.permonline.ru)

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

Отвечает masquer

Добрый день, Юрий!
Смотри функцию CreateFile, под win2k она может получить физический доступ к диску. Или драйвер писать.

Ответ отправлен: 17.08.2002, 11:23
Отправитель: masquer


Отвечает Pablo

Здравствуйте, Юрий!
Вообще то большие диски FAT32 поддерживаются commmand.com от виндов98 так что есть помимать этот файл как досовский, то в этом смысле все нормально. В ДДК помойму есть пример дарйвера ATA в папке SRCSTORAGEDISKATDISK. А к винту в обычной проге кроме как методом DeviceIOControl никак не пробьешься.

Ответ отправлен: 17.08.2002, 14:05
Отправитель: Pablo


 Вопрос № 1010

Уважаемые эксперты! Действительно я сильно загнул на счет описания сообщений! Виноват, исправлюсь! :) Тогда помогите с этим:
класс "SysListView32"
Создаю это окно, вставляю колонки, обзываю эти колонки, а вот заполнить строки не получается!! Так как не могу правильно заполнить струтуру LV_ITEM (если это она). Когда посылаю сообщение LVM_INSERTITEM, то в первую колонку записывается моя строка, а вот заполнить вторую и третью колону этой же строки не получается!! Какими средствами заполнить их, а потом перейти на другую строку и т.д.???


Приложение:


Вопрос отправлен: 17.08.2002, 10:27
Отправитель: Андрей (assing@glazov.net)

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

Отвечает masquer

Доброе время суток, Андрей!
В документации же написано, что LVM_INSERTITEM не вставляет SubItem. Код ниже работает

Приложение:

Ответ отправлен: 17.08.2002, 11:51
Отправитель: masquer


Отвечает Pablo

Здравствуйте, Андрей!
Очень интересную строчку я нашел в хелпе:
You cannot use ListView_InsertItem or LVM_INSERTITEM to insert subitems; the iSubItem member of the LV_ITEM structure must be zero.
Видно в другие столбый низя вставить сточки с помощью этой мессаги. А какой стиль ты использовал для ЛистВиева!?
Больше ничо талкового сказать не могу т.к. вооьбще не пойму откуда ты такой сласс откопал, у меня в хелпе в списке предусмотренных классов такового нету, а только сооьщения посылаемые этом классу, хотя впрочем может я просто не нашел у себя описание этого класса.

Ответ отправлен: 17.08.2002, 14:05
Отправитель: Pablo


 Вопрос № 1011

Уважаемые эксперты, скажите, можно ли использовать яз. assembler для создание Web-страницы и какие именно элементы?
В заранее большое спасибо.



Вопрос отправлен: 17.08.2002, 10:44
Отправитель: Nej

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

Отвечает Broken Sword

Доброе время суток, Nej!
представляешь какую глупость ты спросил? :)

Ответ отправлен: 17.08.2002, 13:27
Отправитель: Broken Sword


Отвечает ASMодей

Здравствуйте, Nej!
Если под Web-страницей ты подразумеваешь HTML-страницу, то
ассемблер вполне можно использовать для ее создания (как
простой текстовый файл).
На ассемблере также можно писать и CGI-программы.


Ответ отправлен: 18.08.2002, 13:39
Отправитель: ASMодей


Отвечает masquer

Доброе время суток, Nej!
Я, наверное, не понял вопроса - а что это и как это будет...
Для этого HTML, вообще-то, придумали.

Ответ отправлен: 17.08.2002, 11:26
Отправитель: masquer


Отвечает Pablo

Приветствую Вас, Nej!
Если ты сделаешь на ассемблере исполняемый CGI-BIN (такие какие пишуть на сях) или ISAPI приложение то можно!))))

Ответ отправлен: 17.08.2002, 14:05
Отправитель: Pablo


Отвечает Painbringer

Приветствую Вас, Nej!
НЕТ!

Ответ отправлен: 19.08.2002, 00:09
Отправитель: Painbringer


Отвечает nix

Приветствую Вас, Nej!
Конечно же можно!!!
Язык ассемблера самый универсальный язык!
А какие элементы ты имеешь ввиду???

Ответ отправлен: 19.08.2002, 06:33
Отправитель: nix


Отвечает baldr

Приветствую Вас, Nej!
Ну если для самой страницы, то запросто: пишешь на асме web-редактор, а в нем создаешь
html-документ... :) Но тебя, я думаю, интересуют скрипты? Гипотетически такое возможно, но
только если ты сам - админ сервака, на котором хочешь разместить свою страничку... Пишешь на
асме интерпретатор CGI-запросов, а потом встраиваешь в свою страничку вызовы... ;))
Никто и не говорил, что будет просто! :)) Это все сравнимо по уровню с написанием своей
операционки плюс крутого софта для нее...


Ответ отправлен: 20.08.2002, 00:34
Отправитель: baldr



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

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

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

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

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

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




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

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


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

В избранное