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

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


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

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler

Выпуск № 82
от 12.03.2005, 17:50

Администратор:Калашников О.А.
В номере:Вопросов: 5, Ответов: 15


Вопрос № 17911: привет! где есть доки по ndis? в ya.ru.. находил какую-ту фигню...
Вопрос № 17918: привет! чем можно дизасмить проги написаные на visual c++(7.0) .net? или - прога peid показывает что чат "vypress chat" защищена Microsoft Visual C++ 7.0 [Overlay] - чем можно ее дизасмить?...
Вопрос № 17932: Здравствуйте всем! Изучаю 23-ий выпуск рассылки "Ассемблер-это просто" касаемо перехвата прерываний вызываемых клавиатурой. Возникает очень много вопросов.На часть из них - сам нашел ответы (если правильно-то подтвердите). А на час...
Вопрос № 17939: доброго времени суток, уважаемые встала передо мной задача: написать как можно меньшую программу, которая использовала бы WinAPI для WinAPI необходимы несколько библиотек, но зачем инклудить весь файл если мне нужен заголовок одной-трех функц...
Вопрос № 17941: Добрый день. Читаю 13 выпуск. Новый оператор movs. И часть программы ........ mov cx,10 mov si,offset str1 //откуда будем брать mov di,offset str2// куда будем копировать rep movsb //str1=str2 //может это опечатка, может str2=str...

Вопрос № 17911
привет!
где есть доки по ndis? в ya.ru.. находил какую-ту фигню
Отправлен: 06.03.2005, 19:57
Вопрос задал: valix (статус: Посетитель)
Всего ответов отправлено: 1

Отвечает: Boriss
Здравствуйте, valix!
По-моему, некорректный вопрос - не ясно, что именно Вас интересует, и что не понравилось.
А так: http://www.ndis.com/ - это то, что надо?
Ответ отправил: Boriss (статус: Профессор)
Отправлен: 07.03.2005, 13:09


Вопрос № 17918
привет!
чем можно дизасмить проги написаные на visual c++(7.0) .net? или - прога peid показывает что чат "vypress chat" защищена Microsoft Visual C++ 7.0 [Overlay] - чем можно ее дизасмить?
Отправлен: 06.03.2005, 22:39
Вопрос задал: valix (статус: Посетитель)
Всего ответов отправлено: 2

Отвечает: John Freeman
Здравствуйте, valix!
Это ~ ничем или неизвестный/авторский как правило простейший пакер (IMHO PEid sucks , особенно на малоизвестном), так что запихни в дебаггер и смотри!!!
+может новый ASProtect опять маскируется(раньше под ASPack маскировался), но скорее всего это Armadillo и, как говорится, you sucks за компанию с PEID.
Ответ отправил: John Freeman (статус: Специалист)
Отправлен: 06.03.2005, 23:08

Отвечает: AxMAD
Здравствуйте, valix!
Можно спомощью IDA Pro c www.datarescue.com
Ответ отправил: AxMAD (статус: Студент)
Отправлен: 07.03.2005, 09:41


