最近偶然看到BaseLib 提供了AsmReadMm0() 和AsmWriteMm0()函数,于是进行了下面的实验。
首先,用AsmReadMm0 读取当前 MM0 寄存器的值,然后随机生成一个再写入 MM0 中。
#include <Uefi.h>
#include <Library/BaseLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiApplicationEntryPoint.h>
EFI_STATUS
EFIAPI
MMXTestMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
UINT64 x=AsmReadMm0();
Print(L"Current MM0 =0x%lX\n",x);
AsmRdRand64(&x);
Print(L"Random Value=0x%lX\n",x);
AsmWriteMm0(x);
return EFI_SUCCESS;
}
之后在 NT32Pkg 的模拟器中运行结果如下:

可以看到,前一次运行之后随机生成一个数值,写入MM0之后再次运行还可以读出。
=====================================================================================
R0-R7 是独立于 RXX 的寄存器,之前文章引用过一幅示意图,上面写的 RAX or R0 这句话会误导读者以为他们是同一个寄存器。

实际上,R0-R7 是用来进行浮点运算的 80Bits的寄存器。MMX0-7是R0-R7 0-64Bits的别名:

完整代码: