【发布时间】:2012-03-17 13:34:33
【问题描述】:
我正在尝试对 c 代码进行逆向工程,但我无法真正理解这部分程序集。我知道它是 SSE 扩展的一部分。但是,有些东西确实与我在 x86 指令中习惯的不同。
static int sad16_sse2(void *v, uint8_t *blk2, uint8_t *blk1, int stride, int h)
{
int ret;
__asm__ volatile(
"pxor %%xmm6, %%xmm6 \n\t"
ASMALIGN(4)
"1: \n\t"
"movdqu (%1), %%xmm0 \n\t"
"movdqu (%1, %3), %%xmm1 \n\t"
"psadbw (%2), %%xmm0 \n\t"
"psadbw (%2, %3), %%xmm1 \n\t"
"paddw %%xmm0, %%xmm6 \n\t"
"paddw %%xmm1, %%xmm6 \n\t"
"lea (%1,%3,2), %1 \n\t"
"lea (%2,%3,2), %2 \n\t"
"sub $2, %0 \n\t"
" jg 1b \n\t"
: "+r" (h), "+r" (blk1), "+r" (blk2)
: "r" ((x86_reg)stride)
);
__asm__ volatile(
"movhlps %%xmm6, %%xmm0 \n\t"
"paddw %%xmm0, %%xmm6 \n\t"
"movd %%xmm6, %0 \n\t"
: "=r"(ret)
);
return ret;
}
%1、%2 和 %3 是什么? (%1,%2,%3) 是什么意思?还有“+r”、“-r”、“=r”是什么意思?
【问题讨论】:
-
这段代码对两个不相交的内联汇编块的使用是无效的;它可能有效,但不能保证,因为编译器以其无限的智慧可能会选择在进入之前对第二个
__asm__块的“未声明的输入”(regs%xmm0/%xmm6)做一些事情。有关如何解决此问题的详细信息,请参阅stackoverflow.com/questions/8891139/…。