Вопрос № 17932
Здравствуйте всем!
Изучаю 23-ий выпуск рассылки "Ассемблер-это просто" касаемо перехвата прерываний вызываемых клавиатурой.
Возникает очень много вопросов.На часть из них - сам нашел ответы (если правильно-то подтвердите). А на часть - может кто подскажет?
1)зачем придумали Скан-коды?(мой ответ-это для совместимости разных типов клавиатур) но тогда выходит,что для разных клавиатур- разные таблицы соответствий Скан-кодов ASCII-кодам в BIOS ? Т.е если я поставлю другую клавиатуру (от другого производителя) то драйвер на нее будет менять данные в BIOS?
2)Где (в памяти) находится таблица соответствий Скан-кодов ASCII кодам?)
Можно ли ее посмотреть?
3)Где можно найти хорошее описание как в Windows 2000 Pro работает эмулятор DOS ? (это мне обьяснили, что работая в командной строке Windows с DOS -овскими командами - я работаю в эмуляторе DOS). Т.е. я не могу понять - при работе в Windows при нажатии клавиш вызывается то же самое прерывание- int 9h или как показано в DeviceManagerResources - int 1. Или когда загружен DOS, то прерывания BIOS выполняют одни функции, а когда Windows -другие ?
Заранее благодарен всем кто уделит внимание.
Отправлен: 07.03.2005, 05:28
Вопрос задал: Slava_ (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: Евгений Иванов
1.скан коды - это просто соответствие каждой клавиши своего номера.
все эти коды идут через порт 96 от клавиатуры при поступлении прерывания.
2. таблица соответствий скан-кодов в ASCII-значения есть.
доступ к ней можно осуществлять с помощью функции, которая всё сделает сама.
функция 4Fh 15h-го прерывания.
Удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 07.03.2005, 21:29
Оценка за ответ: 5

Отвечает: Стас
Здравствуйте, Slava_!
Черт его знает зачем они эти сканы придумали. Тогда клавиш было всего около 84 (чтоли), сейчас в основном 102. Если считать что для каждой клавиши нужно два кода - "нажали" и "отпустили" то 204 кода. Зачем было огород городить непонятно. Верояно были какие то проблемы железо деятелей или "заботились" о будущем? У кого какие мысли?
>эмулятор DOS
Для совместимости со старыми прогами это "эмулятор" сделан. А значит при нажатии клавиши срабатывает int9. Более того int9 срабатывает и в Win32 и в Unix (вероятно) - это аппаратное прерывание. Обрабатывается BIOS.
Другое дело что конечно же винды не дадут тебе настоящий int9, а его "эмуляцию".
Другие Int как биоса так и DOS эмулируются полностью, иначе какой смысл в эмуляции?
А вообщем это только мои "размышлизмы".
Ответ отправил: Стас (статус: Практикант)
Отправлен: 08.03.2005, 01:52
Оценка за ответ: 4

Отвечает: Voituk Alexander
Здравствуйте, Slava_!
Скан-коды - это жестко регламентированные Мелкософтом цифири. И производители клав не могут их менять. Но это скан-коды только основных клавиш. А всякие мультимедийные отданы нв откуп производительм. Поэтому никакой таблицы соответствия нет. Можешь на сайте Мелкософта скачать документ со скан-кодами.
А по поводу прерываний, то под ДОСом прерывания отличаются от Виндовозных. Для ДОС существует только одна таблица векторов прерываний, и находится она в начале памяти. Для Винды в защищенном режиме может быть много таблиц. Когда ты запускаешь ДОС под Виндой, то Винда эмулирует ДОСовскую таблицу.
Ответ отправил: Voituk Alexander (статус: 3-ий класс)
Отправлен: 09.03.2005, 14:53
Оценка за ответ: 5


Вопрос № 17939
доброго времени суток, уважаемые
встала передо мной задача: написать как можно меньшую программу, которая использовала бы WinAPI
для WinAPI необходимы несколько библиотек, но зачем инклудить весь файл если мне нужен заголовок одной-трех функций?
с файлом .inc эта проблема решается просто - копи/пейст
SendMessageA PROTO :DWORD,:DWORD,:DWORD,:DWORD
вопрос. можно ли вытянуть аналогично данные из файла .lib?
или както описать, зная в какой dll есть нужная функция?
Отправлен: 07.03.2005, 12:46
Вопрос задал: r00fless (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: Dark_Lord
Здравствуйте, r00fless!
Мне кажется, что вы немного недопонимаете то, отчего зависит размер скомпилированной программы. Дело в том, что размер скомпилированной программы не зависит от размера .inc и .lib файлов. При компиляции компановщик вкладывает в .exe файл (а вернее в PE его часть) несколько секций, в которые входят секции кода, данных, ... и таблица импорта. Именно для её создания используются .inc и .lib файлы. При этом в них объявляются лишь существующие функции, а используемые (и попадающие в таблицу импорта) компановщик выбирает сам. Если вы хотите получить программу наименьшего размера, думаю имеет смысл изучить структуру PE-файлов, и попытаться не использовать компановщик, а написать всю программу (в смысле не только код и данные, но и все структуры запускаемогофайла PE) самому и использовать не компилятор/компановщик, а транслятор (асм => код) типа Fasm-а.
Ответ отправил: Dark_Lord (статус: Профессионал)
Отправлен: 07.03.2005, 13:27
Оценка за ответ: 5

Отвечает: Bob Johnson
Здравствуйте, r00fless!
Дело в том, что в твою прогу попадут только те функции, которые ты используешь, а не весь lib файл, так что вырезать что-либо смысла не имеет. Чтобы уменьшить программу ты можешь:
1. Объединить секции кода и данных
2. Убрать релокационную информацию (тогда твоя программа будет работать только по одному адресу, например, 0х400000, но обычно это не критично)
3. Удалить MS-DOS stub.
В общем, если тебе нужна минимальная программа - разбирайся с форматом PE и "пиши" его вручную.

* EMan2.0: ---===*** Debug mode ***===---

Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 07.03.2005, 20:04

Отвечает: Евгений Иванов
во первых, размер программы зависит от того, какие ты будешь использовать подпрограммы. в winapi они все внешние, так что проблем с размером не будет.
во вторых, могу такую программу сделать, которая бы делала такие файлы ;)
то есть, есть как бы база данных. эта программа-помощник проходила бы исходники и находила бы вызовы подпрограмм - и создавала бы файл, в который заносила только те описания и определения, которые именно использует твоя программа.
вообще-то программа ASMH уже работает, я её постоянно использую.
Она ищет в листинге "Call ИМЯ" и выдает на выходе "extrn ИМЯ:proc"
Совсем недавно добавил, чтобы выводил "global ИМЯ:near".
я сам лично не использую PROTO подпрограмм, потому что часто заношу значения входящих параметром в стек сам, как мне удобно, чем добиваюсь удобства и повышения скорости.
например:
push FALSE eax ;+1, +2
mov [(t SCROLLINFO ebx).nPos], eax
mov [(t SCROLLINFO ebx).fMask], SIF_POS
Call GetDlgItem, [@@hDlg], icSB_ZoomLevel
Call SetScrollInfo, eax, SB_CTL, ebx, TRUE
Call SetDlgItemInt, [@@hDlg], icS_ZoomLevel ;-2, -1

обрати внимание на комментарии - +1, +2
это значит, что для подпрограммы SetDlgItemInt есть два параметра, которые я занёс ранее. а если бы этого не сделал, то регистр EAX изменился бы вызовом других подпрограмм. Или мне пришлось бы делать запись-чтение памяти, что медленно.
так что в этом смысле Ассемблер мощнее языков высокого уровня, потому что я могу делать то, что хочу и как хочу.
Удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 07.03.2005, 21:21
Оценка за ответ: 5


Вопрос № 17941
Добрый день. Читаю 13 выпуск. Новый оператор movs. И часть программы
........
mov cx,10
mov si,offset str1 //откуда будем брать
mov di,offset str2// куда будем копировать
rep movsb //str1=str2 //может это опечатка, может str2=str1
........
str1 db '0123456789' //почему в этих строках
str2 db '9876543210' //нет знака $
Я бы хотел посмотреть как это работает в отладчике. Но в отладчике просматриваются только регистры. Можно ли просматривать переменные, если да, то как ( у меня AFDpro). Если нельзя, то преведите пожалуйста код программы, кот. можно было бы добавить, чтобы просмотреть содержимое этих переменных на экране (распечатать).
Отправлен: 07.03.2005, 13:01
Вопрос задал: psevdo (статус: 1-ый класс)
Всего ответов отправлено: 6

Отвечает: Boriss
Здравствуйте, psevdo!
Почти не опечатка. Комментарий начинается не с // (как в С), а точки с запятой
И действително, эта СТРОКА копирует одну строку в другую . Показывать, как догадываюсь не собираемся - можно и без $.
Просто в СХ записали, сколько байт копировать
Посмотреть в отладчике: нужно смотреть дамп памяти - то есть, посморите, где str2 - по адресу и "глядите" туды
AFD сейчас не помню - есть и у него команда для этого. Если надо, распакую документацию и погляжу
А выводть можно функцией 40Н прерывания 21Н:
АН - 40h
BX - 1 (а так handler - можно и в файл. 1 - стандартное устройство вывода = экран)
DS:DX - адрес строки
CX - сколько байт выводить
Ответ отправил: Boriss (статус: Профессор)
Отправлен: 07.03.2005, 13:36

Отвечает: Котиев Зураб
Здравствуйте, psevdo!
//str1=str2 //может это опечатка, может str2=str1
разницы нет они все равно будут равны друг другу.
Знак $ нужен лишь обработчику 9 прерывания int21h, для указания конца строки .Для movs он не нужен.В данном случае префикс rep по значению указанному в регистре cx
определяет сколько байт нужно переслать.
Насчет AFDpro точно не помню (давно дело было) но там вроде должно быть окно данных
там по смещениям и смотри.А вообще лучше пользуйся Turbo Debugger от Borland.
Ответ отправил: Котиев Зураб (статус: 2-ой класс)
Отправлен: 07.03.2005, 16:33

Отвечает: Евгений Иванов
Здравствуйте, psevdo!
movs копирует из DS:SI по ES:DI.
полный синтаксис:
MOVS source_string,destination_string

Logic [ES:eDI] <- [DS:eSI]
if DF = 0
eSI <- eSI + n ; n = 1 for byte, 2 for word,
eDI <- eDI + n ; 4 for dword (386+)
else
eSI <- eSI - n
eDI <- eDI - n
endif

Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 07.03.2005, 22:12

Отвечает: Стас
Здравствуйте, psevdo!
Тут много чего написали, а по сути ты прав действительно в di(str2) копируется из si(str1), только это не DOS, а ассемблер, а в ассеблере нет '$'. Либо ты сам ищешь конец строки (какой придумаешь - обычно 0 или тотже $), либо по количеству символов, как в данном случае в CX.
Ответ отправил: Стас (статус: Практикант)
Отправлен: 08.03.2005, 00:33

Отвечает: Dark_Lord
Здравствуйте, psevdo!
1) в коментариях к rep movsb скорее всего опечатка, строка из si копируется в буфер по адресу в di.
2) Знак "$" как завершитель строки, был прибуман в дос и только для дос функций. Его, конечно можно использовать и во всех других случаях, но не обязательно. В данном случае длинну строки определяет занесённое в cx значения, здесь 10.
3)в AFDPro есть два окна данных, чтоб просматреть значение переменной/строки в памяти нужно узнать адрес этой строки и установить адрес одно из этих окон на этот адрес, тогда в нич будет показываться то, что нужно вам.
Ответ отправил: Dark_Lord (статус: Профессионал)
Отправлен: 08.03.2005, 10:19

Отвечает: Voituk Alexander
Здравствуйте, psevdo!
По поводу первого вопроса - какая разница str1=str2 или str2=str1?
А знак $ нужен только для вывода строки на экран ДОСовской функцией. Это же ассемблер, здесь нет никаких правил по объявлению строк.
В отладчике ты не посмотришь переменные. Для этого нужно смотреть память, где они располагаются. Как у тебя - такого отладчика не знаю. Но для изучения ассемблера лучше пользовать Borland Turbo Debugger.
Ответ отправил: Voituk Alexander (статус: 3-ий класс)
Отправлен: 09.03.2005, 14:27


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

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

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.faq
Отписаться

В избранное