8
Dla tego kawałka kodu C:Dlaczego gcc movl do tego samego rejestru?
uint64_t roundUp(uint64_t value, uint32_t blockSize)
{
return (value + blockSize - 1) & ~(blockSize - 1);
}
gcc 4.6 -O3 wygenerowany następujący montaż:
roundUp(unsigned long, unsigned int):
.LFB0:
.cfi_startproc
movl %esi, %edx
movl %esi, %esi
leaq -1(%rdi,%rsi), %rax
negl %edx
andl %edx, %eax
ret
.cfi_endproc
Czy ktoś może mi powiedzieć, dlaczego ona chce to zrobić?
movl %esi, %esi
ale instrukcja bezpośrednio powyżej pisze do esi – wowest
@wowest Nie, to nie jest składnia intel. Operand przeznaczenia jest drugim. –
@ughoavgfhw to oświecające, dzięki. Czy chciałbyś również wyjaśnić, w jaki sposób (blockSize - 1) kończy się w% edx? Widzę, jak kończy się blockSize, ale blockSize - 1? –