考虑下面的源代码,其中M和N是用
声明的常量#define
int array1[M][N];
int array2[N][M];
void copy(int i, int j)
{
array1[i][j] = array2[j][i];
}
假设上面的代码生成以下汇编代码:
copy:
pushl %ebp
movl %esp,%ebp
pushl %ebx
movl 8(%ebp),%ecx
movl 12(%ebp),%eax
leal 0(,%eax,4),%ebx
leal 0(,%ecx,8),%edx
subl %ecx,%edx
addl %ebx,%eax
sall $2,%eax
movl array2(%eax,%ecx,4),%eax
movl %eax,array1(%ebx,%edx,4)
popl %ebx
movl %ebp,%esp
popl %ebp
ret
M和N的值是什么?
答案 0 :(得分:2)
首先,让我编写汇编代码,如C。
void copy(int i, int j)
{
int eax, ebx, ecx, edx;
ecx = i; /* movl 8(%ebp),%ecx */
eax = j; /* movl 12(%ebp),%eax */
ebx = eax * 4; /* leal 0(,%eax,4),%ebx */
edx = ecx * 8; /* leal 0(,%ecx,8),%edx */
edx -= ecx; /* subl %ecx,%edx */
eax += ebx; /* addl %ebx,%eax */
eax <<= 2; /* sall $2,%eax */
eax = *(int*)((char*)array2 + eax + ecx * 4); /* movl array2(%eax,%ecx,4),%eax */
*(int*)((char*)array1 + ebx + edx * 4) = eax; /* movl %eax,array1(%ebx,%edx,4) */
}
然后,合并一些表达式。
void copy(int i, int j)
{
int eax, edx;
eax = (j + j * 4) * 4;
edx = i * 8 - i;
*(int*)((char*)array1 + (4 * j) + edx * 4) = *(int*)((char*)array2 + eax + i * 4);
}
合并更多表达式。
void copy(int i, int j)
{
*(int*)((char*)array1 + (4 * j) + (4 * 7 * i)) = *(int*)((char*)array2 + (4 * i) + (4 * 5 * j));
}
array1[0]
的类型为int[N]
,array2[0]
的类型为int[M]
。
汇编代码将4个字节复制为array1[i][j]
和array2[j][i]
,因此int
在此环境中应为4个字节。
根据系数,我可以看到array2[0]
长4 * 5
个字节,array1[0]
长4 * 7
个字节。
array2[0]
的大小int[M]
的大小是M
大小的int
倍,因此M
应为5。
出于同样的原因,N
应为7。