Какова цель операции Shift в REGSITER_TM_CLONES? - PullRequest
0 голосов
/ 29 декабря 2018

Когда я смотрю на ассемблерный код, я не совсем понимаю, что означает смещение операций в register_tm_clones.Какова роль операции сдвига?

Сравнивая ассемблерный код с исходным кодом, я подумал, что понял назначение SUB RAX , 6020F8H. Операция связана с SIZE в исходном коде. Так как значениеSIZE равен нулю, я догадался, что ассемблерный код является реализацией ( TMC_END - TMC_LIST ). Во время отладки я обнаружил, что FOR можно выполнить только один раз или даже пропустить размер ++выполнить оператор 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 голосов
/ 29 декабря 2018

for отсутствует в коде сборки.Он никогда не будет виден компилятору, потому что он удаляется препроцессором, если установлен HAVE_GAS_HIDDEN, что имеет место в данном случае.

sar rax, 3 обусловлено арифметикой указателей, как размер элементовв __TMC_LIST__ - 8 байтов, то есть 2 ^ 3.

Два других сдвига - это знаковое деление на два.Он реализован таким образом, чтобы следовать правилам округления отрицательных чисел.Конечно, это не нужно, но плохой компилятор не знает, что __TMC_END__ - __TMC_LIST__ >= 0.

...