首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >旧CPU如何执行新的ENDBR64和ENDBR32指令?

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

Stack Overflow用户
提问于 2019-05-13 21:40:46
回答 2查看 5.4K关注 0票数 7

在某一时刻,英特尔将开始推出支持CET(Control-flow E增强T技术的CPU,后者增加了ENDBR64ENDBR32两个指令。

这两个将被编码为

代码语言:javascript
复制
F3 0F 1E FA   for ENDBR64 and 
F3 0F 1E FB   for ENDBR32 respectively. 

如何在旧的x86 CPU上执行这些操作?

例如,核心i5,甚至是老式的奔腾II?

更新:

代码语言:javascript
复制
F3 0F = prefix indicating newer instructions
1E = ENDBR
FA = ENDBR64
EN

回答 2

Stack Overflow用户

发布于 2019-05-14 02:44:32

旧的GDB将F3 0F 1E FA ENDBR64解码为repz nop edx

在64位模式下,在核心2 (Merom)上单步执行不会导致体系结构状态的变化,也不会产生故障/异常。(在GDB 7.10上测试了一个旧的Ubuntu 15.10安装)。

https://gist.github.com/Quasilyte/b60c94b9cb608d5b1a359d54f1be8aca称,

0f 1e /r 是一个2字节的操作码,它采用ModRMNOP r/m32, r32,与标准的多字节诺普,英特尔的文件相同。

它说它添加了奔腾Pro,所以任何的PII / PIII或更高版本都可以。

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

对于不适用的操作码,通常会忽略rep 前缀。使英特尔/AMD可以灵活地使用REP作为将来指令的强制性前缀,以创建不会在旧CPU上出错的编码。

CPU比PPro老,例如原始奔腾,可能会在它上产生错误。就像0f 1f long NOP一样。

顺便说一句,你想把它解码是毫无意义的。0f是2字节操作码的“转义”字节,因此1e push ds与其解码方式无关。这就是1e自己解码的方式,没有0f转义字节。(除非在64位模式下无效。)

票数 10
EN

Stack Overflow用户

发布于 2019-12-06 19:24:02

最近我自己也遇到了ENDBR32指令方面的问题。VirtualBox版本6.0.14_Ubuntu r132055错误地将ENDBR32解码为非法操作码和STI序列。这将产生各种错误,因为我需要中断禁用。我想出的唯一解决方案是启用-fcf-protection=branch-mmanual-endbr选项来调用GCC。

VirtualBox调试控制台位于顶部,Objdump位于底部

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56120231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档