gpt4 book ai didi

gcc - 汇编指令 : rdtsc

转载 作者:行者123 更新时间:2023-12-04 22:58:19 28 4
gpt4 key购买 nike

有人能帮我理解 https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html 中给出的汇编程序吗?

它是这样的:

uint64_t msr;
asm volatile ( "rdtsc\n\t" // Returns the time in EDX:EAX.
"shl $32, %%rdx\n\t" // Shift the upper bits left.
"or %%rdx, %0" // 'Or' in the lower bits.
: "=a" (msr)
:
: "rdx");

它与以下有何不同:
uint64_t msr;
asm volatile ( "rdtsc\n\t"
: "=a" (msr));

为什么我们需要 shift 和 or 操作,最后 rdx 做什么?

编辑:添加了原始问题尚不清楚的内容。
  • "\n\t"有什么作用?
  • ":"是做什么的?
  • 分隔符输出/输入/clobbers...
  • 最后的 rdx 是否等于 0?

  • 只是回顾一下。第一行在寄存器 eax 和 edx 中加载时间戳。第二行移动 eax 中的值并存储在 rdx 中。第三行将 edx 中的值与 rdx 中的值进行运算,并将其保存在 rdx 中。第四行将 rdx 中的值分配给我的变量。最后一行将 rdx 设置为 0。
  • 为什么前三行没有“:”?
  • 他们是一个模板。带有“:”的第一行是输出,第二行是可选输入,第三行是可选的clobbers(改变的寄存器)列表。
  • 真的是eax和d-edx吗?这是硬编码吗?

  • 再次感谢! :)

    EDIT2:回答了我的一些问题......

    最佳答案

    uint64_t msr;
    asm volatile ( "rdtsc\n\t" // Returns the time in EDX:EAX.
    "shl $32, %%rdx\n\t" // Shift the upper bits left.
    "or %%rdx, %0" // 'Or' in the lower bits.
    : "=a" (msr)
    :
    : "rdx");

    因为 rdtsc指令在 edx 中返回它的结果和 eax ,而不是 64 位机器上的直接 64 位寄存器(有关更多信息,请参阅 intel 系统的编程手册;它是一条 x86 指令),第二个
    指令移动 rdx向左注册 32 位,以便 edx将在高 32 位而不是低 32 位。 "=a" (msr)将移动 eax 的内容进入 msr ( %0 ),即进入它的低 32 位,所以总共你有 edx (高 32 位)和 eax (低 32 位)变成 rdx这是 msr . rdx是一个代表 msr的clobber C 变量。

    它类似于在 C 中执行以下操作:
    static inline uint64_t rdtsc(void)
    {
    uint32_t eax, edx;
    asm volatile("rdtsc\n\t", "=a" (eax), "=d" (edx));
    return (uint64_t)eax | (uint64_t)edx << 32;
    }

    和:
    uint64_t msr;
    asm volatile ( "rdtsc\n\t"
    : "=a" (msr));

    这个,正好给你 eax的内容进入 msr .

    编辑:

    1) "\n\t"是为了让生成的程序集看起来更清晰和无错误,这样你就不会得到像 movl $1, %eaxmovl $2, %ebx 这样的东西
    2) 最后的 rdx 是否等于 0? 左移执行此操作,它删除已在 rdx 中的位。 .
    3) 真的是eax和d-edx吗?这是硬编码吗? 是的,有一个表格描述了什么字符代表什么寄存器,例如“D”将是 rdi , "c"将是 ecx , ...

    关于gcc - 汇编指令 : rdtsc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34810392/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com