【发布时间】:2016-04-21 00:10:07
【问题描述】:
谁能帮我理解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:回答了我的一些问题...
【问题讨论】:
-
实际使用见Get CPU cycle count?。 (@Mysticial 的回答正确地将移位 / OR 留给了编译器,只将
rdtsc放在内联汇编中。我的回答建议使用__rdtsc()内在代替。不过,不是重复的,因为这个问题是关于使用它来学习内联汇编例如,实际上并不是如何实现 rdtsc。
标签: gcc assembly x86 timestamp rdtsc