Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2019, 15:22   #1
Алексей IdeaSoft
Новичок
Джуниор
 
Регистрация: 08.01.2019
Сообщений: 1
По умолчанию Написать сумматор используя вставку _asm

Хочу написать алгоритм подсчета суммы элементов массива

Код:
int sum(int *a,     // адрес массива
            int size) { // размер массива   


	int k = size;
	int s = 0;  // переменная для хранения суммы элементов массива a

_asm {
        PUSH eax
        MOV eax, [a]
        ADD [eax], 01h // Могу прибавить только константу к элементу a[0] 
        // А мне нужно организовать цикл в котором в регистре eax будет 
        // накапливаться сумма a[i]
      
        POP eax
       }
       return s;
}

Последний раз редактировалось Алексей IdeaSoft; 08.01.2019 в 15:25.
Алексей IdeaSoft вне форума Ответить с цитированием
Старый 09.01.2019, 07:12   #2
R71MT
Участник клуба
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Сообщений: 1,428
По умолчанию

Цитата:
Сообщение от Алексей IdeaSoft Посмотреть сообщение
Могу прибавить только константу к элементу a[0]
в теории, должно получиться примерно так..
если числа большие, то сумма может не вместиться в один регистр,
поэтому нужно учитывать и перенос, который в данном случае будет в регистре EDX:
Код:
_asm {
        pusha              // ++ запомнить все регистры
        mov   ecx,k        // длина цикла
        mov   esi,a        // адрес массива
        xor   ebx,ebx      // здесь будет сумма (пока очищаем),
        xor   edx,edx      //   ..а здесь старшая её часть
@01:    lodsd              // читаем элементы массива из ESI в EAX 
        add   ebx,eax      // EBX + EAX
        adc   edx,0        //   ..если EBX переполнится, то кидать в EDX
        loop  @01          // промотать цикл ECX-раз..

        mov   [s],ebx      // запомнить сумму (старшая часть в EDX осталась)
        popa               // -- восстановить все регистры
        }
Нашедшего выход - затаптывают первым..
R71MT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(СИ) написать используя функции. BTS Общие вопросы C/C++ 0 13.12.2014 13:30
Запрет на вставку, на специальную вставку Аслан Абдрахманов Microsoft Office Excel 11 11.02.2014 10:21
Задача на множества.Написать программу не позволяющую вводить буквы русского алфавита.(написать подпрограммой используя процедуры ANTON1994 Паскаль, Turbo Pascal, PascalABC.NET 3 09.02.2013 13:53
_asm Ислам Помощь студентам 7 26.03.2011 14:52
_asm Voucik Общие вопросы C/C++ 3 24.01.2008 03:07