如何在支持MPX的Intel CPU上启用MPX扩展及排查指令无效问题
问题
我正在支持MPX的Intel® Celeron® Processor N4120处理器上测试Intel MPX指令,编写了如下汇编程序,但MPX指令似乎无作用(类似NO OP)。程序未生成预期异常,bound2值也未按预期改变,怀疑MPX已存在但被禁用。我使用Windows 11系统,通过VS2022命令提示符的ml选项调用MASM汇编器,请问如何启用MPX指令?
测试代码
.data bound1 dq 07fffffffffffffffh bound2 dq 1111111111111111h .code one main: xor ecx, ecx bndmov bnd1, qword ptr ds:[bound1] ; bnd1 = bound1 bndmov bnd2, bnd1 ; bnd2 = bnd1 bndmov qword ptr ds:[bound2], bnd2 ; bound2 will change to FFFFFFFFFFFFFFFh? bndcl bnd1, ecx ; generate exception if ecx< bnd1 main endp end
启用MPX指令的步骤
- 开启BIOS/UEFI的MPX支持:重启电脑进入BIOS/UEFI设置界面,找到「Intel Memory Protection Extensions」(或简称MPX)选项,将其设为启用状态。该选项通常在「Security」或「高级CPU配置」分类下。
- 汇编时指定MPX指令集支持:调用MASM汇编器时,必须添加宏定义启用MPX,同时指定兼容的指令集架构。如果是32位程序,使用以下命令:
如果是64位程序,需改用ml /c /coff /arch:AVX2 /d_MPX your_program.asmml64(VS2022自带的64位汇编器),命令为:ml64 /c /d_MPX your_program.asm - 链接生成可执行文件:链接阶段需确保目标程序类型正确,以控制台程序为例,使用以下命令:
link /subsystem:console your_program.obj kernel32.lib - 验证MPX生效状态:
- 可通过CPUID指令检测硬件MPX支持:读取CPUID leaf 0x07、sub-leaf 0x00的EBX寄存器第14位,若为1则硬件支持MPX。
- 使用WinDbg等调试器运行程序,查看BND寄存器的数值变化,确认
bndmov指令是否正常执行;同时检查bndcl指令触发异常的情况。
内容的提问来源于stack exchange,提问作者Theodoros Mpalis
相关产品推荐
相关产品推荐

