Когда я смотрю на ассемблерный код, я не совсем понимаю, что означает смещение операций в 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
Я хотел бы знать роль этого кода сборки для конкретныхоперация.Конечно, главное все же захотеть узнать цель операции смены здесь.Если я смогу это понять, мне будет легче решить другие проблемы.(Возможно, у меня были некоторые ошибки в моем предыдущем понимании кода, и я надеюсь, что вы можете указать на это)