2014-10-13 4 views
-3

C 코드와 어셈블리 코드가 있습니다. 조립 된 코드의 3 행 및 6 행을 이해하지 못합니다.조립 된 코드 줄을 이해하고 65535 % edx

C 코드 :

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; 
} 

어셈블리 코드 : 65535 우리가 t3 = t1 & 0xFFFF이 너무 0xFFFF이되는 방법 6 행에

x at % ebp+8, y at %ebp*12, z at %ebp+16 
    mol 16(%ebp), %eax 
    leal (%eax, %eax, 2) % eax 
    sall $4, %eax 
    movl 12(%ebp) %edx 
    addl 8(%ebp) %edx 
    andl $65535, %edx 
    imull %edx. $eax 

, 이해가 안 돼요.

다른 질문 : 타입 정의하여 선언 num_t이 데이터 형식은 다음과 C의 functino 프로토 타입을 고려해

dest at %ebp+8, x at ebp+12, y at %ebp+16 
mov1 12($ebp), $eax 
movl 20($ebp), $ecx 
imull $eax, $ecx 
mull 16(%ebp) 
leal (%ecx,%edx), %edx 
movl 8(%ebp), %ecx 
movl %eax, (%ecx) 
movl %edx, 4(%ecx) 
:

void store_prod(num_t *dest, unsigned x, num_t y) 
{*dest=x*yl} 

GCC는 계산의 몸체를 구현 다음 assemblyu 코드를 생성

line movl 20 (% ebp), % ecx 20 (% ebp)의 값이 있습니다. y_t를 잡는 방법은 무엇입니까? 라인 룰 (% ecx, % edx), % edx; edx에는 아무 것도 없나요? 그래서 % ecx에 % edx에 저장하기 위해 추가되는 것은 무엇입니까?

+4

숫자는 같지만 표현이 다릅니다. 0xFFFF는 십진수 65535의 16 진수 표현입니다. –

+0

https://www.google.com/search?q=0xFFFF –

+2

델파이와 같은 일부 언어에서 $는 다음과 같은 16 진수 값을 나타내지 만 GAS 구문 (http : // en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax) 그것은 리터럴 값을 의미합니다. –

답변

0

우리 계산할

T2 = Z * 그래서

48 우리가 먼저 수행하는 것이 수행에있어서, Z = Z * 3은 다음 (4 시프트 왼쪽 16 == 곱한다) (4)에 의해 좌 Z 시프트

라인 (3)은 계산

Z = Z * 3 (Z + 2Z)

라인 4 4

,369 의해 시프트 좌측 않는다

컴파일러는 종종 곱셈이 더 많은 비용이 드는 것처럼 곱셈을 수행하기 위해 더하기와 쉬프트의 조합을 생성합니다.
6 번 라인은 0xFFFF에 대해 10 진수입니다.