Как вы собираетесь решать фиксированные константы массива, если у вас есть 3 измерения? Я могу вычислить, что код сборки получает формулу ((32k + j) 16 + i) в% rax для индексирования array2 и ((32i + j) 16 + k) в% rdx для индексации array1, но как эта помощь поможет найти константы M, N и L?Как найти фиксированные длины многомерных массивов по ассемблеру?
#define M ___________
#define N ____________
#define L ____________
int array1[M][N][L];
int array2[L][N][M];
int copyandsub(int i, int j, int k){
array1[i][j][k] = array2[k][j][i] - 1;
}
Ассемблерный код генерируется:
Copandsub:
movslq %edi, %rdi
movslq %edx, %rdx
movslq %esi, %rsi
movq %rdx, %rax
salq $5, %rax
addq %rsi, %rax
salq $4, %rax
addq %rdi, %rax
movl array2(,%rax,4), %eax
subl $1, %eax
salq $5, %rdi
addq %rdi, %rsi
salq $4, %rsi
addq %rsi, %rdx
movl %eax, array1(,%rdx,4)
ret
Это должно быть очевидно. Если вы посмотрите на каждый массив отдельно, вы должны знать размер последних двух измерений, но не первое измерение. –
Какие номера соответствуют M, N и L? K совпадает с L для массива 2, и мы имеем 32 в качестве нашего фактора. Но ответ, по-видимому, M = 16, N = 32 и L = 16. Я просто не знаю, как связать значения с правыми константами. –
'array1' - массив MxNxL. 'array1 [0]' - массив NxL, 'array1 [0] [0]' - массив длины L, 'array1 [0] [0] [0]' - это один 'int'. –