| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Религиозные войны > СТОИТ ЛИ ПАРИТЬСЯ ? |
| Автор: Kaskad 1.10.2004, 11:54 |
| Вопрос. Стоит ли изучать Assembler? То говорят, что это полная ерунда, мол, устарел и т.п. Иногда читаешь... Да это самый крутой язык, любимец хакеров... Говорят, что Assembler УСТАРЕЛ И НЕ НУЖЕН. Кому верить? Добавлено @ 11:56 Ещё, какие возможностипредоставляет ASSEMBLER кроме взаимодействия с аппаратурой? |
| Автор: maxim1000 1.10.2004, 11:57 | ||
| ответ можно получить, если подумать, что и под что хочется программировать если писать интерфейсы к базам данных, к примеру, то, конечно. не стоит а если писать встроенное программное обеспечение для узкоспециализированных устройств - без ассемблера не обойтись это, конечно, два крайних случая, но вообще все зависит от задач Добавлено @ 12:00
ассемблер позволяет напрямую использовать процессор бОльшая часть (если не вся) его ресурсов доступно и из языков высокого уровня, ассемблер часто используют для ускорения чего-либо |
| Автор: cardinal 1.10.2004, 12:37 | ||
| Ну к словам maxim1000 осталось добавить только одно прикольное сравнение ассемблера с С/C++, которое я где-то вычитал. С/C++: пробежать сто метров после выстрела. Ассемблер: дышать спокойно ждать выстрел сделал толчок label: дышать делать шаг шаг счетчик = шаг счетчик + 1 jump label, if шаг счетчик < 100 И это все дает понять, что если во втором случае спортсмен будет бежать сто метров не тратя ни на что время (потому, что ты ему все рассказал как делать), то в первом он может через 50 метров остановиться и отдохнуть Ну и в конце:
Да. |
| Автор: Akina 1.10.2004, 12:38 |
| Изучать? Основы - непременно. По крайней мере будешь знать как работает компьютер "изнутри" - кодеру это более чем полезно независимо от того что и на чем он кодит. А остальное - see above. |
| Автор: Chingachguk 1.10.2004, 14:20 | ||||||
Не. Все немного не так С/C++
Ассемблер
|
| Автор: -=::BlackCat::=- 1.10.2004, 19:30 | ||
5 баллов, есть над чем задуматся |
| Автор: cardinal 1.10.2004, 21:10 |
| Chingachguk Думаю не всем смогут понять написанное -=::BlackCat::=- Ага... |
| Автор: Ruterian 8.10.2004, 10:52 | ||
К сожалению, уже и для микропроцессорных систем, таких как мобильные телефоны, винчестеры, mp3 плейеры итп. фирмварь пишется на СИ (в коде есть логотип компилятора). |
| Автор: maxim1000 8.10.2004, 11:00 | ||
я не говорю, что ВСЕ программное обеспечение пишется на ассемблере но учитывая частый дефицит ресурсов в таких устройствах приходится использовать ассемблер, например, для ускорения некоторых частей алгоритма специализированные процессоры имею настолько сложные команды, что компилятор, скорее всего не сможет оптимизировать код с их использованием (или придется немного расширять C) |
| Автор: Улисс 8.10.2004, 21:51 |
| Chingachguk, какой-то странный у тебя C\C++, да и ассемблер тоже. ИМХО, ассемблер надо учить хотя бы ради удовольствия! Нет ничего прикольнее и интереснее программирования на ассемблере... Вообще, творятся странные вещи! Вырастает новое поколение программеров, взращенных и извращенных VCL-ом, VB и прочими RAD-средствами... Неужели когда-нибудь случится старый анекдот про COBOL-программиста и y2k? |
| Автор: Kurt 9.10.2004, 01:12 |
| to Улисс Хе, да ведь нужда заставляет! Когда тебе говорят, сделай-ка вот это и то как можно быстрее (имеется ввиду время разработки) - тут уже не до ASM'a. З.Ы. Хотя я за асм обоими руками и ногами. Тока нормальной работы с ним пока не найду. |
| Автор: Улисс 9.10.2004, 09:11 |
| Kurt, я сам сейчас два проекта пишу, один на Delphi, другой -- на C++ Builder... А насчет нормальной работы -- ты плохо ищешь, спецов с хорошим уровнем знания C\C++ и ассемблера отрывают с руками, они (т.е. мы |
| Автор: Улисс 9.10.2004, 17:32 |
| Но безграмотность относительно ассемблера -- не самое страшное... Я уверен, что 9 дельфистов из 10 не отличат сортирвку пузырьком от сортировки Хоара! Насчет VB-программистов и говорить страшно. Или смешно... |
| Автор: cardinal 9.10.2004, 23:23 | ||||
Не приобобщай А во-вторых я знаю (не лично) достаточно много примеров "VB-программистов", как ты их называешь, которые такие вещи пишут, посмотрев на которые я думаю ты перестанешь смеятся и изменишь свое мнение.
А все алгоритмы знать нельзя. А если интересует именно сортировка, то смотришь на сравнения этих алгоритмов (особенно классно если есть графики) и выбираешь самый подходящий. |
| Автор: chipset 10.10.2004, 00:47 |
| Chingachguk Не пойму где ты там увидел С++... Я например не очень понимаю зачем учить АСМ если есть Си С++. И быстрее разрабатать и работает не намного медленее ИММХО. А то что программер не может сделать быстрый код на С++, дело не в С++ а кривизне рук программиста. А ООП у асма есть? Вот и я о чем.. |
| Автор: krid24 10.10.2004, 03:47 | ||
ООП - просто еще один уровень абстрагирования. Такая же надстройка над ЯВУ, как ЯВУ - надстройка над asm. А основа - это asm. А профессионал должен знать основы. Так что Kaskad, делай выводы. |
| Автор: Chingachguk 10.10.2004, 09:27 | ||
Есть. Есть такая книга Тома Свана - в ней подробно рассказывается, как писать на асме с использованием объектов. Этот Том Сван о чем только не писал. Кажется, что-то есть на эту тему на wasm.ru. А по поводу моего поста C++ vs ASM - это был ответный наезд |
| Автор: cardinal 10.10.2004, 13:13 | ||||
А ты в asm листинги посмотри, которые тебе копилятор может сделать и поймешь.
Chingachguk, ну ты даешь... Может ты еще раз прочитаешь то, что я написал? Я говорил о том, что ты не знаешь, что из написанного делает компилятор C/C++. Где я писал о размере программы? |
| Автор: Chingachguk 10.10.2004, 15:09 | ||||
Или я не так понял что-то ? |
| Автор: cardinal 10.10.2004, 17:04 | ||
|
| Автор: chipset 10.10.2004, 17:26 | ||||
И что? АСМ как АСМ.... Я всецело доверяю оптимизирущему компилятору. Мы помойму где то спорили C++ vs ASM, никто не помнит чем соревнование закончилось и закончилось ли вообще? Добавлено @ 17:27
Ты уверен что это удобно, писать на асме с использованием обьектов? И соблюдаются все три основы? Добавлено @ 17:28 Давайте перенесем это в Религиозные войны |
| Автор: Chingachguk 10.10.2004, 20:47 | ||||
| cardinal Я это тоже читал. Все равно мне не нравится такого рода сравнения, даже в виде шутки... Этой идее преподносить HLL vs asm в виде там понятнее - но медленне, а там - непонятнее, но иногда лучше - лет десять с лишним... Вряд ли тот, кто серьезно писал на асм, согласится с этим.
Я не знаю, удобно это или нет, я даже не знаю толком ни одной из этих основ. Я просто видел это в виде конечного результата - в виде машинных кодов - это ужас.
А что спорить - слова тратить ? Все равно никто не изменит свою точку зрения. Я уж точно не поменяю, пока мои оппоненты не попробуют написать что-нибудь более десяти строк на асме. Я ведь писал на HLL много и пробовал т.е. предмет спора с двух сторон. Имеет смысл соревнование типа "кто круче прогу напишет" - проводил было oleg1973 такое - да что-то подсдулись вроде все "адепты языков высокого уровня". |
| Автор: maxim1000 10.10.2004, 21:15 | ||
если писать приложения под Windows c интерфейсом и прочим - я тоже с удовольствием доверюсь компилятору однако, грамотное переписывание на ассемблер специализированного процессора функции, ему подходящей, можно добиться ускорения в десятки раз все дело в том, что C разработан как универсальный язык, в нем нет, например оператора скалярного произведения двух векторов (ну очень часто встречается при обработке аудио и видео), а в специализированных процессорах на каждую итерацию можно вообще тратить по одному такту на шаг цикла, что в C достичь довольно-таки сложно |
| Автор: Chingachguk 10.10.2004, 21:24 | ||||
Читал про какой-то компиллер (кажется, что-то типа C от MS). Так там был такой прикол:
Так вот, оптимизирующий компиллятор удалял последнее действие в этой функции ;) |
| Автор: cardinal 10.10.2004, 21:26 | ||||
Да, но именно это там было написано, а не то, что что-то компактней написано, а что-то нет...
У меня есть одна процедурка, которая делает из 24 битного bmp 1 битный (пример ниже) так она размером в 1200 строк. Я не могу сейчас сказать точно, но я переписав изначальный вариант в 100 строк написанный на Си, ускорил эту процедурку раз в 100. Может будешь меня за достойного оппонента считать? p.s. Сейчас придут девушки и скажут: "Ну вот, опять %:№ сравнивать начали." |
| Автор: Chingachguk 10.10.2004, 21:35 | ||||
Где ?
Ну так это прекрасно ! Что ж ты такие шаблонные сравнения делаешь ? ;) Неужели достигнув такого результата (100 раз по твои словам !) ты не оценил мощи асма ? ВСЕМ: не обижайтесь, парни ! Добавлено @ 21:37 А, у меня сразу картинка не загрузилась |
| Автор: cardinal 11.10.2004, 10:03 | ||||
Ты хочешь, чтобы я сюда исходник выкинул?
Конечно оценил |
| Автор: Chingachguk 11.10.2004, 10:15 | ||
Ну объясни тогда, что делает мой вариант ассемблера про "бегуна на 100 метров", который тебе не понравился ;) |
| Автор: cardinal 11.10.2004, 19:04 | ||||||
А это я где сказал?
Ну попробую
|
| Автор: Chingachguk 12.10.2004, 08:33 | ||
Не, смотри:
Таким образом, это - самокопирующийся код, который будет выполняться следующим образом: пока счетчик (edx) не равен 0, он будет копировать себя далее по коду и опять выполняться. Естественно, внутри него можно разместить любую полезную нагрузку. Команды: call @@GetCurrentOffset @@GetCurrentOffset: pop ebx Предназначены для вычисления текущего смещения кода, поскольку он не фиксирован в памяти. Это так называмое "дельта-смещение", а такой код называется "базонезависимым" - он может выполянться в любом месте памяти без предварительной настройки. Используется в практически любой современной защите, вирусах, в коде загрузчика (MBR, BOOT сектора). |
| Автор: Akina 12.10.2004, 09:42 | ||||
ну т.к. для ХТ 32-битных операндов не существует, то вероятно
|
| Автор: cardinal 12.10.2004, 09:50 | ||
Что-то прикольное, надо будет поиграться с этим, чтобы получше понять смысл Я вот только одно не понимаю. ret же берет то, что лежит наверху стека или нет? А если мы делаем pop, то там уже ничего лежать не будет. Спрашивается - куда мы вернемся? |
| Автор: Girder 12.10.2004, 10:11 | ||
| cardinal стандартная фичка для получения регистра EIP(особенно полезен для кодов выполняемых в стеках, полиморфных программ и т.п. - то есть текущее расположение кода в памяти не известно, а знать хочется Смотри: при Call в стек заносится адресс возврата. При pop стек освобождается и адресс возврата помещается в данном случаии в ebx Для лудшего понимания:
Удачи. |
| Автор: Girder 12.10.2004, 10:46 | ||||
| Глянул предыдущию страницу... оказывается Chingachguk уже тебе это расписал... Единственно где он ошибся, это здесь:
Удачи. |
| Автор: cardinal 12.10.2004, 14:19 | ||||||
Girder, вот теперь я допер, спасибо...
Я тоже самое делал проще... Приду домой гляну и напишу как, но что-то там с offset'ом. Операции call, pop не особо быстро выполняются и поэтому я тогда такой вариант не рассматривал.
А в MS Visual C++, такая вставка у меня не прокатила... Chingachguk, а зачем тут такие навороты с самокопирующимся кодом, когда ведь можно цикл сделать? |
| Автор: Akina 12.10.2004, 14:59 | ||
|
| Автор: cardinal 12.10.2004, 18:43 | ||
Я делал так:
Никаких call и pop и соответственно намного быстрее работает... |
| Автор: Kaskad 13.10.2004, 16:59 |
| Люди. А как вирсы писать на асме? Очень уж хочется пошкодничать а ещё слышал, что АСМ-любимый язык хакеров! Это правда? |
| Автор: cardinal 13.10.2004, 19:11 | ||
http://forum.vingrad.ru/index.php?act=SR&f=27 Такое на форуме не обсуждать запрещено! |
| Автор: Chingachguk 14.10.2004, 08:33 | ||||||
То, что ты привел - не самокопирующийся код.
wasm.ru, раздел статей про вирусы. Сайт Z0mbie. VX-ORG.ua. etc.
Насчет "любимый" не обязательно, некоторые любят C. Дело в том, что хакер хочет знать, что происходит на самом деле, а на самом деле выполняются машинные инструкции. |
| Автор: cardinal 14.10.2004, 09:47 | ||
Я же про "дельта-смещение" говорил... |
| Автор: Chingachguk 14.10.2004, 10:12 |
| cardinal А при чем тут дельта-смещение ? Просто offset-ом ты не получишь, где в данный момент выполняется твой код,. |
| Автор: cardinal 14.10.2004, 14:29 | ||||
Может я на ручнике (что я пока не исключаю
|
| Автор: Chingachguk 14.10.2004, 14:38 | ||
Это КОНСТАНТА. В edi помещается константа. В случае call+pop помещается ~ТЕКУЩЕЕ значение EIP. |
| Автор: cardinal 14.10.2004, 14:48 |
| Вот теперь начинает допирать потихоньку, но вот Chingachguk что я еще не понимаю: Если ты где то написал call, то в stack попадет eip в момент call. Это так? |
| Автор: Chingachguk 14.10.2004, 14:57 |
| Нет. В стек попадает тот адрес, куда нужно вернуться после выполнения подпрограммы - команда, следующая за call. |
| Автор: cardinal 14.10.2004, 15:04 | ||
Я это и имел в виду... Так вот вопрос: константа, не константа... В чем преимущество? Что можно сделать с call, что нельзя сделать так как я сделал? |
| Автор: Chingachguk 14.10.2004, 16:00 |
| БЛИН ! Представь себе, что твой код выполняется в ПРОИЗВОЛЬНОЙ области памяти. Ты не можешь привязываться к тому, что программа начала выполнение с такого-то адреса и т.п. |
| Автор: Girder 14.10.2004, 21:44 | ||||
| Chingachguk не кипятись, тут надо на примере... cardinal к примеру возмем какую-нить функцию(и твой случай
Т.в. к примеру тебе потребовалось размножить этот счетчик, т.е. несколько счетчиков под разные задачи... под каждую задачу свой уникальный счетчик! Память выделяется динамически... к примеру под второй выделение по адрессу: 8130h Т.о. второй код будет выглядит так: :
Итог: без корекции адресов и та и другая(и т.д.) будут всегда изменять значение по адрессу 000Eh(работать с этим адрессом) - т.е. счетчики не уникальные и в принципи все копии счетчика не нужны. PS: А теперь представь что вторая копия вообще нужно забросить в другой процесс! А когда ты будеш писать независящий код от его место выполнения, то... .... далее сам |
| Автор: cardinal 15.10.2004, 00:42 |
| Girder, спасибо... Ладно. Понял я. Но вот кто мне объяснит: зачем такие вещи писать на асме? Я то думал о том, что речь идет о том, что мы хотим "прыгнуть" по определеннуму адресу в программе и все. Для этого можно хоть так, хоть так поступить. Я даже не думал о динамическом выделении памяти, не о самокопирующимся коде и т.д. Для этого помоему можно с таким же успехом использовать Си. Для меня asm является возможностью ускорить процесс, а push, pop и похожее я стараюсь не использовать вообще (пока такое возможно конечно), т.к. тут я проигрываю (тому же компилятору Си)... Динамическое выделение памяти и ассемблер вместе я пока не разу не использовал, а тем более влезание в другие процессы... Не было необходимости. Я занимался пока больше embedded systems, а там каждый чих может дорого обойтись. Вместо динамического выделения памяти гораздо лучше бывает просто сделать буффер побольше и им пользоваться, а о нескольких процессах и речи быть иногда не может. Переключение между ними занимает слишком долго... Chingachguk, вообще это интересный ход (в котором я не вижу пока никакого преимущества в сравнении с другими языками; то есть не вижу возможности исплоьзовать), с которым я еще с удовольствием на практике поиграюсь. Спасибо за терпение. Не обижайся! Если честно я твои сообщения всегда с интересом читаю... Прославился ты своими уроками у нас на форуме |
| Автор: Girder 15.10.2004, 09:03 | ||
Ну а для чего это нужно: 1)Защита (в том числе разпакеры 2)Обход защиты (когда ни зя, а очень хочется 3)Атака (Имхо: 2 и 3 за частую одно и тоже); 4)Показать себя |
| Автор: cardinal 15.10.2004, 09:49 | ||
Я не очень понял. То есть если сделать как я и перебросить процедуры в другое место в памяти, то они перестанут работать? Ты о том, что значение регистра может уползти? |
| Автор: oleg1973 15.10.2004, 10:42 | ||
| в некоторых случаях асм незаменим к примеру для борьбы с отладкой простой и всем известный пример для дебугеров пользовательского уровня работающих на int3
всем известно что данные трасировшики втыкают int3 после обрабатываемой команды, в данном случае после mov al,[met] там у нас стоит NOP (код 0х90) ну а далше делаем проверку и все такое |
| Автор: Girder 15.10.2004, 10:56 | ||||
Не совсем... Смотри к примеру пример oleg1973 - в твоем случаи при переносе кода и передачи управления в новое место AL=90h, т.е. защита не сработает |
| Автор: oleg1973 15.10.2004, 21:24 | ||
Girder
|
| Автор: Girder 15.10.2004, 22:50 |
| oleg1973 кто б спорил... Как раз именно это и пытаемся объяснить cardinal-у. О преимуществах и областях применения подобного кода(что ты привел выше) и ассемблера по сравнению с языками высокого уровня |
| Автор: bagira 16.10.2004, 00:25 |
| |
| Автор: Chingachguk 16.10.2004, 12:03 | ||
1. Я не обижался ;) 2. Преимущества тебе объяснили ! Есть задачи, в которых без таких трюков тяжеловато; я бы еще упомянул "полезные" приложения типа монитра реестровых функций, сетевого обмена, антивирусы всякие - почитай, как делается перехват апи-функций и т.п., еще бы я про анализ аварийных дампов добавил. Или вот еще: на васме.ru недавно человек пост сделал: так он с целью повышения быстродействия на ходу перестраивает выполнимый код наиболее оптимальным способом. |
| Автор: oleg1973 16.10.2004, 16:36 |
| Chingachguk не вполне по "правилам" на лету код перестраивать код должен быть лехкочитаемым последний раз я такое на z80 делал |
| Автор: Chingachguk 17.10.2004, 00:19 | ||
oleg1973
Для асма ;) |
| Автор: Се ля ви 25.10.2004, 20:21 |
| IMHO, основная функция ASM`а в наше время - это низкоуровневая отладка откомпилёного кода и асемблерные вставки в программах для убыстрения работы всяких циклов и рекурсии, связанных с вычислениями... А писать на асме сложные современные приложения - рехнёшься, к тому же никаких сроков не хватит! |
| Автор: .RADIX 2.11.2004, 22:51 |
| Асм ещё долго не сойдёт со сцены. |
| Автор: bagira 20.11.2004, 20:30 | ||||
А также - работа с железом напрямую. Эта область довольно узкая, но еще долго будет нужна.
Да, ассемблер не для этого предназначен. |
| Автор: chipset 27.11.2004, 19:07 | ||
Есть такая вещь как http://www.microsoft.com/whdc/DevTools/ddk/default.mspx Добавлено @ 19:08 А из LPT порта вообще можно при помощи бэйсика элементарно читать.. |
| Автор: bagira 31.12.2004, 00:01 | ||
Да, но я со стандартными портами не работаю. |
| Автор: Medved 31.12.2004, 01:26 |
| Интересная дисскусия. |