如何在数组[M] [N]中找到M和N的值?

时间:2015-11-12 13:10:51

标签: assembly x86 ia-32

考虑下面的源代码,其中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的值是什么?

1 个答案:

答案 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。