Добрый день. Такая проблема. Надо в С++ используя ассамблерные вставки написать прогу по суммированию эллементов в многомерном массиве. Возникла проблема с адрессацией на много мерный массив. Как это правильно делается? Вот код того что я навоял. Код (Text): int main(int argc, char* argv[]) { cout<<"\n"<<sizeof(short int)<<"\n"; int mas[5][5]; short int otr[5]; short int a; short int i=0,j=0; for(i=0;i<5;i++) { for(j=0; j<5; j++) { cout<<"enter mas["<<i<<"]["<<j<<"]->"; cin>> mas[i][j]; } } __asm { mov SI,0 mov AX,0 mov CX,5 mov bx, 0 label_i: mov dx, cx mov di,0; mov cx,5 mov j, 0 label_j: xor ax, ax mov al, mas[bx][di] add a,ax inc di loop label_j mov cx, dx inc bx loop label_i } cout<<"a=="<<a; return 0; } при компиляции в VC6.0 получаю следующую ошиби. error C2402: 'bx' : register must be index in 'second operand' error C2432: illegal reference to 16-bit data in 'second operand'
slow Ясно дело не то. Массив-то в стэке объявлен. witcher Массив нужно объявлять глобально. Тогда его смещение будет известно еще на стадии компиляции.
Если я правильно понял автора, то ему требуется примерно следующее: Код (Text): #include <stdio.h> #define M 5 #define N 5 int main(int argc, char **argv) { int summ = 0, i, j, arr[M][N]; for (i = 0; i < M; i++) for (j = 0; j < N; j++) arr[i][j] = i; __asm { xor edx, edx mov i, 0 l00p1: cmp i, M jge exit1 mov j,0 l00p2: cmp j, N jge exit2 lea ebx, dword ptr [arr] mov eax, i imul eax, N add eax, j add edx, [ebx + eax * 4] inc j jmp l00p2 exit2: inc i jmp l00p1 exit1: mov dword ptr [summ], edx } printf("%d\n", summ); return 0; }
Mika0x65 Вообще автор должен был бы сам дойти до того, что mas[ebx][edi] не даст элемент массива с координатами ebx, edi. А основным камнем преткновения были ошибки компиляции. И... если не возражаете, пара замечаний от чайника: Макроопределения для M и N Вы сделали, а условие выхода из вложенного цикла все равно cmp j, 5. И еще... summ объявлен, как int, а Вы по его адресу целых четыре байта пишете!
10110111 Блин. Внатуре. В принципе в разных компиляторах по разному, но я всегда думал, что в VC6 именно два. Спасибо. Ну собсно какой спрос с чайника...
witcher Код (Text): int mas[M][N]; xor eax,eax; место под сумму eax и edx cdq; очищаем edx mov ecx,M*N; общее количество элементов a1: add eax,mas[ecx*4-4] adc edx,0; если перенос -- заполняем edx loop a1 Массив любого порядка на самом деле в памяти представлен как одномерный. И всё!)
Mikl__ Да ну! Даже такой? Код (Text): matrPtr = (double**) new double[maxH]; for (par1=0; par1<maxH; par1++) matrPtr[par1] = new double[maxW];
l_inc Честно скажу, с массивами, которые содержат указатели на указатели других массивов не сталкивался. Но вот для задач по поиску минимума/максимума, либо для нахождения суммы/произведения всех элементов массива, либо по заполнению массива каким-нибудь значением -- во вложенных циклах обращаться к каждому элементу массива, через сложное вычисление его индекса, как это делает топикстартер -- IMHO проще обработать весь массив как одномерный, результат будет одним и тем же!