Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 1
Регистрация: 10.11.2019
Сообщений: 7
NASM

Вычислить сумму элементов массива, входящих в интервал

14.02.2020, 17:16. Показов 4611. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Найти и вывести элементы, входящие в интервал, у меня получилось, но с суммой что-то совсем туплю
Пробовала варианты, которые есть на форуме, но не выходило
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
;c <= a[i] <= d
 
%include "io.inc"
 
section .data
    c dd -3
    d dd 6
    arr dd 1, 2, 3, 4, 45, 12, 9, 5
    lenght dd $-arr
    
section .text
global CMAIN
CMAIN:
    mov ebp, esp
    mov eax, [lenght]
    mov ebx, 4
    xor edx, edx
    div ebx
    mov edx, eax
    mov ebx, 0
    mov eax, 0
    
    for:
    mov ecx, [c]
    cmp ecx, [arr + ebx * 4]
    jle check ;esli c op <= a
    jg repeat ;inache
    
    check:
    mov ecx, [d]
    cmp ecx, [arr + ebx * 4]
    jge show ;esli d op => a
    jl repeat ;inache
    
    repeat:
    inc ebx
    cmp ebx, edx
    jne for
    jmp exit
    
    show:
    PRINT_DEC 1, [arr + ebx * 4]
    PRINT_STRING " входит в заданный интервал"
    NEWLINE
    inc eax
    jmp repeat
    
    exit:
    ret
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.02.2020, 17:16
Ответы с готовыми решениями:

Найти сумму элементов, входящих в интервал
Введите последовательность из N чисел. Найти сумму элементов, входящих в интервал |-2;2|. Ребят, выручите пожалуйста :cry:

Найти сумму элементов вектора, входящих в интервал
Помогите пожалуйста с написанием программы на С. Вектор А сформировать из вещественных случайных чисел в диапазоне . а) найти сумму S...

найти сумму элементов в массиве не входящих в интервал AB
найти сумму элементов в массиве не входящих в интервал AB. И составить блок схему.

9
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8654 / 4489 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
14.02.2020, 18:27
1. В описании PRINT_DEC первый параметр - это размер выводимого числа в байтах. Т.е. у вас здесь уже ошибка.
2. Раз вы выводите число, почему его не можете прибавить к какому-нибудь другому? Вот прямо перед выводом на экран.

Добавлено через 6 минут
И как-то вы усложнили алгоритм.
Ведь проще
C
1
2
3
4
5
6
7
8
9
10
11
int sum=0;
int *esi=arr; //lea esi, [arr]
for(int ecx=length; ecx>0; ecx--)
{
  int eax=(*esi++); //lodsd
  if( (eax>=min) && (eax<=max) )
  {
    sum += eax;
    printf("%d ");
  }
}; //loop for
Почитайте о инструкции цикла с параметром loop и о строковых инструкциях, в частности lodsd.
Это получится из разряда адресной арифметики в C.

Добавлено через 2 минуты
Размер массива вы неправильно вычисляете. Размер элемента у вас равен 4 байт, и для 8 элементов выражение
Assembler
9
lenght dd $-arr
даст неправильный результат - 32. А нужно
Assembler
9
lenght dd ($-arr)/4
0
0 / 0 / 1
Регистрация: 10.11.2019
Сообщений: 7
14.02.2020, 18:38  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
1. В описании PRINT_DEC первый параметр - это размер выводимого числа в байтах. Т.е. у вас здесь уже ошибка.
2. Раз вы выводите число, почему его не можете прибавить к какому-нибудь другому? Вот прямо перед выводом на экран.
1. по условию unsigned byte идет, поэтому указала 1
2. я понимаю, что вы имеете ввиду, но как реализовать этот момент в коде до меня не доходит. Путаюсь с регистрами, какой куда и как, в итоге код работает, но выходит не совсем нужный результат

