2013-02-16 3 views
2

С:Понимание АТТ ассемблере

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.

+0

Смещение влево на 4 места по существу умножается на 16. – 2013-02-16 22:29:16

ответ

1

Вы пропустили линию leal (%eax, %eax, 2), %eax. Применяя некоторые математические данные, код сборки выглядит следующим образом:

 
a := x 
a := a + 2*a // a = 3*x 
a := a * 2^4 // a = x * 3*16