Форум программистов, компьютерный форум, киберфорум Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 16.05.2015
Сообщений: 7

Замена элементов в строке в ассемблерной вставке

10.03.2016, 00:44. Показов 1169. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
void split_and_print(char s1[])
{
    _asm
    {
        xor ebx,ebx
            cld
            mov ecx,15
            mov al, '+'
            lea edi,s1
        m_beg:
        or al,0
            repne scasb
            jz m_replace
            jecxz m_end
            jmp m_beg
        m_replace:
        mov byte ptr[edi - 1], '-'
            jmp m_beg
            m_end:
    }
    cout << s1 << endl;
}
int main() 
{
    char s1[] = "+Iv+an+Iva+nov+";
    split_and_print(s1);
    system("pause");
    return 0;
}
Нужно было написать простенькую программу на с++ с ассемблерной вставкой. функция просто заменяет все знаки + на - и выводит получившуюся строку. Но она ничего не делает.Кто может,подскажите,в чём проблема
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.03.2016, 00:44
Ответы с готовыми решениями:

ASM + C++: получить значения элементов массива в ассемблерной вставке
Здравствуйте. Сразу к делу. Есть шортовый массив и его заполнение: short mas; for (int k = 0; k &lt; NMAX; k++) {

Непонятки в ассемблерной вставке
В общем, все работает, только х2 не принимает значения с минусом, просто игнорирует минус + не работает команда перехода jg, работает...

Jump в ассемблерной вставке
Использую хак во внешнее приложение. static const DWORD func_hack_Ret = 0x45C5D9; // адрес возврата в исходное приложение static...

6
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6171 / 2407 / 400
Регистрация: 29.07.2014
Сообщений: 3,146
Записей в блоге: 4
10.03.2016, 05:39
Assembler Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
   mov   di,mess
   mov   cx,16
   mov   al,'+'
@@:
   repne scasb
   or    cx,cx
   jz    next
   dec   di
   mov   byte[di],'-'
   inc   di
   jmp   @b
next:
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6765 / 2010 / 233
Регистрация: 14.12.2014
Сообщений: 4,232
Записей в блоге: 12
06.04.2017, 10:51
R71MT, последний плюс не заменит такой код, т.к. там будет cx=0 (тем более, вопрос про 32 бита).

DarkLoS, потому что функции передаётся не строка, а ссылка на строку, т.е. надо так:
Assembler Скопировано
9
mov edi,s1
И зачем ebx меняется? Вообще, ebx, esi, edi, ebp менять в Windows нежелательно (без сохранения/восстановления).

Ненужно никаких repne scasb здесь:
Assembler Скопировано
1
2
3
4
5
6
7
8
9
10
11
            cld  // cld вообще уже и так должно быть выполнено (по соглашениям о вызовах), так что эту строку можно убрать
            mov esi,s1
        m_beg:
            lodsb
            test al,al
            jz m_end
            cmp al,'+'
            jne m_beg
            mov byte ptr [esi-1],'-'
            jmp m_beg
        m_end:
2
Эксперт CЭксперт С++
 Аватар для liv
5118 / 4566 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
06.04.2017, 11:15
DarkLoS[/nick], или так:
Assembler Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void split_and_print(char s1[])
{
    __asm
    {
        mov ebx, s1
       m_beg:
        mov al,[ebx]
        inc ebx
        cmp al, 0
        je m_end
        cmp al, '+'
        jne m_beg
        mov byte ptr [ebx-1], '-'
        jmp m_beg
       m_end:
    }
    cout << s1 << endl;
}
[nick]
Jin X, регистры ebx, esi, edi сохраняются в стеке автоматически
2
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6765 / 2010 / 233
Регистрация: 14.12.2014
Сообщений: 4,232
Записей в блоге: 12
06.04.2017, 11:24
_liv_, да, или так. Так даже быстрее, lodsb работает медленнее (как и stosb, loop и даже repne scasb медленнее, чем через цикл).

Добавлено через 2 минуты
Цитата Сообщение от _liv_ Посмотреть сообщение
cmp al, 0
Вот на это заменять только смысла нет, это абсолютно равнозначно test al,al (и по скорости, и по размеру).

Добавлено через 1 минуту
Можно ещё заменить ebx на edx (если это как-то повлияет на сохранение ebx в стеке, т.е. отменит это).
2
Эксперт CЭксперт С++
 Аватар для liv
5118 / 4566 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
06.04.2017, 11:37
Jin X, кто бы спорил Только каков смысл вылавливания даже не блох, а блошечек?
Разве что только ради стремления к идеалу...
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6765 / 2010 / 233
Регистрация: 14.12.2014
Сообщений: 4,232
Записей в блоге: 12
06.04.2017, 11:55
_liv_, в данном случае никакого. Забавы ради только
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.04.2017, 11:55
Помогаю со студенческими работами здесь

Прерывания в ассемблерной вставке
Здравствуйте. В программу, написанную на С++, нужно добавить ассемблерную вставку, поддерживающую прерывания (int 21h например). Каким...

Ошибки в ассемблерной вставке
в 24 и 25 строке ругается, что недопустимое число операторов #include &quot;iostream&quot; #include &quot;windows.h&quot; #include...

Работа с указателями в ассемблерной вставке
Вопрос простой. Строка в паскале - массив байт. Для обработки этого массива пытаюсь получить ссылку на адрес в памяти ...

Очищение памяти в ассемблерной вставке
/* Выделить из строки подстроку указанной длины, начиная с заданной позиции. */ #include &lt;stdio.h&gt; #include...

Операция разыменовывания в ассемблерной вставке
Всем доброго времени! Хочу разыменовать поместить в регистр значение, содержащееся в некоем указателе: //получаю указатель...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер