Сумма элементов массива, находящихся на нечетных местах - Assembler
Формулировка задачи:
Подскажите как это можно реализовать?Найти сумму элементов массива, находящихся
на нечетных местах
Для определенных 8 цыфр: на пример 1, 3, 12, -4, -6,- 2, 1, -8
Если можно то с коментами что бы было проще разобраться
Решение задачи: «Сумма элементов массива, находящихся на нечетных местах»
textual
Листинг программы
.model small .stack 100h .data massiv db 5,4,3,6,7,8,22,15 sym db ? .code start: mov ax,@data mov ds,ax mov es,ax mov cx,8 ;количество элементов proverka: mov al,massiv[si] ;заносим элемент массива test si,1;проверка на чётность jnz esline4etnoe ;если нечётное то переходишь на метку иначе идёшь дальше inc si ;и увеличиваешь si,т.е переходишь к следующему элементу loop proverka ;цикл заново пока сх не станет 0 jmp exit ;если же последний элемент поступивший сюда будет на чётной позиции то тупо выход,иначе прога слетит и начнёт работать до тех пор пока стек не переполниться esline4etnoe: add sym,al ;суммируем числа inc si ;объяснял уже loop proverka ;цикл exit: ;выход... mov ax,4c00h int 21h
Объяснение кода листинга программы
- .model small - устанавливает модель памяти, в данном случае - маленькую (small), что означает, что адрес стека будет в пределах 64 Кб;
- .stack 100h - устанавливает размер стека в 100 байт;
- .data - секция данных;
- massiv db 5,4,3,6,7,8,22,15 - определение массива на 8 элементов, начиная с адреса 5 (массив может быть больше, но в данном коде используется только 8 элементов);
- sym db ? - переменная для хранения суммы нечетных элементов;
- .code - секция кода;
- start: - метка начала работы программы;
- mov ax,@data - перенос сегмента данных в регистр AX;
- mov ds,ax - установка сегмента данных в качестве активного;
- mov es,ax - установка сегмента данных в качестве сегмента стека;
- mov cx,8 - установка счётчика на 8 (количество элементов в массиве);
- proverka: - метка цикла;
- mov al,massiv[si] - загрузка очередного элемента массива в регистр AX;
- test si,1 - проверка на чётность текущего индекса;
- jnz esline4etnoe - если индекс нечётный, переход на метку esline4etnoe;
- inc si - увеличение индекса на 1;
- loop proverka - переход на метку proverka;
- esline4etnoe: - метка для обработки нечётных индексов;
- add sym,al - добавление текущего элемента массива к переменной sym;
- inc si - увеличение индекса на 1;
- loop proverka - переход на метку proverka;
- exit: - метка выхода из программы;
- mov ax,4c00h - код выхода из DOS;
- int 21h - вызов интеррутуры 21h для выхода из программы.