насчет усложнения да, но это результат работы по примерам

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
даст неправильный результат - 32. А нужно
попробовала. выдает не все значения, входящие в интервал
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8654 / 4489 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
14.02.2020, 18:48
Цитата Сообщение от hopeonthest Посмотреть сообщение
1. по условию unsigned byte идет, поэтому указала 1
Вот и объявляйте массив arr как массив байт, а не двойных слов.
Цитата Сообщение от hopeonthest Посмотреть сообщение
2. я понимаю,...
Попробуйте с меньшего - просто сделайте тестовый код, в котором объявлены две переменный по 1 байту, сложите их и выведите сумму на экран.
А после этого продолжим обсуждение циклов и массивов.

Попробуйте. Иначе мой код ничего вам не даст - вы не научитесь.
Я помогу.
0
0 / 0 / 1
Регистрация: 10.11.2019
Сообщений: 7
14.02.2020, 19:21  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Вот и объявляйте массив arr как массив байт, а не двойных слов.
да, исправила на db

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Попробуйте с меньшего - просто сделайте тестовый код, в котором объявлены две переменный по 1 байту, сложите их и выведите сумму на экран.
А после этого продолжим обсуждение циклов и массивов.
я уже выполняла подобные задание, где просто произведение, сумма, сравнение и т д
если вы имели ввиду просто а + б = ?, то вот
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
%include "io.inc"
 
section .data
    a equ 4
    b equ 231
    
section .text
global CMAIN
CMAIN:
    mov ax, a
    add ax, b
    
    show:
    PRINT_DEC 1, ax
    ret
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Попробуйте. Иначе мой код ничего вам не даст - вы не научитесь.
Я помогу.
спасибо. но я не преследую цель научиться, это просто данное мне рядовое задание, которое нужно выполнить, не вдаваясь в какие-то подробности. у меня просто возникла трудность - я не знаю как мне сложить подходящие под условия числа, потому что не могу понять как построить эту логику именно на асм и именно по данным мне "верным" примерам (на других языках это проще и компактнее все, я знаю)
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8654 / 4489 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
14.02.2020, 20:19
Молодец!
Сложили два элемента.
А теперь смотрите, пусть в вашей программе сумма накапливается в регистре DL.
Значит перед началом цикла его нужно обнулить, а затем добавлять к нему значения элементов.

Для обращения к элементам вы используете выражение [arr+4*ebx]. Это неправильно. Потому, что множитель 4 здесь для перемещения по памяти при помощи индекса элемента массива, который в вашей программе находится в регистре ebx. Т.к. у вас массив байт, то и [arr+1*ebx]

Таким образом, суммирование add dl, [arr+1*ebx]. Где расположить такую строку? Там же где и вывод на экран.

Итак, пробуем собрать программу с суммированием. В смысле - вы пробуйте.

Добавлено через 43 минуты
Это при работе с указателями (адресной арифметикой) и циклом при помощи LOOP.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
%include "io.inc"
 
section .data
    c       db 3
    d       db 6
    arr     db 1, 2, 3, 4, 45, 12, 9, 5
    lenght  dd $-arr
section .text
global CMAIN
CMAIN:
 
    mov ecx,    [lenght]
    xor ebx,    ebx
    lea esi,    [arr]               ;в esi адрес массива
    .for:
            ;считываем в регистр очередной элемент
            lodsb                   ;al=[esi], esi=esi+1
            ;проверяем его значение на вхождение в заданный интервал
            cmp al, [c]             ;если al (очередной элемент) меньше левой границы интервала
            jb  .next               ;то перейти к рассмотрению следующего элемента
 
            cmp al, [d]             ;если al (очередной элемент) больше правой границы интервала
            ja  .next               ;то перейти к рассмотрению следующего элемента
            ;если в заданном интервале, то
            add bl, al              ;просуммировать его
            call    ShowElement     ;и вывести на экран
    .next:
    loop        .for
    ;вывод суммы
    PRINT_STRING "Sum="
    PRINT_UDEC  1,  bl
    NEWLINE
 
    xor eax, eax
    ret
 
;вывод значения суммируемого элемента из регистра al
;вывод оформлен отдельной процедурой,
;т.к. макросы PRINT_UDEC, PRINT_STRING и NEWLINE
;при раскрытии формируют код большой длины
;и цикл LOOP не может быть реализован
ShowElement:
    PRINT_UDEC  1,  al
    PRINT_STRING " входит в заданный интервал"
    NEWLINE
