Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 699
от 23.02.2004, 22:10
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 4991 Отправлено ответов: 13856 Активность: 277.6 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Artemy Статус: Опытный Общий рейтинг: 115.42 Телефон: 8 905 549 38 66 [Подробней >>] |
VOVAN Статус: Доверительный Общий рейтинг: 107.66 [Подробней >>] |
_vt Статус: Профессиональный Общий рейтинг: 117.69 [Подробней >>] |
ASMодей Статус: Профессиональный Общий рейтинг: 112.1 [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 116.5 [Подробней >>] |
never_again Статус: Опытный Общий рейтинг: 122.42 [Подробней >>] |
Foamplast Статус: Доверительный Общий рейтинг: 164.81 [Подробней >>] |
Евгений Иванов Статус: Профессиональный Общий рейтинг: 135.15 URL: Super Assembler Software Телефон: Пчёлка +7 905 6601206 [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 144.54 URL: Программирование [Подробней >>] |
SedHg Статус: Опытный Общий рейтинг: 112.78 [Подробней >>] |
vitya Статус: Профессиональный Общий рейтинг: 108.62 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 4956. Пытаюсь скомпилировать следующий код в Masm 6.14.8444 obj файл создается, пишу ml.exe file.asm /AT /... (ответов: 4)
Вопрос № 4958. Уважаемые эксперты!!! Как сделать задержку в проге средствами асма под ДОС? Чтоб прога тормознула на... (ответов: 3)
Вопрос № 4959. Здрасте. Преамбула: Апишка LoadLibrary возвращает HINSTANCE, который является на самом деле базовым ... (ответов: 1)
Вопрос № 4960. Эдравствуйте!!! Не подскажите как сделать так чтобы резидент сам себя удалил из памяти ( подойдет ли... (ответов: 5)
Вопрос № 4961. Здравствуйте, уважаемые эксперты! У меня к вам 2 вопроса. Как можносменить стандартый мышиный курсор... (ответов: 2)
Вопрос № 4964. здравствуйте господа программеры, у меня вот какая проблема: (я еще не очень хорошо представляю себе... (ответов: 3)
Вопрос № 4965. Здравствуйте! Я столкнулся с проблемой извлечения иконки из ехе файла и сохранения ее в файл с помо... (ответов: 1)
Вопрос № 4966. Надо дезассемблировать некоторый экзешник, внести в него изменения и собрать снова - какой средой пр... (ответов: 3)
Вопрос № 4967. Здравствуйте уважаемые эксперты. У меня к вам вот такой вопрос, как организовать в программе отслежи... (ответов: 1)
Вопрос № 4968. Здравствуйте уважаемые эксперты! В книге Юрова Assembler встретил описание как в памяти компьютера п... (ответов: 1)
Вопрос № 4970. Здраствуйте! Такой простенький вопрос - в проге под DOS указывался размер стека явно, в проге под Wi... (ответов: 2)
Вопросов: 11, ответов: 26
Вопрос № 4956 |
Пытаюсь скомпилировать следующий код в Masm 6.14.8444
obj файл создается, пишу ml.exe file.asm /AT /c
а вот Link.exe file.obj /t выдает ошибку...
посмотрел параметры e link.exe у него нет опции /t!
пишу просто так link.exe masm_3.obj
в ответ вот:
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
masm_3.obj : warning LNK4033: converting object format from OMF to COFF
masm_3.obj : fatal error LNK1190: invalid fixup found, type 0x0001
как быть ?
Приложение:
Вопрос отправлен: 16.02.2004, 17:29
Отправитель: Ti
[Следующий вопрос >>] [Список вопросов]
Отвечает Artemy
Здравствуйте, Ti!
Компили так: d:hrenznaetgdeml.exe /AT filename.asm
Ответ отправлен: 17.02.2004, 09:46
Отправитель: Artemy
Отвечает VOVAN
Приветствую Вас, Ti!
попробуй написать вместо ml.exe file.asm /AT /c
просто ml.exe file.asm /AT
Ответ отправлен: 17.02.2004, 20:32
Отправитель: VOVAN
Отвечает _vt
Добрый день, Ti!
Для создания com-программы достаточно выполнить команду ml /AT file.obj. При этом версия линкера должна уметь собирать программы под DOS, насколько помню, версия 5.12 это может.
--- E-Man 1.5+ : Sorry for terrible english. My native language is C++
Ответ отправлен: 17.02.2004, 00:40
Отправитель: _vt
Отвечает ASMодей
Приветствую Вас, Ti!
Вот теперь все понятно. Дело в том, что ты пытаешься скомпоновать DOS-программу
линкером для Windows (надпись Incremental Linker видишь?) Этот линкер входит в
состав MASM32 (возможно случайно у тебя затесался) и по всей видимости не
позволяет компоновать DOS-программы. Тебе нужно найти в старом пакете MASM 6.xx
линкер, который сам себя называет как Segmented Executable Linker и им
компоновать.
Ответ отправлен: 17.02.2004, 09:03
Отправитель: ASMодей
Вопрос № 4958 |
Уважаемые эксперты!!!
Как сделать задержку в проге средствами асма под ДОС?
Чтоб прога тормознула на 0.05-0.1 секунды.
Вопрос отправлен: 17.02.2004, 20:36
Отправитель: VOVAN
[Следующий вопрос >>] [Список вопросов]
Отвечает Artemy
Здравствуйте, VOVAN!
cd:dx - число милисекунд
ah=86h
int 15h
Ответ отправлен: 18.02.2004, 11:14
Отправитель: Artemy
Отвечает Ayl
Здравствуйте, VOVAN!
1. Если тебе просто нужна задержка, то считываешь значение по адресу 0040:006C (4 байта) и ждешь, пока новое значение в этих ячейках не превысит времени ожидания. Значение в ячейках увеличивается на 1 каждые 55 мс (0.055 с), то есть если ты хочешь задержку на 0.05 с, то надо подождать одно обновление, а если на 0.1 с - то 2.
2. Если же ты хочешь асинхронное выполнение, то надо перехватить Int 08. 1 вызов этого прерывания происходит с такой же частотой, т.е. 2 послежовательных вызова - это период в 55 мс.
Ответ отправлен: 18.02.2004, 12:51
Отправитель: Ayl
Отвечает never_again
Доброе время суток, VOVAN!
;-----------------GENERATE DELAY
; push most significant word of milliseconds' number
; push less significant word of milliseconds' number
; call delay
;-------------------------------
delay proc
push ax
push cx
push dx
push bp
mov bp,sp
mov ah,86h
mov cx,[bp+12]
mov dx,[bp+10]
int 15h
apop bp
apop dx
apop cx
apop ax
ret 4
delay endp
;-----------------END GENERATE DELAY
Ответ отправлен: 18.02.2004, 19:47
Отправитель: never_again
Вопрос № 4959 |
Здрасте.
Преамбула:
Апишка LoadLibrary возвращает HINSTANCE, который является на самом деле базовым адресом образа DLL в памяти.
Так вот. Экспортируем класс из некой DLL "L". В некой проге "P" делаем вызов LoadLibrary. Читаем таблицу экспорта DLL (с диска, хотя это не важно), получаем RVA этого класса. Теперь чтобы получить адрес класса в памяти нужно HINSTANCE+RVA. Ну, с экспортируемыми функциями то же самое. Окей, всё фурычит, проверял.
Амбула:
Поменял кое-что в проге "Р" (на работу DLL это никак влиять не должно, по моему). Написал несколько дополнительных экпортируемых функций из "L". И столкнулся с проблемой.
По адресу HINSTANCE+RVA уже не находится то, что нужно. Посмотрел дамп. То, что нужно находится по каким-то левым адресам. При этом HINSTANCE как был 0х10000000 так и остался. Сам файл DLL содержит те же RVA экспортируемых функций.
Вопрос:
Я конечно понимаю, что смотреть нужно, чего я там такого намудил. Но, тем не менее, может я чего-то не знаю, с чего вдруг, например, таблица экспорта в памяти не находится по RVA указанному в файле. Выравнивание секций у меня во всех прогах и в файле, и в памяти 0x1000. (Пишу в VC6). Я так понимаю, меняться может база, а RVA - это святое.
Ответ:
Спасибо за ответ.
Вопрос отправлен: 18.02.2004, 01:05
Отправитель: ПАПА (rezervx@ezmail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Здравствуйте, ПАПА!
1. Вопрос в том, как этот RVA преобразовывать в смещение.
Многие не знают, а других учат. Например, в популярной книге
"Работа с файлами в Win32" Румянцев П.В. пургу гонит полнейшую насчёт всего, что связано с форматом РЕ.
(см. моё приложение, оно верное)
2. А почему бы Вам не использовать GetProcAddress для определения необходимого адреса?
3. Ещё можно сделать в DLL функцию, которая будет выдавать
необходимый адрес, а её вызывать, использовав GetProcAddress.
Приложение:
Ответ отправлен: 18.02.2004, 03:06
Отправитель: Foamplast
Вопрос № 4960 |
Эдравствуйте!!!
Не подскажите как сделать так чтобы резидент сам себя удалил из памяти ( подойдет ли функция 49h)!!!
Вопрос отправлен: 18.02.2004, 02:13
Отправитель: Alexandr
[Следующий вопрос >>] [Список вопросов]
Отвечает Евгений Иванов
Добрый день, Alexandr!
Резидента может удалить только запускаемая программа обычным образом.
Удачи.
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 20.02.2004, 22:58
Отправитель: Евгений Иванов
Отвечает Bob Johnson
Добрый день, Alexandr!
Да, надо вызвать функцию удаления блока памяти для своей программы и переменных окружения (сегментный адрес можно узнать из psp).
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 18.02.2004, 09:42
Отправитель: Bob Johnson
Отвечает Artemy
Здравствуйте, Alexandr!
Вернуть вектора прерываний, освободить память и выйти ф-цией 4Ch для int 21h
Ответ отправлен: 18.02.2004, 11:17
Отправитель: Artemy
Отвечает Ayl
Доброе время суток, Alexandr!
Да, подойдет... Т.к. эта функция освобождает указанное число параграфов с указанного места, то ей без разницы, вызвана она из резидента или еще откуда-то. Только надо аккуратно разобраться с обработчиками прерываний.
Ответ отправлен: 18.02.2004, 12:55
Отправитель: Ayl
Отвечает VOVAN
Добрый день, Alexandr!
смотри 27 номер рассылки
Ответ отправлен: 18.02.2004, 20:16
Отправитель: VOVAN
Вопрос № 4961 |
Здравствуйте, уважаемые эксперты! У меня к вам 2 вопроса. Как можносменить стандартый мышиный курсор(то который возвращает LoadCursor, NULL, IDC_XXX)? И ещё: не подскажите ли код макроса FUNC, чтобы можно было писать так: invoke GetWindowLong, FUNC(GetDlgItem, hWnd, ID_XXX), GWL_EXSTYLE или как нибудь по-другому... Где-то видел, да не обратил внимания... Заранее спасибо.
Вопрос отправлен: 18.02.2004, 16:45
Отправитель: PRO (admin@smallsoft.net.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Добрый день, PRO!
> чтобы можно было писать так: invoke GetWindowLong, FUNC(GetDlgItem, hWnd, ID_XXX), GWL_EXSTYLE
Это полнейший изврат для ассемблера. Если тебе нравиться такой синтаксис - используй С++. А на асме весь прикол и состоит в том, чтобы делать все самому и руками.
> Как можносменить стандартый мышиный курсор
LoadCursor,
SetCursor.
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 19.02.2004, 11:53
Отправитель: Bob Johnson
Отвечает Foamplast
Приветствую Вас, PRO!
1. Вот описание LoadCursor из MSDN
HCURSOR LoadCursor(
HINSTANCE hInstance,
LPCTSTR lpCursorName);
hInstance
[in] Handle экземпляра исполняемого модуля, содержащего загружаемый курсор.
lpCursorName
[in] Указатель на завершающуюуся нулём строку, содержащую имя курсора, который нужно загрузить. Также этот параметр может состоять из идентификатора ресурса в младшем слове и нуля в старшем слове.
То есть если есть нужный курсор в ресурсах твоей программы, то пиши:
GetModuleHandle();
LoadCursor(Eax, ID_MYCOOLCURSOR);
2. Такие примочки убивают оптимизацию. Иногда можно написать эффективнее, а ты за макросами не видишь сути и потому не можешь написать лучше. Пиши по-обычному.
Ответ отправлен: 19.02.2004, 01:55
Отправитель: Foamplast
Вопрос № 4964 |
здравствуйте господа программеры, у меня вот какая проблема:
(я еще не очень хорошо представляю себе некоторые моменты на асме) у меня в универе контрольная такая, короче суть в том чтобы в строке несколько символов заменить одним, а один символ несколькими символами, уме на приложу как это можно следать не стерев при этом соседние символы, будуу очень признаелен если раскажите алгоритм.
заранее спасибо...
Вопрос отправлен: 19.02.2004, 08:54
Отправитель: очень хочу научиться (real-diablo@yandex.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Artemy
Приветствую Вас, очень хочу научиться!
А тебе и не надо ничего стирать, просто выдели буфер для новой строки и когда будешь сканировать строку-источник данных, переноси символы в новый буфер, сразу заменяя их на то что надо.
Ответ отправлен: 19.02.2004, 09:42
Отправитель: Artemy
Отвечает Ayl
Добрый день, очень хочу научиться!
Нужны 2 строки - исходная и для результата. Вначале результирующая строка пустая. Добавляешь туда символы из исходной строки согласно заданию. Если требуется, чтобы результат помещался на место исходной строки - после окончания обработки копируешь новую строку поверх исходной.
Вот и все.
Ответ отправлен: 19.02.2004, 12:40
Отправитель: Ayl
Отвечает Foamplast
Приветствую Вас, очень хочу научиться!
Тут дело в том, что исходная строка просматривается символ за символом, и при этом формируется другая,результирующая, строка. Т.о. ты ничего не затираешь, поскольку пишешь в другую строку. Потом, если того требуют условия, можешь скопировать новую строку на место старой.
Посмотри приложение. Там твой алгоритм и код моей процедуры, которая читает строку и преобразует "y", "Y" или "yes" из любого регистра в "YES" (верхний регистр), а "n", "N" или "no" из любого регистра в "NO" (верхний). При успехе выдаёт Eax = 1, при ошибке (строка не "yes" и не "no") - 0.
Приложение:
Ответ отправлен: 20.02.2004, 01:46
Отправитель: Foamplast
Вопрос № 4965 |
Здравствуйте!
Я столкнулся с проблемой извлечения иконки из ехе файла и сохранения ее в файл с помощью masm32. Может подскажет кто, желательно с примером.
Вопрос отправлен: 19.02.2004, 11:48
Отправитель: Dron
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Доброе время суток, Dron!
1. Грузишь exe файл с помощью LoadLibraryEx("cool.exe", NULL, LOAD_LIBRARY_AS_DATAFILE); затем перечисляешь иконки с помощью EnumResourceNames, затем находишь handle нужной иконки с помощью FindResource и грузишь её с помощью LoadResource и, наконец, LockResource - и указатель на область данных иконки твой. Размер данных можно узнать с помощью SizeofResource.
2. Читаешь файл в память, разбираешь заголовки, находишь секцию ресурсов, разбираешь дерево ресурсов и докапываешься до иконки.
Ответ отправлен: 20.02.2004, 02:02
Отправитель: Foamplast
Вопрос № 4966 |
Надо дезассемблировать некоторый экзешник, внести в него изменения и собрать снова - какой средой программирования лучше воспользоваться и как это осуществляется (прога под винды) ? Асм знаю, правда дезассемблированием и правкой экзешников никогда не занимался.
Вопрос отправлен: 19.02.2004, 16:45
Отправитель: huk (aviator1@pisem.net)
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Здравствуйте, huk!
Так уж почему-то повелось, что каким (из известных мне) дизассемблером не пользуйся, полученный текст, хоть и будет отражать действия программы, в работающий файл не собрать.
Поэтому технология правки такая:
1. Дизассемблируешь
2. Уясняешь что поменять.
3. Переводишь это что-то в машинный код
4. Подгоняешь этот код, чтобы он правильно влез в старые коды.
(Здесь можно, иногда, увеличить размер секции и поставить команды перехода, как это делали первые вирусы)
5. Правишь исходный файл в машинном коде
А если программа зашифрована или самомодифицирущаяся, то и так не выйдет, придётся отлавливать момент в памяти, когда она частично расшифруется и тогда...
Ещё могу предложить заменяемый участок кода загнать в dll и в программе заменить исходный участок кода на LoadLibrary, GetProcAddress и, собственно, вызов функции.
В общем, флаг в руки! (и барабан на шею, и палочки...)
Ответ отправлен: 20.02.2004, 02:13
Отправитель: Foamplast
Отвечает SedHg
Добрый день, huk!
Честно говоря, я никогда не слышал о существовании сред программирования, в которых можно дизассемблировать программы.
На настоящий момент лучшим дизассемблером является IDA Pro, последняя версия, вроде, 4.6.
Ответ отправлен: 20.02.2004, 16:25
Отправитель: SedHg
Отвечает _vt
Приветствую Вас, huk!
Ну пару байт можно подправить, используя Hiew - и заново собирать не потребуется. Для большего - используй IDA.
--- E-Man 1.5+ : Sorry for terrible english. My native language is C++
Ответ отправлен: 22.02.2004, 00:53
Отправитель: _vt
Вопрос № 4967 |
Здравствуйте уважаемые эксперты. У меня к вам вот такой вопрос, как организовать в программе отслеживание обращения к портам другими программами, как это делают операционные системы?
Понимаю, что вопрос не простой, но если кто знает ответ, то плиз ответить поподробнее.
Вопрос отправлен: 19.02.2004, 16:57
Отправитель: Angel
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Здравствуйте, Angel!
Прежде всего, хотелось бы уточнить, о каких портах идёт речь (LPT, COM, USB и IEEE1394; порты ввода-вывода процессора или что-нибудь другое).
Ответ отправлен: 20.02.2004, 02:23
Отправитель: Foamplast
Вопрос № 4968 |
Здравствуйте уважаемые эксперты!
В книге Юрова Assembler встретил описание как в памяти компьютера представляются вещественные числа. Сказано, что в коротком формате первое число мантисы, которое равно единице по определению,отбрасывается и учитывается на аппаратном уровне, а освободившийся бит используется как дополнительный для представления порядка, размерность порядка 8 бит, что увеличивает диапазон чисел. Однако в книге по информатике для 7-9 классов встретил описание представления вещественных чисел, где сказано,что для представления вещественных чисел используется размерность порядка 7 бит. Я так понимаю, что видимо это был старый алгоритм представления вещественных чисел. Я проверял действительно числа представляются в памяти по алгоритму описанному у Юрова. Вопрос с какого процессора алгоритм представления вещественных чисел поменялся. Прошу понять меня правильно просто консультирую человека который готовиться поступать и буду обьяснять ему по Юрову, но надо правильно обьяснить почему в учебнике по другому.
Спасибо всем кто ответит.
Вопрос отправлен: 19.02.2004, 18:47
Отправитель: Александр
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Приветствую Вас, Александр!
Сколько людей, столько и представлений.
Например, устройство для вычислений с плавающей точкой (FPU) использует, как мне известно следующие типы данных:
расширенное вещественное - 80 бит, "родной формат"
длинное вщественное - 64 бит
короткое вещественное - 32 бит
При этом 80-битный формат устроен так:
бит 79 - знак мантиссы
биты 78-64 - 15-битная экспонента +16383
63-0 - 64-битная мантисса с первой цифрой (то есть бит 63 равен 1)
Это стандарт IEEE 854 (IEEE - международная ассоциация инженеров, то есть не "... с горы").
Причём всё вышесказанное справедливо лишь для процессоров, совместимых с моделью Pentium фирмы Intel. А другие производители могут чего-нибудь своё придумать...
А в учебнике уточнено, про какие процессоры идёт речь?
Вообще-то 8 бит мало очень.
В общем, если не уточнено, сказать: "есть и такой алгоритм, а есть сякой, а вообще я их много знаю, сейчас подробно расскажу про 1024-битный :)".
Если уточнено, то сказать: "такой-то процессор представляет числа в памяти так, сякой - так, а недавно изобрели ещё один алгоритм - 1024-битное представление..."
Ответ отправлен: 20.02.2004, 02:38
Отправитель: Foamplast
Вопрос № 4970 |
Здраствуйте! Такой простенький вопрос - в проге под DOS указывался размер стека явно, в проге под Windows каков размер выделяемого ей стека, если не указывать его явно. И как указывать размер стека под Windows явно?
Вопрос отправлен: 19.02.2004, 22:04
Отправитель: Alex
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Добрый день, Alex!
Всё ещё даже более явно, в исполнимом файле формата PE (*.exe, *.dll, *.ocx и т.п.) задаются: Максимальный размер стека, Начальный размер стека, Максимальный размер кучи и Начальный размер кучи.
Прописывает их туда линкер, т.е. от него и зависит.
Можешь сам прописать прям в готовый файл любым двойчным редактрором.
Ответ отправлен: 20.02.2004, 02:43
Отправитель: Foamplast
Отвечает vitya
Добрый день, Alex!
Обычно что-то порядка мегабайта. А количество явно выделенного пространства стека - можно задать в ключах линкера.
Ответ отправлен: 20.02.2004, 08:44
Отправитель: vitya
Форма отправки вопроса |
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
(C) 2002-2003 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (26) C / C++ (16) Perl (3) Builder / Delphi (19) Pascal (20) Basic / VBA (8) Java / JavaScript (3) PHP (13) Криптография (7) WinAPI (11) Радиоэлектроника (8) |
Пользователю Windows 95/98/Me (38) Windows NT/2000/XP (55) "Железо" (33) Поиск информации (14) |
Администратору Windows NT/2000/XP (30) Linux / Unix (11) |
Юристу Гражданское право (16) Семейное право (11) Трудовое право (12) КоАП (10) |
Отправить вопрос всем экспертам выбранной рассылки.
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||