最近偶然看到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(&amp;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的别名:

完整代码:

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>