Макс, вы могли бы создать драйвер устройства, работающий в кольце 0, который вызывает более простой BIOS ISR, если ОС работает в 16-битном защищенном режиме. Но в 32-битном режиме первое 16- или 32-битное смещение адреса или непосредственное значение будут интерпретированы неправильно, и поток команд выйдет из синхронизации. В реальном или 16-битном защищенном режиме значения по умолчанию и смещения по умолчанию имеют длину 16 бит, в 32-битном защищенном режиме они имеют длину 32 бита, а в 64-битном (длинном) режиме - 32 или 64 бита. долго. Поэтому в ISR могут использоваться только смещения, представленные в байтах (<128, если я правильно помню) и непосредственные байтовые значения. </p>
Кроме того, любая загрузка регистров сегмента (кроме нуля) будет вести себя в реальном режиме иначе, чем в любом защищенном режиме. Опять же, код реального режима и код защищенного режима могут работать вместе, что позволяет писать код, который работает, но это совсем не просто.
Например, `
mov ah, 0B8h
mov al, 000h
mov es, ax
mov byte ptr es:0, 'o'
mov byte ptr es:2, 'k'`
поместит буквы 'ok' в верхний левый угол экрана текстового режима в реальном режиме, но чтобы это работало в 16-битном или 32-битном защищенном режиме, запись в таблице глобальных дескрипторов со смещением 0xB800 должна иметь базовый адрес 0x000B8000.
Но если вы удовлетворены работой только в 16-битном защищенном режиме, более распространенный код: `
mov ax, 0B800h
mov es, ax
mov dword ptr es:0, 0076b076fh`
должно работать так же хорошо.