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。有人可以帮助我找出错误的地方
答案 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数组。