Вариант конечно. Хочешь -- научи, тем более что ты явно лучше представляешь, как это должно быть. C++ же знаешь, да?
И кстати, твой is-acсемблер мой кусок кода правильно срелоцирует? Опять же не говорю про выравнивание на 256 байт.
Я C++ не знаю. Ну а насчет "срелоцировать кусок кода" - то релоцирует не ассемблер. iS-ассемблер при компиляции кода с ключом, указывающим, что это будет программа, предназначенная для релокации внутри системы, ассемблирует (под какой-то выбранный пользователем "контрольный адрес", указанный в ORG nnnn) как обычно, но в конце программы "пришивает" после метки табличуц с указанием на все места в программе, где встретились либо переходы, либо указания на адреса в виде меток внутри этой программы (т.е. если встретились CALL metka1, JP metka2, LD A,(metka3) и подобное, где metka1,2,3 - указывают на адреса процедур/переменных внутри тела компилируемой программы).
А релоцирует на основании "табличек адресации" получвенный драйвер/резидент уже служебная системная утилита по установке/удалению драйверов резидента. Допустим, У вас в системе в выделенной под дрова области лежат (для примера, "сверху вниз" дрова:
1. Клавы
2. Мыши
3. COM-порта
4. флопа
5. винта
6. SD-карты
Далее нам надо поставить еще и драйвер CD-ROM, который занимает, допустим (берем с потолка), 1537 байт. Утилита установщик берет драйвер, находит самый нижний драйвер в области (в нашем примере это драйвер SD-карты), вычитает от начала его расположения эти 1537 байт (если надо, проверяет, хватает ли под это оставшегося места, чтобы не залезть в "ненужные" разделы системы). Подгружает файл со скомпилированным драйвером, ищет в нем таблицу, и по ней находит все адресныек константы и подправляет их на разницу между теми адресами, которые указаны там и адресами относительног реального расположения драйвера. В итоге получаем новый набор настроенных на свое месторасположение драйверов:
Дрова:
1. Клавы
2. Мыши
3. COM-порта
4. флопа
5. винта
6. SD-карты
7.CD-ROM
А затем нам надо удалить "ненужный" в текущей работе драйвер COM-порта, который, опять берем с потолка, "весит" 915 байт.
Та же самая утилита удаляет из списка ссылку на драйвер COM-порта, и последовательно сдвинает вверх на 915 байт драйвера флопа, винта, SD-карты, CD-ROM, в каждом внося разницу в адресацию соответственных команд исходя их таблицы в конце каждого драйвера.
В итоге получаем набор дров:
Дрова:
1. Клавы
2. Мыши
3. флопа
4. винта
5. SD-карты
6.CD-ROM
В отличие от TASiS можно выделить под дрова отдельную страницу. Или разбить дрова на несколько типов (дрова устройств ввода, дрова печати/вывода символов, дрова "дисковых" устройств, "иные") несколько страниц, или по странице на каждый. Но тут уже, как упоминалось выше, надо брать блокнот, ручку, и "расчерчивать" структуру. Не говорю, что вот прям срочно-срочно. Я согласен с Алонекодером, что очень важен функционал. Но и упускать то, о чем я говорю, тоже нельзя. Ибо "откомпилировать ядра под любые случаи" можно, но это неправильно. Юзер не должен "уметь в ассемблер" или знать структуру системы, чтобы лезть туда и "впендюривать" другой драйвер. Он должен знать, что любой драйвер он установит/удалит/заменит один на другой при момощи утилитки vot_eta_khrenovina.com, а драйвера - это файлы с расширениями, допустим drv,dsk,kbd и prn. И есть тыкнуть по таким-то файлам или набрать в командной строке vot_eta_khrenovina.com /ключ1 /ключ2 fignya.drv то в зависимости от набора ключей или их отсутствия получим или искомый результат, или сообщение об ошибке, если, к примеру, не хватило памяти. Всё.