мы довольно забавно обменялись очевидными фактами
Предположим, что надо написать Once только с двумя значениями (WasNotCalled = 0, WasCalled = 1). Для метод call может использовать swap и вернуть предыдущее значение. Но какой порядок нужно использовать в этом swap?
int scan_code = 0;
asm(
"push %%eax\n"
"xor %%eax, %%eax\n"
"in $0x60, %%al\n" // принимаю сканкод
"movl %%eax, -12(%%ebp)\n"
"pop %%eax\n"
:
:
:
);
unsigned char scan_code = 0;
asm(
"in $0x60, %0" // принимаю сканкод
: "=a"(scan_code)
:
:
);
После этого ядро стало выдавать ошибку
qemu-system-x86_64 -kernel kernel-10 -nographic -serial stdio -monitor none -append 'console=ttyS0'
но ты лучше напиши сам и подробно. какие вопросы можно было бы задать модели, что бы и ответ не подсказать и понять, на сколько глубоко она понимает это?
Я не могу увидеть что вызвало проблему.
sd_kcode:
dd 0x0000ffff
db 0x00
db 0x8a
db 0xcf
db 0x00
dd 0x0000ffff
db 0x00
db 0x9a
db 0xcf
db 0x00
состояние после выполнения
cr0
совсем не такой каким должен быть.-d in_asm,exec,cpu -D logfile
, результатом будет лог исполняемых команд процессора в интерпретации qemu и состояния регистров на момент начала выполнения блоков кода. Тебе останется найти в этом логе адрес 0x7c00
чтобы увидеть процесс выполнения своего кода. strace -e read cat /dev/input/mice
, там будет видно что из системного вызова read()
приходит 3 байта:read(3, "\10\1\0", 131072) = 3
read(3, "\10\1\0", 131072) = 3
read(3, "\10\4\0", 131072) = 3
read(3, "\10\3\1", 131072) = 3
read(3, "\10\1\0", 131072) = 3
read(3, "\10\1\0", 131072) = 3
чего это "не работает"? всякие пароли от LUKS на ура интерактивно запрашиваются и вводятся.