cpu指令如何工作?

use*_*304 0 c++ assembly vm-implementation

在我理解的32位处理器中,每条指令都是32位.那么,对于汇编中的MOV指令,如何仅将32位用于操作码加参数?因此对于:

MOV register, [address]
Run Code Online (Sandbox Code Playgroud)

地址本身不占用32位吗?那么这不会占用整个指令吗?也许我错了,但我正在尝试用C/C++实现一个VM.救命?

Rom*_* R. 6

x86指令具有可变长度.CPU以第一个字节开始读取指令,识别"操作码",然后根据实际指令继续读取后续字节.

我在随机点停止了调试器(Visual Studio),它的反汇编窗口有一个选项"Show Code Bytes",它给出了一个指令长度的例子.看看下面:

在此输入图像描述

特别是,请查看与mov [ebp-15Ch], eax您的问题中提到的接近的行.相应的字节包括A4 FE FF FF32位值-15Ch.


小智 5

实际上,操作码可以是可变长度或固定长度,具体取决于架构.还有16位和32位处理器,带有20位地址总线.这些天架构位宽度不是很清楚.这更像是历史事物.我想这些天最好的"定义"可能是"逻辑"内部数据总线的宽度.(请记住8088:具有8位多路复用数据总线的16位器件.)