Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Loops 英特尔汇编-使用r10d可增加周期_Loops_Assembly_Intel - Fatal编程技术网

Loops 英特尔汇编-使用r10d可增加周期

Loops 英特尔汇编-使用r10d可增加周期,loops,assembly,intel,Loops,Assembly,Intel,我的英特尔向量汇编代码中有一个循环。在循环中,循环计数器用于读取和写入4个连续的内存位置。比如说, vmovdqu [r9 + rdx + 64], y0 vmovdqu [r9 + rdx + 96], y1 其中“rdx”是我的循环计数器。 在分析过程中,我注意到使用r10d而不是rdx寄存器会增加周期。 初始化为“r10d”比初始化为“rdx”需要多1个字节。 周期增加的原因可能是什么 已解决。这是因为寄存器>r8需要一个额外的字节。寻址表达式[r9+r10d+…]将创建一个

我的英特尔向量汇编代码中有一个循环。在循环中,循环计数器用于读取和写入4个连续的内存位置。比如说,

   vmovdqu [r9 + rdx + 64], y0
   vmovdqu [r9 + rdx + 96], y1
其中“rdx”是我的循环计数器。 在分析过程中,我注意到使用r10d而不是rdx寄存器会增加周期。 初始化为“r10d”比初始化为“rdx”需要多1个字节。
周期增加的原因可能是什么

已解决。这是因为寄存器>r8需要一个额外的字节。

寻址表达式
[r9+r10d+…]
将创建一个错误-虽然可以在64位模式下使用32位地址操作数(通过地址大小覆盖前缀),但不能在同一表达式中混合和匹配。你能给我看一下这两种情况下你得到的二进制操作码吗?@FrankH假设你的意思是
r10
,我得到的是
10000f74:c4 c1 7e 6f 44 11 40 vmovdqu 0x40(%r9,%rdx,1),%ymm0
100000f7b:c4 c1 7e 6f 4c 11 60 vmovdqu 0x60(%r9,%rdx,1),%ymm1
1000002:c4 81 7e 6f 44 40 vmovdqu 0x40(%r9,%r10,1),%ymm0
100000f89:c4 81 7e 6f 4c 11 60 vmovdqu 0x60(%r9,%r10,1),%ymm1
。它们都是相同大小的。已解决。这是因为寄存器>r8需要额外的字节。您需要显示整个循环。单独更改寄存器没有什么区别,但在上下文中可能会有很大的区别。您还应该提及您使用的处理器,因为这也会产生很大的区别。正如我将指出的那样xist在他的评论中解释说,将RDX更改为R10并不会更改指令的长度。使用R8-R15需要一个额外的字节,即REX前缀,但由于您已经在使用R9,该额外字节已经存在于指令中。不需要第二个额外字节。实际上,我应该更仔细地看一下Iwillnotexist的示例ly。它们实际上是VEX编码的,因此需要一个3字节的前缀。VEX前缀可以是2字节长,但如果内存操作数地址中使用的任何寄存器在R8-R15范围内,则不能。因此,使用第二个这样的寄存器不会改变指令的长度。