Интересная статья, обсуждая за и против использования итераторов:
Одно из моих любимых хобби - обратная инженерия.
Это требует глубоких знаний сборки и использования дизассемблеров / отладчиков для просмотра скомпилированного кода. Это позволяет вам изменять, понимать и реверсировать скомпилированные программы. Каждая новая программа похожа на головоломку, ожидающую решения!
Например, многие люди обращаются вспять игры, такие как «Сапер», когда только начинают.
Вот скриншот ключевого раздела кода в Minesweeper, который я недавно отменил (комментарии справа):
Это было обнаружено путем установки точки останова на вызовы функции rand ()
и перехода назад в стеке вызовов. После некоторого раскопок становится очевидно, что:
С этими знаниями становится легко определить местоположение любого данный мой на минном поле:
cellAddress = mapBaseAddress + (32 * (y+1)) + (x+1);
Затем, с помощью простого цикла и нескольких вызовов ReadProcessMemory ()
, у вас есть идеальный прием для Minesweeper!
Чтение рукописной сборки намного проще, чем читающая машинная сборка. Современные компиляторы делают с кодом некоторые волшебные и сумасшедшие вещи для оптимизации, за которыми иногда бывает трудно следить. Так что это определенно подтолкнет ваши знания в области сборки!
Существует множество действий, которые могут быть ответвлены от этого:
И еще!
Если вам интересно, я настоятельно рекомендую книгу: Reversing: Secrets of Reverse Engineering
Вы можете узнать, как ОС работает на низком уровне (прерывания, виртуальная память и так далее). Сначала напишите загрузчик, который предоставит вам полный доступ к оборудованию, затем вы сможете начать играть в защищенном режиме, программировать VGA и т. Д.
Два хороших ресурса:
http://wiki.osdev.org/Main_Page
http://www.osdever.net/FreeVGA/home.htm
[Edit]
Если вы хотите узнать об оптимизации, посетите сайт Agner Fog: http://agner.org/optimize/ .
[Edit]
Скопировано из комментария Simucal:
Вы также можете добавить ссылку на MikeOS. Это небольшая операционная система, написанная на ассемблере, которая разработана как средство обучения, чтобы увидеть, как работают простые операционные системы. Код и документация хорошо прокомментированы: http://mikeos.berlios.de
Это может показаться очень банальным, но вы можете попытаться ответить на некоторые вопросы на projectueler , используя ассемблер.
Сегодня ассемблер используется в следующих областях:
Оптимизация. Узнайте, как использовать Intel VTune, если вы программируете в Windows. Здесь вы можете увидеть свои узкие места. Затем перепишите эти подпрограммы на ассемблере.
Поскольку большинство современного программного обеспечения все время изменяется, это скорее интеллектуальное упражнение и самоудовлетворение, заставляющее что-то работать быстрее, чем польза в реальном мире.
Есть один или два человека, которые переписали многие из них. основные примитивы C, memcpy, memset и т. д. в ассемблере, адаптированные для ЦП во время выполнения. Таким образом, код больше, поскольку в нем есть дополнительные процедуры для использования преимуществ расширений ЦП, SSE и т. Д., Но быстрее. Эти примитивы C часто оказываются во многих пакетах .dll, поскольку большинство программ постоянно загружают память.
В зависимости от того, насколько хорошо вы выучили сборку, вы можете попробовать написать прошивку для небольших микропроцессоров или даже для небольших устройств, подключенных к вашему компьютеру. Вы также можете попробовать писать полные программные приложения на ассемблере и дать им красивый графический интерфейс.
В общем, по моему опыту, ассемблер не так полезен при программировании крупных программных проектов, потому что для многих приложений скорость не действительно имеет значение (по крайней мере, во времена многоядерных процессоров), поэтому ваши возможности несколько ограничены.
Вы можете найти робота или контроллер, который может подключаться к вашему параллельному порту, и написать несколько классных обработчиков клавиш для управления ими. Вы также можете перехватывать вызовы BIOS, такие как Int13 для диска, и написать некоторые инструменты зеркалирования дисков, драйверы RAID и т. Д. Вы можете подключить некоторые преобразователи, такие как температура / вибрация / давление и т.д., и выполнить сбор данных.
Вы можете взглянуть на проект liboil:
http://liboil.freedesktop.org/wiki/
Это библиотека для высоко оптимизированных внутренних циклов.
Большинство циклов уже реализованы на ассемблере x86, но еще остались некоторые циклы, которые нужно переписать.
Я полагаю, вы могли бы попробовать code-golf
Также есть по крайней мере одна ОС, написанная для ПК в сборке: MenuetOS . (Я понятия не имею, почему.) Они могут захотеть внести свой вклад.
Я понимаю, что до изобретения C в начале 1970-х большинство операционных систем были написаны на прямом ассемблере. Я бы не рекомендовал это делать, но вы можете написать отдельную программу просто для удовольствия. Обратите внимание, что ЦП запускается в 16-битном режиме, и довольно сложно заставить его переключиться на 32-битный. Вероятно, лучше всего просто написать автономную программу на 16-битной x86. Вы можете использовать симулятор для разработки.
По крайней мере, теперь вы можете выводить ассемблер из gcc следующим образом:
gcc -c -S test.c -o test.asm
Затем вы можете проверить вывод сгенерированный код C для образовательных целей.
Если вы уже являетесь разработчиком на языке программирования более высокого уровня, язык ассемблера позволяет вам создавать оптимизированные подпрограммы / функции. Я не знаю, как другие, но Delphi, например, позволяет вам идеально интегрировать ассемблерный код в любой модуль, а также заботится о параметрах функций и т. Д.