如果我声明这3个数组
int a[10][10];
int b[10][15];
int c[10][30];
对于这三个数组中的哪一个,程序集代码会返回[i][j]元素吗?假设数组的起始地址存储在%ebx中。
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx /* index i */
movl 12(%ebp), %ecx /* index j */
movl %edx, %eax
sall $4, %eax
subl %edx, %eax
addl %ecx, %eax
movl (%ebx,%eax,4), %eax
popl %ebp
ret
你如何解决这类问题
最佳答案
我会做一些手写的数学笔记,比如:
movl 8(%ebp), %edx /* index i */
-> edx = i
movl 12(%ebp), %ecx /* index j */
-> ecx = j
movl %edx, %eax
-> eax = i
sall $4, %eax
-> eax = 16 * i
subl %edx, %eax
-> eax -= i, thus:
-> eax = 16 * i - i = 15 * i
addl %ecx, %eax
-> eax += j, thus:
-> eax = 15 * i + j
movl (%ebx,%eax,4), %eax
-> eax = array[4 * eax], thus:
-> eax = array[sizeof(int) * (15 * i + j)]
因此,在
eax
中,在ebx
位置,你得到给定数组中的内容(由15 * i + j
指向开头)。这可以正确地解决:int数组
第一个(最右)维度为15的数组
考虑到这个和你的三个数组:
int a[10][10];
int b[10][15];
int c[10][30];
这可以正确地解决
b
问题,但不能解决a
或c
。关于c - 阵列和组装,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9952426/