Найти сумму элементов массива - Assembler
Формулировка задачи:
Помогите пожалуйста, очень нужно, найти сумму элементов массива. На C++ Builder.
Решение задачи: «Найти сумму элементов массива»
textual
Листинг программы
//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#include <stdio.h>
#define SIZE 10
int array_sum(int *data, int length)
{
int sum ;
asm
{
xor ebx, ebx
mov ecx, length
jecxz metka
mov esi, data
cld
cykl: lodsd
add ebx, eax
loop cykl
metka: mov sum, ebx
}
return sum ;
}
#pragma argsused
int main(int argc, char* argv[])
{
int array[SIZE] = {0,1,2,3,4,5,6,7,8,9} ;
printf("%i", array_sum(array, SIZE)) ;
return 0;
}
//---------------------------------------------------------------------------
Объяснение кода листинга программы
- Объявление функции
array_sum, которая принимает два аргумента: указатель на массив и его длину. - Инициализация переменной
sumв функцииarray_sum, которая будет хранить сумму элементов массива. - Объявление блока кода на ассемблере с помощью директивы
#asm. - Инициализация регистра
ebxв качестве счётчика суммы элементов массива. - Передача в качестве аргумента в функцию
movрегистраecx, который содержит длину массива. - Проверка условия
jecxz metka, которое проверяет, равен ли счётчик нулю. Если это так, то выполнение программы переходит к меткеmetka. - Передача в качестве аргумента в функцию
movрегистраesi, который содержит указатель на массив. - Установка флага направления переноса в
cld, чтобы обеспечить чётный порядок выполнения команд. - Цикл
cykl, который выполняется до тех пор, пока счётчик не станет равным нулю. В каждой итерации выполняется командаlodsd, которая загружает в регистрeaxследующий элемент массива. - Регистры
ebxиeaxучаствуют в операции сложенияadd ebx, eax, увеличивая значениеsum. - Команда
loop cyklиспользуется для уменьшения счётчика на единицу после каждой итерации цикла. - Метка
metka, на которую выполняется переход, если счётчик равен нулю. - Вывод значения переменной
sumс помощью функцииprintfв функцииmain. - Инициализация массива
arrayв функцииmainс помощью присваивания элементов значениям 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. - Вывод суммы элементов массива с помощью функции
printfв функцииmain. - Возврат значения 0 из функции
main, чтобы указать, что программа успешно завершилась.