Двухмерный массив (нужна помощь)

Пишу программу нужно посчитать сумму элементов двумерного массива Но я его либо не так объявляю либо не так обращаюсь Помогите кто нить новичку
.radix 10
.386
.model flat, stdcall
option casemap:none
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.data
mas db 23,4,5,67,5,6,7,99,67,8,9,23,87,9,3
.code
start:
mov eax,0
mov ecx,0
mov eax,0
mov esi,0 ;si=столбцы в матрице
mov edi,0; bx=строки в матрице
mov cx,3
mov ax,mas[si][di] ;в ax первый элемент матрицы
external: ;внешний цикл по строкам
push cx ;сохранение в стеке счётчика
 ;внешнего цикла
mov cx,5 ;число для внутреннего цикла
 ;(по столбцам)
mov si,0
iternal: ;внутренний цикл по строкам
inc esi ;передвижение на следующий элемент
 ;в строке
add ax, mas[si][di] ;добавляем в регистр ах элемент массива
loop iternal
pop cx ;восстанавливаем CX из стека (5)
add di,1 ;передвигаемся на следующую строку
loop external ;цикл (внешний)
invoke ExitProcess, 0
end start
HelpMe)
7 ответов

в чём проблема то? код не проверял, но вроде должен работать.....


в чём проблема то? код не проверял, но вроде должен работать.....
Резуль работу программы отслеживаю через Olly когда идет обращение к mas[0][0] то берется верный элемент 4... Следущий же элемент mas[0][1] мало того что записывается в регистр ah да еще и вывернутый... Как я предполагаю, я неправильно обращаюсь к элементам заданного массива. Надеюсь понятно


Аццкая смесь 32-битного и 16-битного кода! Перепиши «с нуля». Ассемблер — не язык высокого уровня, поэтому обращаться к двумерному массиву, расположенному по метке mas нельзя как просто к mas [si][di], потому как не существует такого режима адресации у процессора. Например, если есть массив 5 х 3 байт и надо обратиться к элементу с индексом [4,1] (zero-based indices), то следует преобразовать этот индекс в линейное смещение, в данном случае это будет 4+1*5=9, то есть, искомый элемент будет находиться на 9 байт «дальше» самого первого байта массива. Для умножения используй инструкцию imul, для косвенной адресации — инструкции типа mov edx, byte ptr [eax+mas], если в eax — линейное смещение элемента.


Я так и предполагал... А можно конкретизировать обращение к элементам массива именно для этой программы


тем более у тебя данные размером в байт, а ты используешь ax поэтому данные перевёрнутые и индексы неправильные, значит ты должен вместо add ax, mas[si][di] делать так mov bl, mas[edi] add ax, bxв общем передалай весь код под 32 битность


Все, спасибо ребят разобрался... Могу выложить исходник если для поисковиков понадобится ... Другой вопрос теперь появился как реализовать работу со случайными и вещественными числами?)


По вещественным числам смотри, например, тут: http://www.ray.masmcode.com/ А по генераторам случайных чисел — http://agner.org/random/