Другие языки программирования и технологии
Ассемблер двумерный массив
Доброго времени суток, необходимо выполнить задачку с массивом на асемблере, но не понимаю как сделать цикл на этом языке. Нужно вычислить сумму всех эллементов двумерного массива 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 часть с заполнением цикла и выводом результата можно не делать, её мы делаем на другом языке. Главное сам цикл)
Математически, чтобы найти сумму элементов массива, каждый из которых умножен на одно и то же число, достаточно сложить все элементы и полученную сумму умножить на это число:
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. Т. е. приставка турбо всё же есть))
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. Т. е. приставка турбо всё же есть))
Это очень большой и громоздкий код получается. И еще вы не указали платформу ассемблера.
Похожие вопросы
- помогите срочно надо Квадратные массивы тема: Двумерные массивы на языке C++
- дан двумерный массив С(3,4).Получите новый массив А путём увеличения всех элементов исходного массива на число С.
- Необходимо упорядочить строки двумерного массива, по возрастанию первого эл-та. СИ.
- .помогите пожалуйста двумерный массив на языке c++
- Как можно передать ДВУМЕРНЫЙ массив в функцию в С++, не создавая его, как глобальный. Пример ниже:
- Что такое Двумерный массив?
- Двумерный массив с++ Пожалуйста =(
- Динамические двумерные массивы С++. Помогите разобраться.
- Перебор двумерного массива. Вопрос на засыпку.
- Каким образом в c++ можно передать двумерный массив в фунцкию?