указатель NULL указывает на ячейку памяти без адреса
Это не правда. Из принятого ответа на поставленный вами вопрос:
Обратите внимание, что из-за того, как сформулированы правила для нулевых указателей, значение, которое вы используете для присвоения / сравнения нулевых указателей, гарантированно равно нулю, но битовая комбинация, фактически сохраненная внутри указателя, может быть любой другой вещью
Большинство платформ, о которых я знаю, на самом деле обрабатывают это, помечая первые несколько страниц адресного пространства как недействительные. Это не значит, что процессор не может решать такие задачи; это просто удобный способ сделать низкие значения недопустимым указателем. Например, несколько API-интерфейсов Windows используют это, чтобы различать идентификатор ресурса и указатель на фактические данные; все, что ниже определенного значения (65k, если я правильно помню), не является действительным указателем, но является допустимым идентификатором ресурса.
Наконец, то, что C что-то говорит, не означает, что CPU нужно ограничивать таким образом. Конечно, C говорит, что доступ к нулевому шаблону не определен, но нет никаких причин, по которым кто-то пишет в ассемблере, должен подвергаться таким ограничениям. Реальные машины, как правило, могут сделать гораздо больше, чем предписывает стандарт C. Виртуальная память, инструкции SIMD и аппаратный ввод-вывод - вот несколько простых примеров.