1) Если нужно написать программу без использования даже стандартной библиотеки (zero runtime). Тогда обёртки для системных вызовов нужно писать на ассемблере, с обращениями к отдельным регистрам. По крайней мере в Linux (параметры вызовов сначала раскладываются по регистрам) и в BSD (один параметр в регистр RAX, остальное в стек). В Windows не знаю, там всё немного по-другому устроено.
2) Вообще я про это не знал, спасибо за информацию. Но насколько я понял, указание register указывает хранить переменную в одном из регистров, чтобы к ней можно было осуществлять максимально быстрый доступ - и только. Ручная работа с регистрами в Си не предусмотрена, т.к. Си в общем-то и задумывался, чтобы уйти наконец от этого микроменеджмента, спрятавшись за уровнем абстракции.
ПС. Ну и вообще, насколько я знаю, вставки на ассемблере в Сишный код делают, когда некий кусок кода нужно оптимизировать по скорости, но не хотят перекладывать эту работу на компилятор.