有人能帮我理解在 https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html 中给出的汇编代码吗?
代码如下:
我们为什么需要使用移位和或操作,rdx在末尾是做什么用的?
编辑:原问题中还不清楚的内容已添加。
- "\n\t"是什么作用? - ":"是什么作用?
- 分隔符输出/输入/破坏...
- rdx在末尾是否等于0? - 简要回顾一下。第一行将时间戳加载到eax和edx寄存器中。第二行移位eax中的值,并将其存储在rdx中。第三行将edx中的值与rdx中的值进行或运算,并将其保存在rdx中。第四行将rdx中的值分配给我的变量。最后一行将rdx设置为0。 - 为什么前三行没有":"?
- 它们是模板。带有":"的第一行是输出,第二行是可选输入,第三行是可选的更改寄存器列表。
- a实际上是eax,d是edx吗?这是硬编码的吗?
谢谢! :)
编辑2:回答了我一些问题...
代码如下:
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));
我们为什么需要使用移位和或操作,rdx在末尾是做什么用的?
编辑:原问题中还不清楚的内容已添加。
- "\n\t"是什么作用? - ":"是什么作用?
- 分隔符输出/输入/破坏...
- rdx在末尾是否等于0? - 简要回顾一下。第一行将时间戳加载到eax和edx寄存器中。第二行移位eax中的值,并将其存储在rdx中。第三行将edx中的值与rdx中的值进行或运算,并将其保存在rdx中。第四行将rdx中的值分配给我的变量。最后一行将rdx设置为0。 - 为什么前三行没有":"?
- 它们是模板。带有":"的第一行是输出,第二行是可选输入,第三行是可选的更改寄存器列表。
- a实际上是eax,d是edx吗?这是硬编码的吗?
谢谢! :)
编辑2:回答了我一些问题...
rdtsc
放在内联汇编中。我的答案建议使用__rdtsc()
内置函数。虽然不是重复问题,但这个问题是关于使用该示例学习内联汇编,而不是实际如何实现rdtsc。 - Peter Cordes__builtin_ia32_rdtsc()
,这个函数现在已经被广泛地支持于各种编译器(如gcc/clang)中。 - Henrique Bucher