Assembly 将处理器设置为32位模式

Assembly 将处理器设置为32位模式,assembly,x86,32-bit,16-bit,Assembly,X86,32 Bit,16 Bit,以下是许多教程中给出的将处理器从16位切换到32位的常用方法: mov eax, cr0 ; set bit 0 in CR0-go to pmode or eax, 1 mov cr0, eax 为什么我不能简单地做以下事情: or cr0, 1 有什么我遗漏的吗?可能我能想到的唯一一件事是我不能在cr0寄存器上执行这样的操作。或运算符没有可以访问cr0寄存器的操作代码。(无法在CR0寄存器上执行此操

以下是许多教程中给出的将处理器从16位切换到32位的常用方法:

    mov     eax, cr0            ; set bit 0 in CR0-go to pmode
    or      eax, 1
    mov     cr0, eax
为什么我不能简单地做以下事情:

    or      cr0, 1

有什么我遗漏的吗?可能我能想到的唯一一件事是我不能在cr0寄存器上执行这样的操作。

运算符没有可以访问cr0寄存器的操作代码。(无法在CR0寄存器上执行此操作。)


这就是为什么存在
mov
的原因:存在一个可以访问CR0寄存器的操作码。

或者是一个比较运算符,它实际获取两个值并创建一个解决方案。or操作完成后,解决方案存储在eax中。或者不能用作存储寄存器,因为它是一种专门的操作,受范围控制,因此最好在进程完成后立即获取其结果并存储新值

在详细说明关于使用或使用操作数的内容时,它没有存储容量,只是对id已经存在的数据执行操作。想象或者像计算器上的一个按钮,它有一个操作,比如加、减、乘或除。代码是管理内存缓冲区的计算器;等,并利用操作员/操作对其内存存储中的数据提供的服务,当完成时,将获得进一步操作的返回结果或向用户输出的完成结果


这里的问题是一个逻辑问题,代码经过深思熟虑,简洁明了——很好的东西。

试试这个,在1命令中强制1到cr0:

MOV cr0, 1

“可能我能想到的唯一一件事就是我不能在cr0寄存器上执行这样的操作”——这是一个很好的理由。不是所有的寄存器都支持所有的操作。@Neil-那么,我想我明白为什么不能这样做了。哈哈…请原谅我上面的打字错误,因为我使用的键盘在形式上非常小,而且使用起来也越来越快。祝您度过愉快的一天,并享受代码。我等不及我的桌面PSU从商店回来了。哇,这是个坏主意。您现在已取消设置的
CR0
中的所有其他位呢?这也是一条非法指令<只能从寄存器设置代码>cr0