Сам я в дешифровании не разбираюсь (может потому, что нет в этом нужды, поэтому и не изучал усиленно, а посмотрев в книге бегло, особо не разобрался), однако могу порекоммендовать книгу, где написан материал о дешифровании.
Книга называется:
Написал книгу Барри Брей. Издание 2005 года.
В этой книге на странице 473 приведён пример, как можно дешифровать участки памяти, а на страницах с 530 по 538 как дешифровать различные порты ввода-вывода.
Привести пример из книги не могу, так как эта информация защищена законом об авторском праве (о чём в книге и указано).
Думаю, что стоит, хотябы поверхностно. Потому, что он ближе к машинным кодам, которые понимает микропроцессор. Для того, чтобы понимать, как работает компьютер на на самом деле. Это называется низкоуровневое программирование. Да и некоторые программы легче написать, если знаком с машинными командами и шестнадцатеричными числами.
Полностью с нуля? Вообще, можно "покопать" в сторону микроядра L4, там очень много документации (правда на английском языке), поддерживаются различные архитектуры (правда, ARM на сколько я знаю уже не поддерживается).
А так, Эндрю Таненбаум "Современные операционные системы", Эндрю Таненбаум "Операционные системы: Разработка и реализациая", Макаров, Насыров "Написание собственной операционной системы" (достаточно примитивно, но понятно).
А вообще, есть достаточно неплохая подборка.
Как пример, можно поинтересоваться проектом "Хамелеон" - русской микроядерной операционной системой, на базе L4.
На счет исходников - лучше всего посмотреть исходный код FreeBSD, он достаточно прост и лаконичен, в отличии от Linux (слишком много "наворотов").
В языках ассемблера директивы -- это начинающиеся с "." специальные слова-указатели.
Это не команды, они не компилируются и не выполняются, но являются важными указывающими элементами программы в процессе ее компиляции и сборки.
Директивы зависят от вида ассемблерного языка, а последний зависит от системной архитектуры процессора, особенно в наименовании и количестве регистров.
Сейчас языки ассемблера чаще всего можно встретить при программировании микроконтроллеров.
Самые распространенные директивы позволяют присваивать понятные имена регистрам), определять сегменты памяти для занятия программой, типа памяти (как-то FLASH или EPPROM в микродевайсах), резервировать элемент памяти под переменную, разрешить генерации листинга при сборке и т.п. Т.е. это управляющие элементы, сами кодом не являющиеся.
Примеры:
DEF Name=Register
Мне нравилось в детстве программировать в кодах PDP-11 (у меня был УКНЦ). Прямо из пультового терминала восьмиричными цифрами -- коды в голове -- помнить надо штук 20 опкодов. Самый сложный проект -- интерпретатор самопридуманного языка. Что-то наподобие известного на этой архитектуре "Фокала" (с такими же однобуквенными ключевыми словами), только я еще больше упростил себе задачу, сделав математические выражения в обратном польском виде, плюс еще можно было назначать подпрограммы на свободные буквы. Еще пытался там поддержку двухпроцессорности сделать -- чтобы если в следующей строке нет в качестве аргументов результата предыдущей, передать ее обработку второму процессору. Но как-то это временами странно работало.