这在 Valgrind 的
VALGRIND_DO_CLIENT_REQUEST_EXPR
中意味着什么?
__asm__ volatile (
"rolq $3, %%rdi ; rolq $13, %%rdi\n\t"
"rolq $61, %%rdi ; rolq $51, %%rdi\n\t"
"xchgq %rbx, %rbx"
: "=d" (_zzq_result)
: "a" (&_zzq_args[0]), "0" (_zzq_default)
: "cc", "memory"
)
似乎有些黑魔法。
VALGRIND_DO_CLIENT_REQUEST_EXPR
和相关宏允许用户向 Valgrind 工具发送自定义请求。
这些请求以特定格式进行编码,通常涉及以 Valgrind 可以识别和解释的方式操作寄存器和内存。
说明详情:
rolq
(向左循环,四字):将指定寄存器中的位向左循环给定的位置数。这实际上是一种按位运算,作为编码过程的一部分,它会模糊 rdi
中的数据。rolq
指令序列在rdi
寄存器上运行,该寄存器可能包含部分客户端请求负载。xchgq %rbx, %rbx
:这是一条无操作(无操作)指令,因为与自身交换寄存器不会执行任何操作。然而,它充当标记指令。 Valgrind 工具将此特定指令识别为处理编码请求的信号。操作数:
: "=d" (_zzq_result)
:指定装配块的输出。 =d
约束将输出放入 rdx
寄存器中,并分配给 _zzq_result
。: "a" (&_zzq_args[0]), "0" (_zzq_default)
:这些是装配块的输入。 &_zzq_args[0]
(参数数组的地址)位于 rax
中,而 _zzq_default
值放置在与第一个输出相同的寄存器中(寄存器 rdx
)。: "cc", "memory"
:破坏者表示程序集修改了条件代码 (cc
) 和内存。