Loops 英特尔汇编-使用r10d可增加周期
我的英特尔向量汇编代码中有一个循环。在循环中,循环计数器用于读取和写入4个连续的内存位置。比如说,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+…]将创建一个
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范围内,则不能。因此,使用第二个这样的寄存器不会改变指令的长度。