Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

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

Ответ
 
Опции темы
Старый 08.01.2019, 16:22   #1
Алексей IdeaSoft
Новичок
 
Регистрация: 08.01.2019
Сообщений: 1
Репутация: 10
По умолчанию Написать сумматор используя вставку _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 в 16:25.
Алексей IdeaSoft вне форума   Ответить с цитированием
Старый 09.01.2019, 08:12   #2
R71MT
Профессионал
 
Аватар для R71MT
 
Регистрация: 16.06.2011
Адрес: Фергана
Сообщений: 1,249
Репутация: 1048
По умолчанию

Цитата:
Сообщение от Алексей 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 на форуме   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


03:00.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru