int arith(int x, int y, int z)
{
int t1 = x+y;
int t2 = z*48;
int t3 = t1 & 0xFFFF;
int t4 = t2 * t3;
return t4;
}
версия
АТТ Сборка одной и той же программы:
х в% EBP + 8, у в% EBP + 12, г в% EBP + 16
movl 16(ebp), %eax
leal (%eax, %eax, 2), %eax
sall $4, %eax // t2 = z* 48... This is where I get confused
movl 12(%ebp), %edx
addl 8(%ebp), %edx
andl $65535, %edx
imull %edx, %eax
Я понимаю все, что он делает во всех точках программы, кроме сдвига влево.
Я предполагаю, что он сдвинется влево 4 раза. Почему это?
Спасибо!
Редактирование: Я также понимаю, что часть, с которой я запутался, эквивалентна части z * 48 версии C.
То, что я не понимаю, это то, как сдвиг влево 4 раза приравнивается к z * 48.
Смещение влево на 4 места по существу умножается на 16. – 2013-02-16 22:29:16