Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 570
от 17.06.2003, 13:00
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 3495 Отправлено ответов: 10265 Активность: 293.7 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
_vt Статус: Опытный Общий рейтинг: 122.92 [Подробней >>] |
Hangatyr Статус: Опытный Общий рейтинг: 115.2 [Подробней >>] |
Maverick Статус: Профессиональный Общий рейтинг: 131.1 URL: Эхоконференция по вирмейкингу Телефон: 89039415024 (BeeLine GSM) [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 151.86 URL: Программирование [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 118.64 [Подробней >>] |
Дмитрий Статус: Опытный Общий рейтинг: 140.17 Телефон: 8-903-985-66-27 (Билайн-GSM) [Подробней >>] |
masquer Статус: Профессиональный Общий рейтинг: 137.64 [Подробней >>] |
ASMодей Статус: Профессиональный Общий рейтинг: 114.23 [Подробней >>] |
baldr Статус: Профессиональный Общий рейтинг: 112.29 URL: Сайт об ОС DOS. Всем, кто любит эту ОС! [Подробней >>] |
Tigran K. Kalaidjian Статус: Опытный Общий рейтинг: 118.61 URL: Методы оптимизации работы ПК [Подробней >>] |
Ramzes Статус: Профессиональный Общий рейтинг: 125.77 URL: Microsoft homepage [Подробней >>] |
Dark_Lord Статус: Профессиональный Общий рейтинг: 112.53 [Подробней >>] |
Hayk Статус: Доверительный Общий рейтинг: 112.59 [Подробней >>] |
vitya Статус: Профессиональный Общий рейтинг: 108.17 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 3443. Здравствуйте уважаемые эксперты! Может кто-нибудь рассказать мне как скомпилировать файл в MASM32 (п... (ответов: 2)
Вопрос № 3444. Здравствуйте, уважаемые эксперты. Помогите пожалуйста разрешить такую проблему. В программе ... (ответов: 3)
Вопрос № 3445. Здравствуйте Уважаемые Эксперты! Вопрос возможно ламерский,но все же. Что такое runtime бибилиот... (ответов: 4)
Вопрос № 3446. Добрый день. У меня в компе памяти 1Gb. Я пытаюсь ее определить в PM но не получается. mov ax, <в GD... (ответов: 2)
Вопрос № 3447. Здрествуите, увыжаемые експерты! Вот решил попробывать написать небольшую ось для общего развития и ... (ответов: 3)
Вопрос № 3448. Всем здрасте Создал дескриптор модема (вызов CreateFile с COM2), на модеме стали RTS и TR, т.е. все ... (ответов: 2)
Вопрос № 3449. Привет Всем!Есть ли у кого нибудь справочник по портам! Пришлите.Спасибо!... (ответов: 3)
Вопрос № 3450. Здраствуйте МНОГОУважаемые Эксперты! Подскажите. 1.Что за порт eb ? 2.Как в реальном режиме создать ... (ответов: 3)
Вопрос № 3451. Доброе время суток! Тут не получается одна вещь: нужно узнать имя текущего процесса, т.е. такое же и... (ответов: 5)
Вопрос № 3452. Уважаемые Эксперты. Если не трудно, покажите, как нужно выгружать из памяти резидент: восстанавливат... (ответов: 1)
Вопрос № 3453. здрасте Xperty!!! Я вот тут немогу с этими API разобраться,вот допустим пишу я call MessageBoxA ,а ... (ответов: 3)
Вопрос № 3454. А ты не забыл в конце команды (т.е. CRLF дописать)? так и есть, забыл... т.е. и не знал вовсе... (ответов: 1)
Вопрос № 3455. Добрый день ! По поводу принтера. Сделал такой эксперимент - намочил салфетку слабым раствором повар... (ответов: 2)
Вопрос № 3456. Здравствуйте, уважаемые эксперты! Объясните пожалуйста, как происходят обращения к переменным, если ... (ответов: 4)
Вопросов: 14, ответов: 38
Вопрос № 3443 |
Здравствуйте уважаемые эксперты! Может кто-нибудь рассказать мне как скомпилировать файл в MASM32 (получить *.obj -> *.exe). Я пробовал прользоваться пунктами меню QEditor'a. Project-> и т.д. Почему-то не получилось. Текст прграммы написан абсолютно правильно. Расскажите куда заходить и что там писать. Самое главное где надо писать команды для компиляции в OBJ и потом в EXE. Помогите решить эту проблему!
Вопрос отправлен: 12.06.2003, 12:59
Отправитель: Mafia
[Следующий вопрос >>] [Список вопросов]
Отвечает _vt
Добрый день, Mafia!
1)Ну вообще-то пункт "Link OBJ file" должен сделать exe-файл; возможно ошибка не в тексте программы, а в том что линкер не находит дополнительных файлов для сборки программы (*.h,*.lib и др.)
2)Лучше всего использовать для компиляции командную строку: там проще указать все необходимые параметры.
---===*** Testing E-Man 1.2...***===---
Ответ отправлен: 13.06.2003, 23:40
Отправитель: _vt
Отвечает Hangatyr
Здравствуйте, Mafia!
1. Для этого вообще-то линкер используется (link.exe в твоем случае).
2. В командной строке. Например, так:
ml.exe /c /coff prog.asm
link.exe /SUBSYSTEM:WINDOWS prog.obj
3. Если уж не хочется возится с командной строкой, то скачай какой-нибудь IDE вроде RadAsm.
Ответ отправлен: 12.06.2003, 13:21
Отправитель: Hangatyr
Вопрос № 3444 |
Здравствуйте, уважаемые эксперты. Помогите пожалуйста разрешить такую
проблему. В программе приведенной ниже в отладчике по адресу bp-6 (у меня
==0FFF8, bp=0FFFE) находится совсем не то, что присваивается - bp - после
инструкции - mov bp, [bp-6] -. Как это можно объяснить? Глюк отладчика или
смотрю не туда. Отадчик - td - v.5.0.
Приложение:
Вопрос отправлен: 12.06.2003, 14:01
Отправитель: 1 (privat-soap@list.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Добрый день, 1!
В отладчике не проверял, но возможно что и глюк.
Попробуй в другом, только не в AFD, у него такая же фигня.
Ответ отправлен: 13.06.2003, 12:53
Отправитель: Maverick
Отвечает Bob Johnson
Приветствую Вас, 1!
Это не глюк. sp указывает на текущее положение указателя стека. При занесении в стек новых данных, он растет вниз. Ты же оставляешь sp на своем месте, а в bp загружаешь данные ниже sp - данные там постоянно меняются, т.к. стеком пользуется и td и прерывания и т.д.
Обычно делают так:
push bp - сохранение предыдущего значения bp
mov bp, sp
sub sp, число - перенос указателя стека ниже, чтобы освободить некоторое пространство.
вот после этого можно писать mov ??, [bp - ??].
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 12.06.2003, 16:52
Отправитель: Bob Johnson
Отвечает Ayl
Добрый день, 1!
У меня в TD все нормально. Т.е. смотрю на данные ПЕРЕД выполнением команды mov bp, [bp - 6]:
SP = FFFE
BP = FFFE (BP-6 = FFF8)
SS:FFF8 = 102
ПОСЛЕ выполнения команды BP=102, а вот по адресу SS:FFF8 значение уже другое (у меня - 105). Почему? Потому что твоим стеком пользуется и сам отладчик.
Ответ отправлен: 16.06.2003, 12:50
Отправитель: Ayl
Вопрос № 3445 |
Здравствуйте Уважаемые Эксперты!
Вопрос возможно ламерский,но все же.
Что такое runtime бибилиотек(и т. д.),и второй вопрос
как считается контрольная сумма файла и зачем она нужна?
Если можно подробней или ссылку кто знает.
Зарание спасибо.
Вопрос отправлен: 12.06.2003, 15:13
Отправитель: Vlad
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Приветствую Вас, Vlad!
Есть много алгоритмов подсчета, лучше у Юрова почитай, да и самому напридумывать сколько угодно можно. Вобщем, это служит для проверки целостности кода. Если код изменен, то и сумма изменится.
Ответ отправлен: 13.06.2003, 12:53
Отправитель: Maverick
Отвечает Дмитрий
Здравствуйте, Vlad!
1)runtime библиотеки содержат в себе код, необходимый для поддержки работоспособности программы. Например в Qbasice когда вызывается оператор print происходит обращение к brun40.exe (или что-нибудь в этом роде), где собственно и расположены обработчики всех стандартных функций. Поэтому, чтоб прога работала и на компе, где нет basica необходимо вместе с ней переносить и runtime библиотеки, или компоновать их вместе с прогой в один exe-файл.
2)контрольная сумма используется для проверки целостности файла. Можно реализовать самыми разными способами. Самый простой (но ненадежный) - просуммировать все байты в файле. Если необходимо что-то более серьезное, то воспользуйся CRC32. Неплохая хеш-функция. Любой поисковик даст кучу ссылок на исходники реализации этой функции.
Ответ отправлен: 16.06.2003, 07:42
Отправитель: Дмитрий
Отвечает masquer
Приветствую Вас, Vlad!
А ты переведи слово runtime, оно означает - во время выполнения.
Контрольная сумма, можно еще хеш сказать, может считаться тысячей и одним способом, нужна обычно для проверки целостности файла.
Ответ отправлен: 12.06.2003, 18:21
Отправитель: masquer
Отвечает Bob Johnson
Здравствуйте, Vlad!
1. Это библиотеки, которые подгружаются уже во время работы программы, а конкретнее - когда программа начинает выполнять определенную функцию. Это позволяет уменьшать размер самой программы, например, в delphi 6 основной библиотекой является vcl60.bpl; когда проект создается без runtime библиотеки (т.е. весь код встраивается в приложение), то его размер может быть в 2 - 3 раза больше, чем если использовать runtine библиотеку. Но в последнем случае необходимо, чтобы этот файл также был на компьютере, где будет работать приложение.
2. Применяется для проверки приложение на оригинальность (т.е. на то, что никто не изменял его код после создания). Считаться может по разным алгоритмам, основной - CRC32.
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 13.06.2003, 00:51
Отправитель: Bob Johnson
Вопрос № 3446 |
Добрый день.
У меня в компе памяти 1Gb. Я пытаюсь ее определить в PM
но не получается.
mov ax, <в GDT память с лимитом 4Gb>
mov es, ax
mov edx, 12345678h ;тестовый байт
mov edi, 1024*1024 ;пытаюсь определить с 1Mб
tst0:
mov eax, edx
xchg eax, es:[edi]
xchg eax, es:[edi]
add edi, 1000h ;блоками по 4кб
cmp eax, edx
jne tstex
jmp tst0
tstex:
по идее тут в edi должно быть
последний блок -1 ; размер памяти в кБ +1Мб
Может проще в RM через BIOS какими-нибудь фн. определить?
Или кто-нибудь может кинет другой исходник.
Заранее спасибо.
Вопрос отправлен: 12.06.2003, 16:01
Отправитель: sel (devsel@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Здравствуйте, sel!
А кто тебе сказал, что когда ты обратишься по несуществующему адресу, то просто произойдет "фиктивное" чтение? Это тебе не Z-80. Здесь чипсет контроллирует память, определяет, где будет начинаться какой банк памяти и т.д.
Если же ты обратишься по несуществующему адресу, то чипсет может подать сигнал reset на процессор или еще как-то отреагировать на это. В общем, надо либо функциями определять, сколько памяти или работать с чипсетом как-нибудь.
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 13.06.2003, 00:51
Отправитель: Bob Johnson
Отвечает ASMодей
Здравствуйте, sel!
Попробуй в реальном режиме прерывание INT 15h функции E820h, E801h.
Новые BIOSы должны поддерживать хотя бы одну из этих функций.
Ответ отправлен: 14.06.2003, 12:02
Отправитель: ASMодей
Вопрос № 3447 |
Здрествуите, увыжаемые експерты!
Вот решил попробывать написать небольшую ось для общего развития и вот возникла проблемма с выводом текста на экран. Выводятся какието еироглефы...
Помогите наити ошибку.
Приложение:
Вопрос отправлен: 12.06.2003, 18:37
Отправитель: Кислик (invisible@spils.lv)
[Следующий вопрос >>] [Список вопросов]
Отвечает _vt
Приветствую Вас, Кислик!
> mov si,message
Наверное,
mov si, offset message
> mov es:[di],ax
> add di,2
> inc al
Наверное,
inc si
---===*** Testing E-Man 1.2...***===---
Ответ отправлен: 13.06.2003, 23:40
Отправитель: _vt
Отвечает Bob Johnson
Здравствуйте, Кислик!
> Вот решил попробывать написать небольшую ось для общего развития
Вот значит теперь как... :)
1. Может быть тебе уже дадут нормальный ответ и то, что я написал не понадобится.
2. Прямо сразу не увидел, в чем причина, так что спрошу - символов ровно столько, сколько должно быть и цвет у них правильный, а также пробел после предполагаемого hello есть?
Попробуй как-нибудь засунуть этот же код в отладчик и посмотреть там, будет ли работать правильно.
И кстати "неперезагрузку" компа (см. вопрос № 3382) рекомендуется делать как
cli
jmp $ -2
почему-то hlt здесь (на РС) потеряла свой смысл.
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 13.06.2003, 03:46
Отправитель: Bob Johnson
Отвечает ASMодей
Добрый день, Кислик!
У тебя несколько ошибок.
Во-первых, если это загрузочный сектор, то он будет загружен в адрес 7C00h.
Так что в начале кода надо указать директиву ORG 7C00h.
Во-вторых команда mov si,message загрузит не адрес message, а два его
первых байта, то есть 'He'. Измени строку на mov si,offset message.
Именно поэтому у тебя выводились иероглифы.
А на самом деле у тебя весь экран должен быть заполнен символами 'H'.
Это потому что вместо строки inc al должна быть строка inc si.
Ответ отправлен: 14.06.2003, 12:03
Отправитель: ASMодей
Вопрос № 3448 |
Всем здрасте
Создал дескриптор модема (вызов CreateFile с COM2), на модеме стали RTS и TR, т.е. все ОК. Теперь хочу послать ему команду, например ATDP666 командой WriteFile. Ноль эмоций. Чего там еще нужно сделать? Может какой символ завершения (или начала)? Кто работал с модемами тот знает. Спасиба
Вопрос отправлен: 12.06.2003, 19:46
Отправитель: Broken Sword (brokensword@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает baldr
Добрый день, Broken Sword!
Подозреваю, что это как и принтеру - требуется перевод строки. Попробуй 0Ah ему скормить после команды?
Или 0Dh? или оба сразу... :)
Ответ отправлен: 13.06.2003, 23:07
Отправитель: baldr
Отвечает Bob Johnson
Добрый день, Broken Sword!
А ты не забыл в конце команды (т.е. CRLF дописать)? У меня следующий код привел к набору номера модемом:
HANDLE h = CreateFile ("COM2", GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
DWORD dummy;
WriteFile (h, "ATDP777777 ", 12, &dummy, 0);
CloseHandle (h);
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 13.06.2003, 03:46
Отправитель: Bob Johnson
Вопрос № 3449 |
Привет Всем!Есть ли у кого нибудь справочник по портам!
Пришлите.Спасибо!
Вопрос отправлен: 12.06.2003, 21:50
Отправитель: Yuri (ivanovx@inbox.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Tigran K. Kalaidjian
Здравствуйте, Yuri!
Что именно Вам надо? Примеры программирования, управление внешними устройствами, стандарты, схемы? Какие именно порты?
Ответьте на эти вопросы по адресу kalaidjian@pochtamt.ru и я Вам вышлю список или сами описания.
Ответ отправлен: 13.06.2003, 20:31
Отправитель: Tigran K. Kalaidjian
Отвечает _vt
Доброе время суток, Yuri!
http://www.pobox.com/~ralf
---===*** Testing E-Man 1.2...***===---
Ответ отправлен: 13.06.2003, 23:40
Отправитель: _vt
Отвечает Дмитрий
Здравствуйте, Yuri!
Ушло мылом!
Ответ отправлен: 16.06.2003, 08:42
Отправитель: Дмитрий
Вопрос № 3450 |
Здраствуйте МНОГОУважаемые Эксперты!
Подскажите.
1.Что за порт eb ?
2.Как в реальном режиме создать файл выбранного участка памяти (например всей!).(А в защищённом?).
3.Debug.exe(Win98SE) не понимает байт 0Fh (Вроде бы должен понять).Каким Дебагером пользоваться? Sourcer какой-то малоформатный (какая-то щель посреди экрана%).
Спасибо...
..
P.S.Господа пора бы сотворить сайт экспертов (святая святых) ,где был бы склад доков,экспертные статьи(!).Как на wasm.ru.
А то судя по популярности рассылки размер письма будет неуклонно расти.
Good Asm!
Вопрос отправлен: 12.06.2003, 21:51
Отправитель: Yuri
[Следующий вопрос >>] [Список вопросов]
Отвечает Tigran K. Kalaidjian
Приветствую Вас, Yuri!
1. По поводу debug.exe: пишите просто 0F без окончания h, ибо он в принципе работает с шестнадцатеричными числами.
ИМХО лучший отладчик - SoftIce
2. По поводу сайта - если Вы выделите пространство, то пожалуйста - я с удовольствием перенесу туда всю свою ББС и можно всех посетителей RusFaq.ru пересылать прямо туда. IMHO другие эксперты будут только рады существованию такого ресурса. Но пока такой возможности нет, и свои (экспертные Ж:0) ) статьи я выкладываю только на TiCOiN BBS.
Ответ отправлен: 13.06.2003, 20:46
Отправитель: Tigran K. Kalaidjian
Отвечает Bob Johnson
Здравствуйте, Yuri!
2. Открываешь файл, и начинаешь записывать туда данные из памяти блоками, после чего файл закрываешь.
3. Под ДОС - используй TD. Под винды - множество отладчиков - TD32, W32DAsm, SoftIce и т.д. Я тебе рекомендую остановиться на W32DAsm, если необходимость в чем-то более мощном отсутствует.
P.S. У многих из нас есть свои страницы, на которых именно это и выложено. Есть у меня, точно знаю, что у baldr (она посвящена ДОСу) и т.д.
Моя: bobjohnson.nm.ru
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 13.06.2003, 03:46
Отправитель: Bob Johnson
Отвечает Дмитрий
Здравствуйте, Yuri!
1)Ни в одной стандартной документации про этот порт не сказано.
3)debug.exe его и не поймет! 0Fh это настоящий префикс! С него начинаются самые "вредные" команды. Я когда составлял таблицу опкодов для своего дизассемблера, помучился с этим префиксом немало. Причем многие дизассемблеры интерпретируют эти команды по-разному. Как эталон лично я использую IDA. Для отладки думаю лучше использовать SoftIce. С этом префиксом у него должно быть все в порядке. Удачи!
Ответ отправлен: 16.06.2003, 09:00
Отправитель: Дмитрий
Вопрос № 3451 |
Доброе время суток! Тут не получается одна вещь: нужно узнать имя текущего процесса, т.е. такое же имя, какие
выводятся в списке задач, или хотя бы имя файла(exe), который запустил процесс. Нашёл функцию GetModuleFileName, но там
первым параметром надо указывать какой-то handle какого-то модуля. Этот handle возвращается функцией GetModuleHandle, где
параметр - имя файла. В общем, замкнутый круг. Может знаете, как выбраться?
Вопрос отправлен: 13.06.2003, 01:33
Отправитель: undying (undying@ezmail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает masquer
Здравствуйте, undying!
Запусти GetModuleHandle с параметром NULL, получишь текущий процесс.
Ответ отправлен: 13.06.2003, 12:18
Отправитель: masquer
Отвечает Ramzes
Доброе время суток, undying!
GetModuleFileName(NULL)
Ответ отправлен: 16.06.2003, 17:45
Отправитель: Ramzes
Отвечает Bob Johnson
Добрый день, undying!
Очень легко - функция GetModuleFileName действительно требует первым параметром hInsance модуля (или handle, что в принципе то же самое), но если указать вместо него 0, то функция вернет имя текущего приложения.
char txt [MAX_PATH];
GetModuleFileName (0, txt, MAX_PATH);
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 13.06.2003, 23:47
Отправитель: Bob Johnson
Отвечает Hangatyr
Доброе время суток, undying!
GetModuleHandle с параметром 0 вернет тебе хэндл текущего процесса.
Приложение:
Ответ отправлен: 13.06.2003, 15:18
Отправитель: Hangatyr
Отвечает Dark_Lord
Добрый день, undying!
Если передать функции GetModuleHandle нулевое значение, то она вернёт handle текущего процесса, который и можно использовать в GetModuleFileName, которая возвращает полный адрес файла!
Ответ отправлен: 14.06.2003, 12:21
Отправитель: Dark_Lord
Вопрос № 3452 |
Уважаемые Эксперты.
Если не трудно, покажите, как нужно выгружать из памяти резидент: восстанавливать векторы,
освобождать память и т.д.
Что делать (до) после...
; ?
mov ax,25xxh
lds dx,dword ptr cs:dwTruexxVector
int 21h
; ?
Не писать же:
mov ax,4C00h
int 21h
;???
Заранее благодарю.
Вопрос отправлен: 13.06.2003, 02:43
Отправитель: shade
[Следующий вопрос >>] [Список вопросов]
Отвечает ASMодей
Добрый день, shade!
Перед тем как восстанавливать векторы, посмотри не изменились ли они,
а то может после тебя их другой резидент перехватывал.
Ответ отправлен: 14.06.2003, 17:18
Отправитель: ASMодей
Вопрос № 3453 |
здрасте Xperty!!!
Я вот тут немогу с этими API разобраться,вот допустим пишу я
call MessageBoxA ,а вот что дальше,просто компилятор (tasm) экспортирует
и подставит:
0040xxxx call 0040xxxx
........
0040xxxy jmp bff5412e
В общем кто генерирует таблицу переходов?при запуске ЕХЕ,или это
делает компилятор,если последний то получается что прога для windows95,98
не будет работать под windows NT,2000 так как там модуль user32.dll проэцируется
не в bff50000h a в 77e20000h то есть другие адреса.
Как ваще программа узнает адреса функций?
Вопрос отправлен: 13.06.2003, 07:15
Отправитель: Korov (beloloba@yandex.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает masquer
Доброе время суток, Korov!
Компилятор генерирует что-то типа call [0040xxxxx], а по этому адресу загрузчик модуля прописывает правильный адрес функции. Как узнает? Сканирует импорт и прописывает правильные значения для текущей ОС.
Ответ отправлен: 13.06.2003, 12:13
Отправитель: masquer
Отвечает Hangatyr
Здравствуйте, Korov!
Для обеспечения совместимости и используется этот механизм. При загрузке PE файла загрузчик заполнит поля корректными адресами функций. Главное, чтобы в системе присутствовал этот самый user32.dll со своими функциями (или заглушками).
Ответ отправлен: 13.06.2003, 15:08
Отправитель: Hangatyr
Отвечает Bob Johnson
Здравствуйте, Korov!
Варианты с jmp - это генерирует компилятор. Выглядит это так:
mmm:
jmp [xxx], где xxx - это адрес некоторой ячейки памяти.
Все call ссылются реально не на функцию, а на mmm. ххх заполняет загрузчик верным значением адреса функции.
Это, мне кажется, сделано для того, чтобы API функция имела свой адрес в твоем приложении (в данном случае адресом будет mmm). а иначе адрес будет содержаться в переменной xxx. Т.е. когда ты пишешь mov eax, offset API_func, то компилятор может написать mov eax, offset mmm, а иначе ему надо было бы заменять команду на mov eax, [xxx], что в общем случае уже другая команда.
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 14.06.2003, 00:54
Отправитель: Bob Johnson
Вопрос № 3454 |
А ты не забыл в конце команды (т.е. CRLF дописать)?
так и есть, забыл... т.е. и не знал вовсе никогда
thx
Вопрос отправлен: 13.06.2003, 08:49
Отправитель: Broken Sword (brokensword@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Добрый день, Broken Sword!
А я вот забыл, что надо \ два раза писать... Задумывалось
\r\n :-)
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 14.06.2003, 00:54
Отправитель: Bob Johnson
Вопрос № 3455 |
Добрый день !
По поводу принтера. Сделал такой эксперимент - намочил салфетку слабым раствором поваренной соли (чтобы сопротивление снизить) и прилепил её к внутренней части каретки принтера. Получился "симулятор" картриджа. И, как ни странно, каретка вдвигалась\выдвигалась нормально при включении принтера, т.е. он ЧУВСТВОВАЛ картридж, хотя самого картриджа не было! Естественно, что с пустой кареткой такого не бывает.
На салфетке после пары включений появились 4 зелёные точки в местах контактов(продукт реакции – скорее всего оксид меди), через которые шел ток, т.е. получилось найти контакты, отвечающие за датчик наполненности картриджа.
Теперь перед включением делаю вот что – залепляю салфеткой, включаю, вынимаю салфетку, ставлю картридж, печатаю.
Пробовал найти контакты на плате, соотв. контактам на контактной площадке. Оказалось, что нет прямого соответствия, т.е. на один контакт на площадке приходится от 3-х до шести дорожек на плате. Разобраться не смог => не могу найти что замыкать. Может у кого есть распиновка контактов на площадке (НР420)? Опять же непонятно, почему помогала смена драйверов, да и не важно...
Придумал ещё один способ оставления принтера в рабочем состоянии: отлавливаю момент, когда тот нормально включился и перед выключением\перезагрузкой машины просто вынимаю кабель, соед. С LPT-портом. Итого: принтер не реагирует на перезагрузку и остаётся в рабочем состоянии круглые сутки. Сейчас пытаюсь отследить, что изменяется на выходе порта при перезагрузке, если найду контакт, то перекушу его – вот и починю =)
Прошивку найти не удалось. Только для Epson. Может для HP их и нету (?)
Спасибо за быстрые ответы на прошлое письмо!
P.S. эксперты Vitya и Hayk – пришлите, пожалуйста, пустое письмо на kalaidjian@pochtamt.ru
Приложение:
Вопрос отправлен: 13.06.2003, 10:10
Отправитель: Tigran Kalaidjian
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Добрый день, Tigran Kalaidjian!
> На салфетке после пары включений появились 4 зелёные точки в местах контактов
Интересная мысль!
> Придумал ещё один способ оставления принтера в рабочем состоянии:
Видимо драйвер принтера проверяет на пустоту картриджа только при загрузке...
> Сейчас пытаюсь отследить, что изменяется на выходе порта при перезагрузке, если найду контакт...
Думаешь, там для этого контакт есть? Думаю, просто драйвер при инициализации дает какую-то команду принтеру, а тот в ответ возвращает состояние картриджа. Лучше все-таки найди контакты на плате, куда идут эти провода и повесь резистор. Для этого попробуй вытащить шлейф, который идет к картриджу из платы принтера и тестером прозвонить на свои "позеленевшие" контакты, а потом уже на плате по разъему найди, куда идут дорожки шлейфа. Естественно, они могут идти в разные места, но тебе просто ведь нужно замкнуть их (через резюк), так что должно быть все равно.
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 14.06.2003, 00:54
Отправитель: Bob Johnson
Отвечает Дмитрий
Добрый день, Tigran Kalaidjian!
Это просто здорово! Про контакты картриджа я и не подумал! Bob Johnson'у - респект!
Ответ отправлен: 16.06.2003, 09:09
Отправитель: Дмитрий
Вопрос № 3456 |
Здравствуйте, уважаемые эксперты!
Объясните пожалуйста, как происходят обращения к переменным, если модуль грузится в другое место, не по image base. Например в программе есть такая инструкция mov eax, <конкретный_адрес_переменной>. Если модуль загрузится
не по заголовочному ImageBase'у, то эта строка не будет делать то, что хочется - адрес переменной уже другой... Значит, надо как-то пересчитывать все эти адреса. Как это делает загрузчик? Неужели пересчитывается вся секция кода?!
Буду очень признателен за все ответы.
Заранее благодарен.
Вопрос отправлен: 13.06.2003, 12:52
Отправитель: Alex
[Следующий вопрос >>] [Список вопросов]
Отвечает Hayk
Здравствуйте, Alex!
Вот это и есть основная причина, по которой в операционных системах используеться по крайней мере статическая переадресация. В Windows-ах конечно же динамическая. Так вот системный загрузчик пересчитывает все эти адреса и записывает туда селекторы соответствующих сегментов. Всю необходимую информацию системный загрузчик берёт из заголовка exe файла.
Ответ отправлен: 13.06.2003, 14:06
Отправитель: Hayk
Отвечает Maverick
Доброе время суток, Alex!
Хех, не знаю, как делает загрузчик, но знаю как вывертываются вирусы.
Ведь после того как приписались к жертве, все смещения в вире тоже поменяются. Поэтому в начале вируса считается дельта-смещение.
start:
call delta
delta:
pop ebp
sub ebp,offset delta ;В EBP дельта смещение
Теперь чтоб занести в регистр какое либо смещение нужно прибавить к нему еще и ebp.
mov [ebp+AdressTable],eax
Здесь мы занесем в переменную AdressTable, значение eax
Ответ отправлен: 13.06.2003, 13:47
Отправитель: Maverick
Отвечает vitya
Доброе время суток, Alex!
В заголовке исполняемого файла есть массив DATA_DIREСTORY в которм хранится информация об имортируемых и экспортируемых функциях, так же там хранится информация о relocation-ах (для которых отведена соответствующая секция). Так вот надо изменить все эти relocation-ы и тогда по идее все будет работать.
Ответ отправлен: 13.06.2003, 13:04
Отправитель: vitya
Отвечает Bob Johnson
Доброе время суток, Alex!
Есть специальные записи, которые называются relocation. Для каждой команды типа mov eax, конкр. адрес добавляется запись в эту таблицу (адрес такой ячейки памяти, где нужно менять адрес переменной). Если модуль грузится не по image base, то загрузчик пробегает все такие адреса и делает "патчи". UPX (пакер) позволяет убрать эти записи, чтобы еще сократить объем программы, но тогда при загрузке по другому адресу, она вообще не будет работать...
* EMan1.2: ---===*** The Eternal Power ***===---
Ответ отправлен: 14.06.2003, 00:54
Отправитель: Bob Johnson
Форма отправки вопроса |
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
(C) 2002-2003 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (39) C / C++ (28) Perl (6) Builder / Delphi (18) Pascal (29) Basic / VBA (10) Java / JavaScript (12) PHP (6) MySQL / MSSQL (7) |
Пользователю Windows 95/98/Me (32) Windows NT/2000/XP (27) "Железо" (20) Поиск информации (14) |
Администратору Windows NT/2000/XP (14) Linux / Unix (7) |
Юристу Гражданское право (8) Семейное право (4) Трудовое право (5) КоАП (4) |
Отправить вопрос всем экспертам выбранной рассылки.
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
© 2001-2003 Россия, Москва. Авторское право: Калашников О.А. |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||