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

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.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
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.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.


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

В избранное