REGSITER_TM_CLONES中的Shift操作的目的是什么?

时间:2018-12-29 07:34:52

标签: gcc assembly gcc4.8

在查看汇编代码时,我不太了解在register_tm_clones中转移操作的含义。移位操作的作用是什么?

将汇编代码与源代码进行比较,我认为我已经了解了SUB RAX的目的,6020F8H。该操作与源代码中的SIZE有关。由于SIZE的值为零,我猜想汇编代码就是实现( 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

我想知道此汇编代码对特定操作的作用。当然,主要的人仍然想知道此处的移位操作的目的。如果我能理解这一点,那么我更有可能解决其他问题。 (也许我以前对代码的理解有些错误,希望您能指出来)

1 个答案:

答案 0 :(得分:3)

for不存在于汇编代码中。编译器永远不会看到它,因为如果设置了HAVE_GAS_HIDDEN,预处理器会删除它,这恰好是这种情况。

sar rax, 3是由于指针算法所致,因为__TMC_LIST__中项的大小为8个字节,即2 ^ 3。

另外两个班次是有符号除以2。它的实现方式是遵循负数的四舍五入规则。当然不需要,但是可怜的编译器不知道__TMC_END__ - __TMC_LIST__ >= 0