Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 1
Регистрация: 12.03.2019
Сообщений: 56

Ассемблерная вставка для удаления лишних пробелов

04.11.2023, 22:49. Показов 987. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые программисты! В общем столкнулся с проблемой - имеется динамический массив char buffer который содержит в себе числа с пробелами например в формате "число(123) 5 пробелов число(12) 2 пробела число(1)" необходимо написать две ассемблерные вставки: одна для удаления лишних пробелов, то есть чтобы числа разделялись лишь одним пробелом, а не кучей подряд, вторая - для нахождения среднего значения этих самых чисел и записать результат в переменную float average. Для решения первой проблемы мой был написан код, он запускается, но ничего не выполняет (представлен ниже), решить вторую проблему не получается вовсе. Буду благодарен за любую помощь
C++
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
50
51
char* buffer = new char[text_length];
int dlina = strlen(buffer) - 1;
__asm {
    mov eax, buffer 
    mov ecx, dlina
 
    xor edx, edx     // обнуление регистра edx
 
    dec ecx          // уменьшение значения в регистре ecx на 1
 
    cmp ecx, 0       // сравнение значения в регистре ecx с 0
    jle exit_loop    // переход к метке exit_loop, если значение в регистре ecx не положительное
 
    loop_start :
    mov dl, [eax + ecx]               // загрузка значения из памяти по адресу eax+ecx в регистр dl
        mov bl, [eax + ecx - 1]           // загрузка значения из памяти по адресу eax+ecx-1 в регистр bl
        cmp dl, ' '                       // сравнение значения в регистре dl с ASCII кодом пробела
        jne continue_loop                 // переход к метке continue_loop, если значения не равны
        cmp bl, ' '                       // сравнение значения в регистре bl с ASCII кодом пробела
        jne continue_loop                 // переход к метке continue_loop, если значения не равны
 
        mov esi, ecx                      // сохранение значения регистра ecx в регистр esi
        inc esi                           // увеличение значения в регистре esi на 1
        sub edx, esi                      // вычитание значения регистра esi из значения регистра edx
 
        mov edi, esi                      // сохранение значения регистра esi в регистр edi
 
        buffer_shift_loop :
    mov al, [eax + edi + 1]           // загрузка значения из памяти по адресу eax+edi+1 в регистр al
        mov[eax + edi], al               // сохранение значения регистра al в памяти по адресу eax+edi
 
        inc edi                           // увеличение значения в регистре edi на 1
 
        cmp edi, edx                      // сравнение значения в регистре edi со значением в регистре edx
        jle buffer_shift_loop             // переход к метке buffer_shift_loop, если значение edi меньше или равно edx
 
        mov byte ptr[eax + edx + 1], 0    // сохранение нулевого значения в памяти по адресу eax+edx+1
 
        sub ecx, esi                      // вычитание значения регистра esi из значения регистра ecx
        dec ecx                           // уменьшение значения в регистре ecx на 1
 
        continue_loop :
    dec ecx                           // уменьшение значения в регистре ecx на 1
 
        cmp ecx, 0                        // сравнение значения в регистре ecx с 0
        jg loop_start                     // переход к метке loop_start, если значение в регистре ecx положительное
 
        exit_loop :
}
 
cout << buffer;
то есть должен получиться аналог вот этому:
C++
1
2
3
4
5
6
7
8
9
    int length = strlen(buffer) - 1;
    for (int j = 0; j < length - 1; j++) {
        if (buffer[j] == (char)32 && buffer[j + 1] == (char)32) {
            for (int k = j; k < length - 1; k++) buffer[k] = buffer[k + 1];
            buffer[length - 1] = '\0';
            length--;
            j--;
        }
    }
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.11.2023, 22:49
Ответы с готовыми решениями:

Программа для удаления лишних пробелов, табуляций, строк в файле (Си)
Здравствуйте. Помогите написать программу (Си), которая удаляла бы лишние пробелы, табуляции и пустые строки в файле. Находил только для...

Функция удаления лишних пробелов в Memo
Имеется сабж. Конечно, не работает. Если заменять лишние пробелы на любой непустой символ (т.е. str = NULL заменить, например, на str =...

Обработать строку на основе удаления лишних пробелов между словами
Требуется разработать программу,которая обеспечивает: 1.возможность ввода строки со словами,разделенными пробелами 2.обработку строку...

2
2741 / 1667 / 269
Регистрация: 19.02.2010
Сообщений: 4,411
05.11.2023, 01:11
Лучший ответ Сообщение было отмечено Artem_Proger как решение

Решение

Цитата Сообщение от Artem_Proger Посмотреть сообщение
то есть должен получиться аналог вот этому:
"Вот это" имеет временнУю сложность О(n2).
А можно считать за O(n) - если каждый раз не копировать до конца строки, а переносить только 1 символ.
C++
1
2
3
4
5
6
7
8
9
10
11
char *p1=buffer, *p2=buffer+1;
while ( *p2 ) {
    if ( *p1==' ' && *p2==' ' ) {
        p2++;
        continue;
    }
    p1++;
    *p1=*p2;
    p2++;
}
*(p1+1)='\0';
Код чисто навскидку - не думал, как можно записать покрасивее. Но задачу код решает.
Из недоработок - оставляет стартовый/финишный пробелы в строке (т.е. если есть стартовые/финишные пробелы - то их тоже сокращает до одной штуки). Впрочем, первоначальный код тоже стартовый пробел оставляет (оставляет ли финишный - мне уже лень думать/смотреть).
0
1 / 1 / 1
Регистрация: 12.03.2019
Сообщений: 56
05.11.2023, 01:42  [ТС]
Спасибо за исправление, Сишный код я предоставил как пример для понимания того что должна делать ассемблерная вставка
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.11.2023, 01:42
Помогаю со студенческими работами здесь

Разработать программу удаления лишних пробелов во введенной пользователем строке
Здравствуйте, помогите пожалуйста слабому полу:help: Может у кого то есть готовое??? 1. Составить программу на C/C++ согласно...

Ассемблерная вставка для транспонирования матрицы
Привет! Кому не трудно, помогите, пожалуйста, с задачкой Создать с помощью датчика случайных чисел(random) файл F1 с целочисленными...

Функция для удаления лишних пробелов
Есть ли в Aceess функция для удаления лишних пробелов?

Цикл для удаления лишних пробелов
Помогите дописать лабораторную работу: В задании необходимо 1. читать исходный текст, символьные строки и т.п. из внешнего символьного...

Программа для удаления лишних пробелов и переносов в html и js
Добрый день. Посоветуйте программу под Windows для корректного удаления лишних пробелов и переносов в html, css и js. Т.е....


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru