如何在以下程序集中计算C宏表达式的定义?

如何在以下程序集中计算C宏表达式的定义?,c,assembly,x86,C,Assembly,X86,我在做作业时遇到了很多困难。我有以下C代码和后续程序集: int foo(int n, int A[X(n)][Y(n)], int j){ int i; int result = 0; for (i = 0; i < X(n); i++) result += A[i][j]; return result; } movl 8(%ebp), %eax leal (%eax,%eax), %edx leal (%edx,%ea

我在做作业时遇到了很多困难。我有以下C代码和后续程序集:

int foo(int n, int A[X(n)][Y(n)], int j){
    int i;
    int result = 0;
    for (i = 0; i < X(n); i++)
        result += A[i][j];
    return result;
}

movl    8(%ebp), %eax
leal    (%eax,%eax), %edx
leal    (%edx,%eax), %ecx
movl    %edx, %ebx
leal    1(%edx), %eax
movl    $0, %edx
testl   %eax, %eax
jle     .L3
leal    0(,%ecx,4), %esi
movl    16(%ebp), %edx
movl    12(%ebp), %ecx
leal    (%ecx,%edx,4), %eax
movl    $0, %edx
movl    $1, %ecx
addl    $2, %ebx
.L4:
addl    (%eax), %edx
addl    $1, %ecx
addl    %esi, %eax  
cmpl    %ebx, %ecx
jne     .L4
.L3:
movl    %edx, %eax
_foo:
    ;Prologue (assumed)
    push ebp
    mov ebp,esp

    ;Pre-scale N
    mov eax,[ebp+8]
    lea edx,[eax+eax]
    lea ecx,[edx+eax]   ;ECX = N*3
    mov ebx,edx         ;EBX = N*2

    ;Bail out earily if X(n) <= 0
    lea eax,[edx+1]     ;EAX = N*2+1
    mov edx,0
    test eax,eax        ;(OF=0)
    jle @@end           ;Proceed if N*2+1 > 0

    ;Prepare loop counters
    lea esi,[ecx*4]     ;ESI = N*3*sizeof int, array stride
    mov edx,[ebp+16]    ;EDX = j
    mov ecx,[ebp+12]
    lea eax,[ecx+edx*4] ;EAX = &A[0][j]

    mov edx,0           ;EDX = 0, accumulator
    mov ecx,1           ;ECX = 1, loop counter
    add ebx,2           ;EBX = N*2+2

    ;Step through the loop
@@loop:
    add edx,[eax]       ;EDX += A[i][j]
    add ecx,1           ;Increment loop counter
    add eax,esi         ;++A
    cmp ecx,ebx
    jne @@loop          ;[1..N*2+2) <=> [0..N*2+1)

@@end:
    ;Epilogue
    mov eax,edx         ;Return the sum
    pop ebp
    ret
intfoo(intn,inta[X(n)][Y(n)],intj){
int i;
int结果=0;
对于(i=0;i
我需要找出X和Y的定义。我认为n最初存储在eax中,然后2n存储在edx中,3n存储在ecx中。所以我认为esi等于3n*4。另外,由于结果最初存储为movl$0,%edx,并且以下几行加一,我认为X等于#定义X(n+1)。另外,我相信addl%esi,%eax将是Y。那么既然esi=%ecx*4Y=4n?然而,这就是我开始感到严重困惑的地方。谢谢大家。

可爱的运动

该声明似乎将A定义为C99可变长度数组。顺便说一句,它们的编译器支持非常差,在C11中是可选的

然后可以从循环迭代中的数组跨步推断出内部Y(n)维度,其中EAX是指针,ESI是音高,似乎定义为n*3。对于X(n),我们可以从i=0时的循环入口条件推断它,它似乎扩展为n*2+1

#define X(n) ((n)*2+1) 
#define Y(n) ((n)*3)
带注释的部件:

int foo(int n, int A[X(n)][Y(n)], int j){
    int i;
    int result = 0;
    for (i = 0; i < X(n); i++)
        result += A[i][j];
    return result;
}

movl    8(%ebp), %eax
leal    (%eax,%eax), %edx
leal    (%edx,%eax), %ecx
movl    %edx, %ebx
leal    1(%edx), %eax
movl    $0, %edx
testl   %eax, %eax
jle     .L3
leal    0(,%ecx,4), %esi
movl    16(%ebp), %edx
movl    12(%ebp), %ecx
leal    (%ecx,%edx,4), %eax
movl    $0, %edx
movl    $1, %ecx
addl    $2, %ebx
.L4:
addl    (%eax), %edx
addl    $1, %ecx
addl    %esi, %eax  
cmpl    %ebx, %ecx
jne     .L4
.L3:
movl    %edx, %eax
_foo:
    ;Prologue (assumed)
    push ebp
    mov ebp,esp

    ;Pre-scale N
    mov eax,[ebp+8]
    lea edx,[eax+eax]
    lea ecx,[edx+eax]   ;ECX = N*3
    mov ebx,edx         ;EBX = N*2

    ;Bail out earily if X(n) <= 0
    lea eax,[edx+1]     ;EAX = N*2+1
    mov edx,0
    test eax,eax        ;(OF=0)
    jle @@end           ;Proceed if N*2+1 > 0

    ;Prepare loop counters
    lea esi,[ecx*4]     ;ESI = N*3*sizeof int, array stride
    mov edx,[ebp+16]    ;EDX = j
    mov ecx,[ebp+12]
    lea eax,[ecx+edx*4] ;EAX = &A[0][j]

    mov edx,0           ;EDX = 0, accumulator
    mov ecx,1           ;ECX = 1, loop counter
    add ebx,2           ;EBX = N*2+2

    ;Step through the loop
@@loop:
    add edx,[eax]       ;EDX += A[i][j]
    add ecx,1           ;Increment loop counter
    add eax,esi         ;++A
    cmp ecx,ebx
    jne @@loop          ;[1..N*2+2) <=> [0..N*2+1)

@@end:
    ;Epilogue
    mov eax,edx         ;Return the sum
    pop ebp
    ret
\u foo:
;序言(假定)
推ebp
电动汽车
;预刻度
mov eax,[ebp+8]
lea edx,[eax+eax]
lea ecx,[edx+eax];ECX=N*3
mov ebx、edx;EBX=N*2
;如果X(n)0,则提前退出
;准备循环计数器
lea esi,[ecx*4];ESI=N*3*sizeof int,数组步长
移动edx,[ebp+16];EDX=j
mov ecx,[ebp+12]
lea-eax,[ecx+edx*4];EAX=&A[0][j]
mov-edx,0;EDX=0,累加器
mov-ecx,1;ECX=1,循环计数器
添加ebx,2;EBX=N*2+2
;循环往复
@@循环:
添加edx,[eax];EDX+=A[i][j]
添加ecx,1;递增循环计数器
添加eax、esi++A.
cmp-ecx,ebx
jne@@loop;[1..N*2+2][0..N*2+1)
@@完:
后记
mov eax,edx;返回总和
流行ebp
ret