Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Пару вопросов про регистр команд

123 123 Профи (649), на голосовании 1 месяц назад
Допустим я выделю executable участок памяти, запишу туда следующие байты (опкоды):
0xB8 0x09 0x00 0x00 0x00; mov eax, 9
0xC3; ret

Вопрос 1:
Если я буду кастить указатель на этот участок памяти к функции, либо напрямую вызывать его через call/invoke, то при адресации этой памяти байты через шину пойдут в регистр команд?
А если я буду считывать их, например, через printf, то байты через шину пойдут в обычные регистры типа eax?

Вопрос 2:
Можно ли работать напрямую с регистром команд? Я знаю, что указатель можно поменять, jmp и так далее, чтобы с потоком выполнения работать. Но адресовать напрямую регистр команд я так понимаю физически невозможно?

Вопрос 3:
Насколько я понимаю, можно с шиной напрямую работать и адресовать ее, когда работаешь на уровне ядра. Можно ли через шину манипулировать регистром команд?
Голосование за лучший ответ
Wendigo Мудрец (13956) 2 месяца назад
1) Да. При считывании данных с помощью printf байты будут загружены в обычный регистр, например eax.
2) Все инструкции по изменению регистра команд (например, jmp) выполняются через декодирование инструкций процессором.
3) В некоторых встроенных системах или микроконтроллерах может быть возможность прямого доступа к регистру команд с помощью спец. инструкций.
123 123Профи (649) 2 месяца назад
2) Я могу туда типа eax что-то записать? Например 0x00, типа mov IR (Instruction register), 0x00. Или только через jmp это делать можно? А адресовать физически невозможно, так как компонент внутренний.
3) Я про процессоры intel 64 и IA-32
Wendigo Мудрец (13956) 123 123, 2) Нет, нельзя напрямую записать в регистр команд с помощью инструкции mov. Нужно выполнить инструкцию, которая это делает, например jmp. 3) Для этих процов невозможно напрямую манипулировать регистром команд с помощью шины. Но в режиме ядра ОС может использовать механизмы, типо перехватчики и исключения. Например, обработчик исключения может перехватить прерывание и изменить регистр команд для обработки исключения.
Похожие вопросы