考虑下面的源代码,其中N是用#define声明的常量

时间:2018-11-08 05:36:54

标签: c assembly

 typedef int mat[n][n] //(size_t is defined as unsigned long, which is 8 bytes on x84-64 machines)

 int ele(mat a, size_t i, size_t j){
     return a[i][j];
 }

假设这会生成以下汇编代码:

   ele:
     salq $6, %rsi  // i= i<< 6 = 64i
     addq %rsi, %rdi // a= a + i = a +64i
     movl(%rdi, %rdx, 4), %eax // result = a + 4*j = a + 64i + 4j = a + 8*8*i + 8*1/2*j, since the size(t) = 8

目标是找到n = ____?我上了n = 8,您可以在注释中看到我的步骤。但是,正确答案是n =16。有人可以帮助我找出错误的地方

1 个答案:

答案 0 :(得分:1)

result = a + 64i + 4j = a + 8*8*i + 8*1/2*j, since the size(t) = 8

您在此处使用8进行扩展是错误的。这样看吧。

a + 64i + 4j = a + 16*4i + 4j

此处a是数组的基地址。 i是行选择器。每行包含16个大小为4(sizeof int)的元素,而您跳过i这样的行以获得第i行的基址。然后,您跳过4j个字节(j个整数)到达所需的列。

我不知道您的最终目标是什么,但是如果您只想找到n,那么您只需完成

sqrt(sizeof(mat)/sizeof(int))

假设您确定它是一个正方形的int数组。