Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 04.05.2007, 01:56   #1
brit
 
Аватар для brit
 
Регистрация: 04.05.2007
Сообщений: 4
Вопрос Двухмерный массив (нужна помощь)

Пишу программу нужно посчитать сумму элементов двумерного массива
Но я его либо не так объявляю либо не так обращаюсь
Помогите кто нить новичку

Код:
.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)
brit вне форума Ответить с цитированием
Старый 04.05.2007, 20:15   #2
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию

в чём проблема то? код не проверял, но вроде должен работать.....
rpy3uH вне форума Ответить с цитированием
Старый 05.05.2007, 00:34   #3
brit
 
Аватар для brit
 
Регистрация: 04.05.2007
Сообщений: 4
По умолчанию

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
в чём проблема то? код не проверял, но вроде должен работать.....
Резуль работу программы отслеживаю через Olly когда идет обращение к mas[0][0] то берется верный элемент 4... Следущий же элемент mas[0][1] мало того что записывается в регистр ah да еще и вывернутый... Как я предполагаю, я неправильно обращаюсь к элементам заданного массива. Надеюсь понятно
brit вне форума Ответить с цитированием
Старый 05.05.2007, 00:56   #4
Alexander77
Пользователь
 
Аватар для Alexander77
 
Регистрация: 27.04.2007
Сообщений: 13
По умолчанию

Аццкая смесь 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 — линейное смещение элемента.
Alexander77 вне форума Ответить с цитированием
Старый 05.05.2007, 01:47   #5
brit
 
Аватар для brit
 
Регистрация: 04.05.2007
Сообщений: 4
По умолчанию

Я так и предполагал... А можно конкретизировать обращение к элементам массива именно для этой программы
brit вне форума Ответить с цитированием
Старый 05.05.2007, 07:37   #6
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию

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

в общем передалай весь код под 32 битность
rpy3uH вне форума Ответить с цитированием
Старый 07.05.2007, 02:08   #7
brit
 
Аватар для brit
 
Регистрация: 04.05.2007
Сообщений: 4
По умолчанию

Все, спасибо ребят разобрался... Могу выложить исходник если для поисковиков понадобится ... Другой вопрос теперь появился как реализовать работу со случайными и вещественными числами?)
brit вне форума Ответить с цитированием
Старый 07.05.2007, 04:03   #8
Alexander77
Пользователь
 
Аватар для Alexander77
 
Регистрация: 27.04.2007
Сообщений: 13
По умолчанию

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача Pascal на массив (нужна помощь) STIG_E70 Помощь студентам 4 18.06.2008 20:19
двухмерный массив Enchantner Паскаль, Turbo Pascal, PascalABC.NET 3 22.04.2008 20:47
Двухмерный массив xtraSHAD0W Паскаль, Turbo Pascal, PascalABC.NET 2 22.04.2008 18:17
Двухмерный массив (кинозал) fudzy79 Помощь студентам 3 10.04.2008 00:07
Двухмерный массив Atheist Общие вопросы C/C++ 4 22.11.2007 15:05


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS