旧的CPU如何执行新的ENDBR64和ENDBR32指令?

3 x86 assembly x86-64 control-flow

在某些时候,英特尔将开始出货的CPU,可支持CET(ç ONTROL流è nforcement 牛逼贵桥),它增加了两条指令ENDBR64ENDBR32

These two will be encoded as

F3 0F 1E FA   for ENDBR64 and 
F3 0F 1E FB   for ENDBR32 respectively. 
Run Code Online (Sandbox Code Playgroud)

How will these be executed on older x86 CPUs?
For instance, a Core i5 or even the vintage Pentium II?

Update:

F3 0F = prefix indicating newer instructions
1E = ENDBR
FA = ENDBR64
Run Code Online (Sandbox Code Playgroud)

Pet*_*des 6

较旧的GDB解码F3 0F 1E FA ENDBR64repz nop edx

在64位模式下的Core 2(Merom)上单步执行不会导致体系结构状态发生任何变化,也不会导致任何故障/异常。(在旧版Ubuntu 15.10上的GDB 7.10中进行了测试)。


https://gist.github.com/Quasilyte/b60c94b9cb608d5b1a359d54f1be8aca
0f 1e /r为2个字节的操作码,需要一个ModRMNOP r/m32, r32,同为标准的多字节0f 1fNOP英特尔文件

它说它是随Pentium Pro添加的,所以任何PII / PIII或更高版本都可以。

https://github.com/NationalSecurityAgency/ghidra/issues/197#issuecomment-472906147说AMD记录了这些额外的NOP操作码;英特尔将其列为“保留”。

rep对于不适用于这些操作码的前缀,通常会默默地忽略它们。 这使Intel / AMD可以灵活地使用REP作为将来指令的必需前缀的一部分,以创建在旧CPU上不会出错的编码。


早于PPro的CPU(例如原始奔腾)可能会在此发生故障。 就像0f 1f长时间的NOP。


顺便说一句,您尝试对其进行解码没有任何意义。 0f是2字节操作码的“转义”字节,因此1e push ds与解码方式无关。这样便可以1e自行解码,而无需0f转义字节。(在无效的64位模式下除外。)