如果我声明这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问题,但不能解决ac

关于c - 阵列和组装,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9952426/

10-12 07:04