如何在以下程序集中计算C宏表达式的定义?
我在做作业时遇到了很多困难。我有以下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
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