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

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.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
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
Отписаться
Убрать рекламу

В избранное