2013-02-16 4 views
2

C 버전 :이해 ATT 어셈블리 언어

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; 
} 
동일한 프로그램

ATT 어셈블리 버전 %의 EBP에서 %의 EBP + 12, Z에서의 %의 EBP + 8, Y에

X + 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 번 이동한다고 가정합니다. 왜 그런가요?

감사합니다.

편집 : 혼란스러워하는 부분은 C 버전의 z * 48 부분과 같습니다.

내가 이해하지 못하는 것은 4 배 왼쪽으로 시프트하는 것이 z * 48과 같은지입니다.

+0

왼쪽으로 4 자리 씩 이동하면 본질적으로 16이 곱 해집니다. –

답변

1

leal (%eax, %eax, 2), %eax 행을 놓쳤습니다. 일부 계산을 적용하면 어셈블리 코드가 읽습니다.

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