Assembly MOV指令实际上在CPU级别执行的不是一个原子操作吗?

Assembly MOV指令实际上在CPU级别执行的不是一个原子操作吗?,assembly,x86,cpu-architecture,atomicity,Assembly,X86,Cpu Architecture,Atomicity,我是汇编语言新手,我知道从内存中获取数据只能通过使用寄存器来完成。因此: MOV eax, x // x is an integer MOV y, eax MOV操作的机器代码由CPU指令组成 以及操作数和寄存器的地址。对还是错? 在RAM中,整数将存储在4个不同的内存中 位置。对还是错? 考虑到x86 32b处理器体系结构,当CPU执行MOV指令以加载数据MOV eax,x时,对于来自RAM的4字节数据,这意味着它必须执行4条指令以从构成4字节整数的所有4个地址获取数据,

我是汇编语言新手,我知道从内存中获取数据只能通过使用寄存器来完成。因此:

    MOV eax, x // x is an integer
    MOV y, eax  
MOV操作的机器代码由CPU指令组成 以及操作数和寄存器的地址。对还是错? 在RAM中,整数将存储在4个不同的内存中 位置。对还是错? 考虑到x86 32b处理器体系结构,当CPU执行MOV指令以加载数据MOV eax,x时,对于来自RAM的4字节数据,这意味着它必须执行4条指令以从构成4字节整数的所有4个地址获取数据,将字节连接在一起并将它们放入eax寄存器

Is this how the CPU does the job ? 
How does the CPU know how many bytes it should read ?

数据总线为32位宽。CPU将请求的地址放在地址总线上,RAM在数据总线上设置32位。因此,如果与4字节边界对齐,则只能访问32位;如果与2字节边界对齐,则只能访问16位。部分原因是RAM芯片的内部架构,但也存在必须访问两个不同芯片才能获得所需字节的风险

当读取一个字节或一个字时,CPU倾向于将数据总线的未使用区域设置为低位,因此零扩展移动与常规移动相比不需要更多的工程


然后,当然,有突发模式时,而不是一次复制一块内存,CPU继续复制它,直到它被告知不!这减少了解码指令的大量开销。

内存不是以字节为单位读取的。看看dram和缓存是如何工作的。汇编程序将使用A对x的机器代码操作数进行编码。假设x在全局数据中,并且是32位代码,它将使用绝对地址模式。操作码将意味着dword传输,其他大小将使用覆盖前缀或更改操作码。您是否在询问哪个处理器体系结构/微体系结构的硬件内存接口如何?是否工作,或者处理器架构是哪个处理器架构?保证对齐/访问大小为?的原子负载?。请澄清。@EOF:已编辑。希望它有意义。thanksmov负载只有在CPU可以在一次大范围操作中从缓存中获取所有字节时才能保证原子性,因此原子性是免费的。e、 g.在英特尔P6及更高版本上,任何不跨越缓存线边界的qword或更窄的负载。或来自对齐的不可缓存内存。请参阅链接的副本。每个字节都有自己的地址,但这并不能阻止一次读取访问多个字节,特别是当基址对齐时。数据总线的宽度取决于所使用的CPU。内存访问的对齐要求也取决于CPU。在大多数情况下,x86芯片并不关心对齐。如今,内存获取往往是整个缓存线。SDRAM突发是64字节或可配置为32字节;内存控制器不必告诉DRAM芯片停止。大多数现代CPU(包括所有现代x86)的缓存线大小为64字节并非巧合