Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/35: Рейтинг темы: голосов - 35, средняя оценка - 4.51
+1
345 / 178 / 53
Регистрация: 24.08.2010
Сообщений: 1,028

Как получить указатель на массив в ассемблере?

01.07.2012, 22:34. Показов 6822. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго здоровья.
Задача вообще такая:
Выкинуть из массива один элемент, а всё что дальше передвинуть на одно место (заполнить пробел).
К примеру, из массива 1,2,3,4,5 выкинуть 2, должно получиться 1,3,4,5.
Задача, по сути, простейшая
C++
1
for (int i=1; i<4; i++) Mas[i]=Mas[i+1]
Но. В этом массиве около 400 тыс. элементов и вызывается эта процедура почти до полного опустошения массива, вобщем, долго.
С целью сэкономить время, думаю вставить ассемблерный код.
В нем есть операция пересылки данных movs.
Assembler
1
2
3
4
        LEA     SI,NAME1
        LEA     D1,NAME2
        MOV     CX,10           ;Переслать 10 байтов
        REP MOVSB               ; из NAME1 в NAME2
Вот здесь у меня затруднения - как получить адрес массива, чтобы передать в регистры si, di?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.07.2012, 22:34
Ответы с готовыми решениями:

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Как получить адрес функции, возвращающей указатель на массив, из DLL?
В моем dll есть функция возвращающая указатель на массив указателей extern &quot;C&quot; _declspec(dllexport) float ** Calc(float...

Как средствами RTTI получить указатель на ComponentArray[0] или как получить значения некоторых свойств?
type TTestComponentItem = class(TComponent) end; TComponentArray = array of TTestComponentItem; TTestComponent =...

5
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
01.07.2012, 22:44
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void FillArray(int * mas, int N, int value) {
  asm {
    mov eax,value        // eax  === value
    mov ecx,0            // ecx  === i
    mov edx,mas          // edx  === &mas[i]
  cikl:
    cmp ecx,N            // while (i<N)
    jge the_end          //   {
    mov [edx],eax        //   mas[i]=value
    inc ecx              //   i++
    add edx,4            //   ...
    jmp cikl             //   }
  the_end:
  }
}
Это вам в качестве примера.
Тут value- число каторым заполниться весь масив, N - количество элементов масива, mas - сам масив естессно
[mas]-указатель на элемент масива. Как адрес.
Впринципе я думаю в коментах разберётесь.
0
+1
345 / 178 / 53
Регистрация: 24.08.2010
Сообщений: 1,028
01.07.2012, 22:48  [ТС]
Цитата Сообщение от ivan.-94 Посмотреть сообщение
5 mov edx,mas // edx === &mas[i]
я так пробовал, в результате в edx помещается не адрес, а первый элемент массива, в данном случае 1.
0
Я Фоюмчанин ? дааааа)
 Аватар для ivan.-94
213 / 204 / 23
Регистрация: 02.06.2012
Сообщений: 1,424
Записей в блоге: 12
01.07.2012, 23:06
Неет тут не элемент. Тут как бы весь масив туда помещаеться.
0
+1
345 / 178 / 53
Регистрация: 24.08.2010
Сообщений: 1,028
01.07.2012, 23:09  [ТС]
спасибо, разобрался.
вместо mov нужно использвать lea.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
i=1;// выкинуть второй элемент массива
int count=4-i; // длина до конца
i=i*4;  // sizeof(int)
_asm
    {
    pusha
    lea edi,Mas
    add edi,i
    mov eax,edi
    add eax,4
    mov esi,eax
    mov ecx,count
    rep movsd
    popa
    }
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
01.07.2012, 23:15
Цитата Сообщение от +1 Посмотреть сообщение
С целью сэкономить время, думаю вставить ассемблерный код.
В нем есть операция пересылки данных movs.
Assembler
1
2
3
4
 LEA SI,NAME1
 LEA D1,NAME2
 MOV CX,10 ;Переслать 10 байтов
 REP MOVSB
вообще то в языке есть memcpy которая внутри так же реализована(может даже и оптимальней)
http://ru.wikipedia.org/wiki/Memcpy
конкретно к твоей задаче перешлет 2 Двойных Слова и Слово
что быстрее чем 10 байт
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.07.2012, 23:15
Помогаю со студенческими работами здесь

Получить указатель на массив указателей
Есть массив инициализированных указателей: Result* res; for (int i=0;i&lt;100; i++) { res=new Result(); } Подскажите...

Реализовать 3 функции, каждая из которых принимает указатель на массив и количество элементов и возвращает указатель на новый массив.
Пишу в Microsoft Visual Studio -&gt;Win32 Console application -&gt;C++. Условие:Реализовать 3 функции, каждая из которых принимает указатель на...

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

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...

Как получить указатель на QString
И так вопрос: Я работаю с qt, и тут мне понадобилось получить адрес строки QString. Я создал QLineEdit *CheckText = new QLineEdit; ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru