Olej писал(а):и почему вот здесь
регистр записывается с одним % ?
а вот здесь исключительно с двумя %% ?
И это действительно так!
Когда асемблерная вставка записывается без параметров (констрейтов), то вполне проглатывает запись с %, в противном случае - изволь %%.
Сегодня писал (в модуле ядра - 0-е кольцо защиты, супервизор!) подмену системного вызова в таблице sys_call_table (вирусописатели - ау!?
), так вот таблицу они оказывается, с некоторых пор разместили в сегменте read-only ... и попытка записи нового адреса обработчика (sys_write, например) вызывает ошибку обращения ... Ooops
Но этом делу легко помочь
- перед записью снимаем защиту по записи в read-only (16-й бит управляющего регистра процессора CR0)
Код: Выделить всё
//код выключения защиты записи:
#define rw_enable() \
asm( "pushl %eax \n" \
"movl %cr0, %eax \n" \
"andl $0xfffeffff, %eax \n" \
"movl %eax, %cr0 \n" \
"popl %eax" );
- а после успешной записи восстанавливаем защиту ... чтоб другие не писали
Код: Выделить всё
//код включения защиты записи:
#define rw_disable() \
asm( "pushl %eax \n" \
"movl %cr0, %eax \n" \
"orl $0x00010000, %eax \n" \
"movl %eax, %cr0 \n" \
"popl %eax" );
Всё замечательно подменяется!
P.S. и регистры то (и какие!
) с % !