А если принять к факту, что по умолчанию в регистрах хранится значение 0x00
Ничего в регистрах "по умолчанию" не хранится, кроме того, что в них в последний раз было записано.
я попробовал ничего не записывать в регистр AH и вызвать прерывание 0x16, значит по умолчанию в регистре 0x00.
Нет, это значит только то, что в этом месте твоей программы в этот раз в регистре AH был 0.
в подпрограмме read_keyboard почему то не сохраняют регистр AX
Потому что результат возвращают в нём.
почему сохранили регистр BX - я не понял
…а также cx, dx, si и di. При том, что функция 0 int 16 меняет
только AX. Я думаю, что на всякий случай их сохранили, для надёжности.