Миоко Таканава
Гений
(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. Т. е. приставка турбо всё же есть))
Нужно вычислить сумму всех эллементов двумерного массива 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 часть с заполнением цикла и выводом результата можно не делать, её мы делаем на другом языке. Главное сам цикл)