Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Ассемблер двумерный массив

to4ban to4ban Ученик (79), закрыт 13 лет назад
Доброго времени суток, необходимо выполнить задачку с массивом на асемблере, но не понимаю как сделать цикл на этом языке.
Нужно вычислить сумму всех эллементов двумерного массива A, размерностью 4*4 умноженые на B.
Тоесть к примеру если массив А:
|1 2 3|
|4 5 6|
|7 8 9|
А, переменная B = 5, должно получится:
С = (1 * 5) + (2 * 5) + (3 * 5) + .+(9 * 5) = 225

На языке высокого уровня легко сделать, а вот на ассемблере даже не представляю как организовать условный или счетный цикл(циклы).
Пожалуйста, напишите как это можно сделать, и если не сложно, обьясните как это работает. Заранее спасибо за ваше внимание к моей проблеме.

P.S часть с заполнением цикла и выводом результата можно не делать, её мы делаем на другом языке. Главное сам цикл)
Дополнен 13 лет назад
Прошу прошения. Случайно ошибся, в примере показал массив 3*3 размером, надеюсь не создал этим лишней путаницы. В принципе скорее всего буду использовать для определения размерности n и m переменные, поэтому особо критичной разницы в размере вроде нет.
Дополнен 13 лет назад
платформа обычная, не знаю как называется. Intel комп, ОС Windows и dos. Под Винду пишем вставляя код асемблера в делфи или Си, под дос, компилируем через Тасм 5. Тоесть никаких специальных приставок, к примеру "Турбо" нет.

Про то что код громоздкий совет очень ценый, спасибо)
Лучший ответ
Миоко Таканава Гений (51594) 13 лет назад
Математически, чтобы найти сумму элементов массива, каждый из которых умножен на одно и то же число, достаточно сложить все элементы и полученную сумму умножить на это число:
x1*c+x2*c+x3*c+...+xn*c=(x1+x2+x3+...+xn)*c
Но с учётом, что это учебное задание, для DOS программа может выглядеть примерно так:

data segment
;array db 4 dup (4 dup (?)); незаполненный массив
; или заполненный
array db 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
B db 5; переменная В
M db 4; кол-во строк
N db 4; кол-во столбцов
C dw ?; переменная для результата
data ends

code segment
assume cs:code, ds:data
N63718405:
mov ax,data
mov ds,ax
;ввод размера массива, его элементов и значения переменной В
;здесь не приводится
xor bx,bx; обнуление смещения начала строки
mov C,bx; начальное значение суммы С: =0
xor ch,ch; обнуление старшей половины счетчика строк
mov cl,M; загрузка в счётчик кол-ва строк
RowLoop:
xor si,si; обнуление смещения элемента от начала строки
push cx; сохранение счётчика строк в стеке
mov cl,N; загрузка в счётчик кол-ва столбцов
ColLoop:
mov al,array[bx][si]; загрузка в аккумулятор текущего элемента
mul byte ptr B; умножение его на B
add C,ax; прибавление произведения к сумме С: =C+a[ i, j ]*5
inc si; переход к след. элементу в строке
loop ColLoop; цикл по элементам строки
xor ah,ah; обнуление старшей части длины строки
mov al,N; загрузка кол-ва столбцов (= длине строки)
add bx,ax; переход к след. строке
pop cx; восстановление счётчика строк из стека
loop RowLoop; цикл по строкам
;здесь вывод результата куда-нибудь
mov ah,4Ch
int 21h
code ends
end N63718405

P.S. Так как строки массива идут непосредственно друг за другом, можно его обрабатывать как одномерный, тогда из программы уберётся внутренний вложенный цикл, а результат не изменится.
P.P.S. TASM - это Turbo Assembler. Т. е. приставка турбо всё же есть))
Остальные ответы
Андрей Шадрин Гуру (2540) 13 лет назад
Это очень большой и громоздкий код получается. И еще вы не указали платформу ассемблера.
Похожие вопросы