2011-09-04 174 views
1
理解生成的彙編代碼
#define M 20 
#define N 20 
void main() 
{ 
    int i,j; 
    int A[M][N] = {0}; 
    for (i=0; i < M; i++) 
    { 
     for (j=0; j< N; j++) 
     { 
      //A[i][j +1] = A[i][j] + 5; 
      A[i][j] = 0; 
     } 
    } 
    printf("%d\n", A[2][3]); 
} 

生成的彙編代碼是幫助需要從C

main: 
    pushl %ebp 
    xorl %eax, %eax 
    pxor %xmm0, %xmm0 
    movl %esp, %ebp 
    andl -16, %esp 
    pushl %edi 
    movl 400, %ecx 
    subl 1628, %esp 
    leal 16(%esp), %edi 
    rep stosl 
    leal 16(%esp), %edx 
    leal 1616(%esp), %eax 
    .p2align 4,,7 
    .p2align 3 
.L2: 
    movdqa %xmm0, (%edx) 
    movdqa %xmm0, 16(%edx) 
    movdqa %xmm0, 32(%edx) 
    movdqa %xmm0, 48(%edx) 
    movdqa %xmm0, 64(%edx) 
    addl 80, %edx 
    cmpl %eax, %edx 
    jne .L2 
    movl 188(%esp), %eax 
    movl .LC0, (%esp) 
    movl %eax, 4(%esp) 
    call printf 
    addl 1628, %esp 
    popl %edi 
    movl %ebp, %esp 
    popl %ebp 
    ret 

我不能夠理解從主高達標籤L2的彙編代碼。該彙編代碼使用自動矢量化進行了優化。 在此先感謝。

+2

它設置一個堆棧幀並將'A'初始化爲零。你究竟有什麼困難的理解? – user786653

+1

什麼用的以下說明: 和L -16,ESP%萊亞爾 16(%ESP),電子數據交換%萊亞爾 16(%ESP),EDX%萊亞爾 1616(%ESP),%eax中 – PhantomM

回答

5
pushl %ebp   ; save the old %ebp value 
xorl %eax, %eax ; clear %eax 
pxor %xmm0, %xmm0 ; clear %xmm0 
movl %esp, %ebp 
andl -16, %esp 
pushl %edi   ; save edi ^--- you have to restore all these value on function return. 

movl 400, %ecx 
subl 1628, %esp ; allocate 1628 bytes from stack 
leal 16(%esp), %edi ; load address of A to %edi 
rep stosl    ; repeat cx(400) time, clear the memory -- this initialize "A" as {0} 
+0

感謝您的幫助。 什麼用的以下說明: 和L -16,ESP%萊亞爾 16(%ESP),電子數據交換%萊亞爾 16(%ESP),EDX%萊亞爾 1616(%ESP),%eax中 – PhantomM

+1

'16(% esp)'是指向'A'的指針。 'leal 16(%esp),%edi'加載到'%edi'(代表'stosl') –

+0

'1616(%esp)'是另一個局部變量的地址..我想它是'i',但我懶得檢查。 –