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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

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

Код:
.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,806
Репутация: 2006
По умолчанию

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

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

Аццкая смесь 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
Репутация: 10
По умолчанию

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

тем более у тебя данные размером в байт, а ты используешь 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
Репутация: 10
По умолчанию

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


21:25.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.