Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86_64指令流水线:指令执行顺序_Assembly_X86 64_Cpu Architecture_Instruction Set - Fatal编程技术网

Assembly x86_64指令流水线:指令执行顺序

Assembly x86_64指令流水线:指令执行顺序,assembly,x86-64,cpu-architecture,instruction-set,Assembly,X86 64,Cpu Architecture,Instruction Set,我对指令流水线有一些疑问 我有一个集会 0x111: div %ecx 0x112: add $0x13,%ecx #The address 112 is not real, I just kept to show that there is no instructions between div and add 程序计数器RIP指向0x111。我的疑问是,当RIP位于0x111时,处理器是否会执行(指令流水线或命令更改/任何原因)0x112的指令。如果我在RIP0x111停止执

我对指令流水线有一些疑问

我有一个集会

0x111: div    %ecx
0x112: add    $0x13,%ecx  #The address 112 is not real, I just kept to show that there is no instructions between div and add

程序计数器RIP指向
0x111
。我的疑问是,当
RIP
位于
0x111时,处理器是否会执行(指令流水线或命令更改/任何原因)
0x112的
指令。如果我在RIP
0x111
停止执行,是否有可能执行
0x112
,并且
%ecx
值为
0X13

否。一般规则是,管道等功能对任何单线程执行(即单核)都是完全透明的,而且CPU确保每件事情看起来都像是按照程序顺序顺序执行的指令,除了速度可能更快之外。如果执行在地址
0x112
处停止,无论是由于中断或断点还是任何其他原因,您将看到
%ecx
包含
div
的结果,但没有添加
0x13

可能在内部,机器已经执行了
add
,可能使用了一些未命名的内部寄存器,但如果是这样,则机器负责“回滚”该执行,因此,架构寄存器
%ecx
包含您能够检查它时应该包含的内容


在考虑性能时,管道和其他类型的执行/内存重新排序是相关的,但在考虑程序实际执行时则不相关。在多线程程序中是个例外,因为由于这些特性,一个线程执行的内存访问可能不会以相同的顺序被其他线程看到,并且在这种顺序很重要的某些情况下可能需要屏障。但是要明确的是,这不适用于单线程程序。

div%ecx
有2个字节长,但是让我们假设它是一个1字节的指令,就像
push%rcx
(就像div读取rcx一样),就玩具示例而言,这很好。这是一个(有用的)过于简化:执行顺序与内存顺序不同。存储地址和存储数据UOP可以按顺序完全执行,但存储缓冲区确保它们仅按程序顺序存储提交到L1d缓存。而且-在CPU体系结构术语中,“精确异常”是一种功能,它允许我们在某个任意点通过调试器或外部中断停止,并查看一致的状态,就好像按照程序顺序执行一样。这就是为什么从无序后端退出是按程序顺序进行的。(有人提出了一些避免顺序失效的方法,比如KIP,Kilo指令处理器:。人们想知道苹果的M1是否会做类似的事情,而不是用一个巨大的ROB来隐藏这么多的延迟。)还要注意,你可以在没有OoO exec的情况下进行内存重新排序:。(例如,使用记分板加载和弱顺序存储缓冲区在未命中缓存下命中。或者对于存储加载重新排序,仅使用存储缓冲区)。很高兴知道。也许我应该提到“流水线和其他类型的执行/内存重新排序”?是的,这句话很管用。