c - x86 程序集中 '_emit 0Fh, _emit 31h' 是什么意思?

标签 c assembly x86 inline-assembly

我想检查我的代码的 CPU 周期。

我想使用“tsc”。

在这种情况下,tsc 的许多代码都包含'_emit 0Fh, _emit 31h'。

这些的具体含义是什么??

这是代码。

#include <stdio.h>  
#include <windows.h>  

union int32to64
{

    __int64 i64;

    int i32[2];
};

void read_tsc(int *cl_Low, int *cl_High)
{

    __asm {
        _emit 0Fh
        _emit 31h
        mov ecx, dword ptr cl_Low // cl_Low -> ecx into 32bit
        mov[ecx], eax
        mov ecx, dword ptr cl_High
        mov[ecx], edx
    }
};

int main(void)
{
    union int32to64 a, b;
    __int64 mhz = 0;

    read_tsc(&a.i32[0], &a.i32[1]);
    Sleep(1000);
    read_tsc(&b.i32[0], &b.i32[1]);

    mhz = b.i64 - a.i64;

    printf("clock : %I64dMHz", mhz / 1000000);

    return 0;
}

最佳答案

0f 31 是 rdtsc 指令的操作码。两个 _emit 伪指令发出这两个字节,有效地形成了一个 rdtsc 指令。这段代码可能是为不支持 rdtsc 助记符的编译器编写的。手动发出构成指令的字节是此类情况的一种可能解决方法。

关于c - x86 程序集中 '_emit 0Fh, _emit 31h' 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48862697/

相关文章:

c - 编译c代码时出现奇怪的错误

assembly - 将 ARM 汇编助记符转换为字节

c - assembly - 来自堆栈的编号

assembly - 我可以在什么程序中编码和测试汇编?

x86 - 现代 x86 CPU 中所有微操作的长度都相同吗?

c - 简单的 for 循环在 C 中不起作用

C 套接字和 openssl (RSA)

c - 为什么帧指针保存在main函数的开头

assembly - x86 程序集 16 位相对调用

c - 哪些代码可能对环境(变量)敏感?