REGSITER_TM_CLONES中的Shift操作有什么用?
What‘s the purpose for the Shift operation in the REGSITER_TM_CLONES?
看汇编代码的时候,不太明白register_tm_clones中的移位操作是什么意思。 shift操作的作用是什么?
对比汇编代码和源代码,我以为我明白了SUB RAX的目的,6020F8H.The操作与源代码中的SIZE有关code.BecaauseSIZE的值为零,我猜汇编代码是(TMC_END - TMC_LIST的实现。调试时发现FOR可以只执行一次,甚至跳过size++直接执行IF语句
源代码:
register_tm_clones (void)
{
void (*fn) (void *, size_t);
size_t size;
#ifdef HAVE_GAS_HIDDEN
size = (__TMC_END__ - __TMC_LIST__) / 2;
#else
for (size = 0; __TMC_LIST__[size * 2] != NULL; size++)
continue;
#endif
if (size == 0)
return;
fn = _ITM_registerTMCloneTable;
__asm ("" : "+r" (fn));
if (fn)
fn (__TMC_LIST__, size);
}
#endif /* USE_TM_CLONE_REGISTRY */
汇编代码:
register_tm_clones proc near
mov eax, 6020F8h ;.bss
push rbp
sub rax, 6020F8h ;.bss
sar rax, 3
mov rbp, rsp ; return address
mov rdx, rax
shr rdx, 3Fh
add rax, rdx
sar rax, 1
jnz short loc_400C24
loc_400C22:
pop rbp
retn
loc_400C24:
mov edx, 0
test rdx, rdx
jz short loc_400C22
pop rbp
mov rsi, rax
mov edi, 6020F8h
jmp rdx
register_tm_clones endp
想知道这段汇编代码对具体操作的作用。当然,这里主要还是想知道shift操作的目的。如果我能理解这一点,我就更有可能解决其他问题。 (可能是我之前对代码的理解有一些错误,希望大家指出)
汇编代码中不存在 for
。编译器永远不会看到它,因为如果设置了 HAVE_GAS_HIDDEN
,它会被预处理器删除,这里恰好是这种情况。
sar rax, 3
是指针运算的结果,__TMC_LIST__
中的项目大小为8字节,即2^3。
另外两个移位是带符号的除以二。它以这种方式实现以遵循负数的舍入规则。当然这不是必需的,但可怜的编译器不知道 __TMC_END__ - __TMC_LIST__ >= 0
.
看汇编代码的时候,不太明白register_tm_clones中的移位操作是什么意思。 shift操作的作用是什么?
对比汇编代码和源代码,我以为我明白了SUB RAX的目的,6020F8H.The操作与源代码中的SIZE有关code.BecaauseSIZE的值为零,我猜汇编代码是(TMC_END - TMC_LIST的实现。调试时发现FOR可以只执行一次,甚至跳过size++直接执行IF语句
源代码:
register_tm_clones (void)
{
void (*fn) (void *, size_t);
size_t size;
#ifdef HAVE_GAS_HIDDEN
size = (__TMC_END__ - __TMC_LIST__) / 2;
#else
for (size = 0; __TMC_LIST__[size * 2] != NULL; size++)
continue;
#endif
if (size == 0)
return;
fn = _ITM_registerTMCloneTable;
__asm ("" : "+r" (fn));
if (fn)
fn (__TMC_LIST__, size);
}
#endif /* USE_TM_CLONE_REGISTRY */
汇编代码:
register_tm_clones proc near
mov eax, 6020F8h ;.bss
push rbp
sub rax, 6020F8h ;.bss
sar rax, 3
mov rbp, rsp ; return address
mov rdx, rax
shr rdx, 3Fh
add rax, rdx
sar rax, 1
jnz short loc_400C24
loc_400C22:
pop rbp
retn
loc_400C24:
mov edx, 0
test rdx, rdx
jz short loc_400C22
pop rbp
mov rsi, rax
mov edi, 6020F8h
jmp rdx
register_tm_clones endp
想知道这段汇编代码对具体操作的作用。当然,这里主要还是想知道shift操作的目的。如果我能理解这一点,我就更有可能解决其他问题。 (可能是我之前对代码的理解有一些错误,希望大家指出)
汇编代码中不存在 for
。编译器永远不会看到它,因为如果设置了 HAVE_GAS_HIDDEN
,它会被预处理器删除,这里恰好是这种情况。
sar rax, 3
是指针运算的结果,__TMC_LIST__
中的项目大小为8字节,即2^3。
另外两个移位是带符号的除以二。它以这种方式实现以遵循负数的舍入规则。当然这不是必需的,但可怜的编译器不知道 __TMC_END__ - __TMC_LIST__ >= 0
.