【发布时间】:2020-01-09 08:46:30
【问题描述】:
我有一个关于使用 'rN' 寄存器的问题(r8,r9,r10,....)
我想在我的程序中使用 r8,r9,... 寄存器(大量使用!)但我发现代码大小问题!
例如,
mov eax, DWORD [rdi+4]
等于 (8b 47 04)(反汇编程序)
但是当我使用“rN”寄存器时,情况就不同了!
mov eax, DWORD [r9+4]
等于 (41 8b 41 04)(它有一个额外的 BYTE(前缀)!)
所以使用 rN 寄存器比使用其他寄存器有更多的代码大小!!!!!!!!!!!!!!!!!!!!!首先,为什么?!!!
其次,除了代码大小问题,如果我们使用 rN 个寄存器 (r8,r9,r10,...) 代替其他寄存器,是否还有其他问题,例如 (CACHE, CYCLE, ...) ?
【问题讨论】:
-
x86-64 ISA 和新寄存器是基于 x86-16 ISA 的 x86-32 ISA 的扩展。随着更多指令和寄存器的添加,ISA 无法满足所有要求,因此添加了特殊的 前缀 以告知下一条指令正在使用 ISA 的特定扩展(例如新的 64 位寄存器)。字节
41(十六进制)大概就是这样一个前缀字节。 -
是的......我知道(正如我所说的'前缀')但我想确定缓存,循环,......但也谢谢(有用的解释)
-
0x41是REX.B前缀,它在指令中扩展了 Mod R/M 字节的 RM 字段,增加了一位,这是访问扩展寄存器所必需的。请参阅英特尔手册中的 2.2.1.2 更多关于 REX 前缀字段部分。 -
您是否在问使用这些寄存器时性能是否会因为代码大小增加而变差?我想可能是在某些情况下,热代码部分接近溢出缓存行,但我不确定。
标签: assembly x86-64 machine-code