Существует ряд проблем с этим кодом. Во-первых, вы, кажется, забыли, что OUTSB
является привилегированной инструкцией, то есть она может быть выполнена, только если вызывающий процесс имеет доступ к кольцу 0, т.е. это часть кода ядра. Насколько я знаю, единственным кодом в Linux, который имеет доступ к привилегированным инструкциям, является само ядро и загружаемые им модули. Все остальные процессы выдадут вам Segmentation fault
(что на самом деле General Protection Fault
сигнализируется процессором), когда вы попытаетесь выполнить привилегированную инструкцию из непривилегированного сегмента кода. Я не знаю, как это влияет на вызов ioperm
системного вызова.
Во-вторых, OUTSB
записывает байт из области памяти, указанной в ESI
, в порт ввода-вывода в DX
. В этом случае вы говорите процессору записывать данные в порт из местоположения 0xff
, к которому процесс, безусловно, не имеет доступа. Вы можете упростить это, просто изменив код для использования инструкции OUT
, поскольку OUTSB
скорее предназначен для использования с префиксом REP
. Попробуйте это:
mov al, 0xff
out 0x378, al
Это выводит байт в al
на порт ввода-вывода, указанный непосредственным операндом, в данном случае 0x378
.
Дайте мне знать, как это получилось.