因此,我正在学习x86的工作原理,并遇到人们说x86是字节可寻址的,但可以读取单词,双精度单词等。处理器如何决定何时使用哪种方法?例如。用于访问下一条指令以及当用户想要对存储器进行读/写时,使用哪种寻址模式?
每个内存访问都有机器码指令指定的操作数大小。(寻址模式不是正确的术语:不同的寻址模式是指定要分配的内存块的最低地址的不同方法。访问,例如[rdi]
vs.[rdi + rdx*8]
vs. [RIP + rel32]
)
对不同的操作数大小进行编码(使用前缀(对于整数指令为16 vs. 32 vs. 64位)或对于相同的助记符(8位整数)使用不同的操作码。或使用可使用xmm,ymm或zmm寄存器的AVX / AVX512指令的VEX或EVEX前缀。
例如,mov [rdi], eax
是双字存储,并且机器码编码将通过在操作码上不使用特殊前缀来指定16/32/64位操作数大小。 (有关可用的编码,请参见https://www.felixcloutier.com/x86/mov。)
像mov [rdi], ax
这样的16位操作数大小将通过66
操作数大小前缀具有相同的机器代码。
8位操作数大小(mov [rdi], al
)有其自己的操作码,不需要前缀。
movzx
/ movsx
是有趣的情况:存储器访问大小与目标寄存器不同。内存访问大小(字节或字)由操作码指定。操作数大小前缀仅影响目标大小。 x86-64movsx
63 /r
(dword-> qword符号扩展名)除外,其中movsxd
操作数大小前缀does将内存访问大小缩小到66
以匹配目标。] >
类似地,对于SIMD指令;指令编码唯一地确定内存访问大小以及读取或写入的寄存器。