ret
Добавлено через 2 минуты
Инструкцию lodsb можно заменить на две mov al, [esi] и inc esi
1
0 / 0 / 1
Регистрация: 10.11.2019
Сообщений: 7
14.02.2020, 20:21  [ТС]
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Таким образом, суммирование add dl, [arr+1*ebx]. Где расположить такую строку? Там же где и вывод на экран.
Спасибо. Разобралась. Правда с dl некорректно работало, поэтому я просто указала eax, немножко потупила и получилось.
Assembler
1
2
3
4
5
6
7
8
9
10
11
show:
    PRINT_DEC 1, [arr + ebx * 1]
    PRINT_STRING " входит в заданный интервал"
    NEWLINE
    add eax, [arr + 1 * ebx]
    jmp repeat
 
    exit: 
    PRINT_STRING "Сумма элементов, входящих в интервал = "
    PRINT_DEC 1, eax
    ret
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8654 / 4489 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
14.02.2020, 20:28
А после такой замены недалеко и до вашего способа адресации
Assembler
14
15
16
17
18
    mov esi,    0                   ;в esi индекс первого элемента массива
    .for:
            ;считываем в регистр очередной элемент
            mov al, [arr+esi]       ;al=[esi], esi=esi+1
            inc esi
Добавлено через 6 минут
hopeonthest, смотрите, в вашем коде есть небольшая логическая ошибка.
Как вы сказали,
Цитата Сообщение от hopeonthest Посмотреть сообщение
по условию unsigned byte
Т.е. элементы - беззнаковые числа. Соответственно для них
1. переменная c не может быть отрицательной
2. переменные c и d должны быть размером 1 байт
3. при сравнении вы используете переходы для чисел со знаком jle и jg, а нужно для беззнаковых чисел
4. при выводе на экран нужно использовать PRINT_UDEC по тем же причинам.
Это мелочи, но преподаватель может обоснованно сделать замечание.
1
0 / 0 / 1
Регистрация: 10.11.2019
Сообщений: 7
14.02.2020, 20:44  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Т.е. элементы - беззнаковые числа. Соответственно для них
1. переменная c не может быть отрицательной
2. переменные c и d должны быть размером 1 байт
3. при сравнении вы используете переходы для чисел со знаком jle и jg, а нужно для беззнаковых чисел
4. при выводе на экран нужно использовать PRINT_UDEC по тем же причинам.
Это мелочи, но преподаватель может обоснованно сделать замечание.
Спасибо за разъяснения, я буду иметь ввиду
насчет первого и второго это да, я просто на скорую руку, уже поменяла

насчет 3 и 4 не критично, преподаватель не придает этому значения.
Благодарю, без вашей помощи до решения не знаю когда бы дошла.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8654 / 4489 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
14.02.2020, 20:47
hopeonthest, но вы же "Молодец с большой буквы", а не разгильдяйка!
Я верю, что зная о таком недостатке, как некорректное использование переходов и вывода на экран - быстро замените 2 перехода и 2 вывода.

Успехов!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.02.2020, 20:47
Помогаю со студенческими работами здесь

Вычислить сумму элементов одномерного массива попадающих в заданный интервал
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include&lt;stdlib.h&gt; #include&lt;time.h&gt; #include &lt;locale.h&gt; using namespace std; const...

Вычислить сумму элементов массива, чьи значения попадают в заданный интервал
Вычислить сумму элементов, чьи значения попадают в интервал (-5;20) в одномерном массиве размера n. Var a:real; Begin s:=0; For...

Вычислить сумму сумму элементов, попадающих в заданный интервал
Вычислить сумму сумму элементов, попадающих в заданный интервал. Границы интервала передавать в функцию в качестве параметров, полученную...

Найти длину максимальной неубывающей последовательности элементов массива и сумму значений элементов, входящих в нее
Использование глобальных переменных в функции не допускается. Помогите с программой.

Вычислить сумму всех цифр входящих в нечетные строки массива
Задан строковый маассив:цифры и латинские буквы. Вычислить сумму всех цифр входящих в нечетные строки Заранее спасибо!


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru