Установка процессора в 32-битный режим
Вопрос
Похоже, что во многих руководствах по переключению процессора с 16-битного на 32-битный используется следующий метод:
mov eax, cr0 ; set bit 0 in CR0-go to pmode
or eax, 1
mov cr0, eax
Почему бы мне просто не сделать следующее:
or cr0, 1
Есть ли что-то, что мне не хватает?Возможно, единственное, о чем я могу думать, это то, что я не могу выполнить такую операцию с регистром cr0.
Решение
А or
у оператора нет кода операции, с помощью которого он мог бы получить доступ к регистру CR0.(Невозможно выполнить эту операцию с регистром CR0.)
Вот почему mov
есть:существует код операции, который может получить доступ к регистру CR0.
Другие советы
или — это оператор сравнения, который фактически принимает два значения и создает решение.Решение сохраняется в eax после завершения операции или.Или не может использоваться в регистре хранения, поскольку это специализированная операция, управляемая областью действия, и поэтому хорошей практикой является получение ее результатов и немедленное сохранение нового значения сразу после завершения процесса.
Развивая то, что было сказано об использовании операндов или с ними, у него нет места для хранения, он просто выполняет операцию с данными, которые уже присутствуют.Подумайте о кнопке на калькуляторе, где есть одна операция, например сложение, вычитание, умножение или деление.Код — это калькулятор, который управляет буферами памяти;и т. д.и использует услуги оператора/операции с данными в своих хранилищах памяти и по завершении получает возвращаемые результаты для дальнейших операций или готовый вывод пользователю.
Вопрос здесь логичный, а код хорошо продуман и лаконичен — хорошая штука.
Попробуйте это и принудительно отправьте 1 к cr0 в 1 команде:
MOV cr0, 1