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

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

10.03.2016, 00:44. Показов 1135. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2016, 00:44
Ответы с готовыми решениями:

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

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

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

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

6
Эксперт Hardware
Эксперт Hardware
6160 / 2397 / 398
Регистрация: 29.07.2014
Сообщений: 3,143
Записей в блоге: 4
10.03.2016, 05:39 2
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
6747 / 1993 / 231
Регистрация: 14.12.2014
Сообщений: 4,186
Записей в блоге: 12
06.04.2017, 10:51 3
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Эксперт С++
5118 / 4557 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
06.04.2017, 11:15 4
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
6747 / 1993 / 231
Регистрация: 14.12.2014
Сообщений: 4,186
Записей в блоге: 12
06.04.2017, 11:24 5
_liv_, да, или так. Так даже быстрее, lodsb работает медленнее (как и stosb, loop и даже repne scasb медленнее, чем через цикл).

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

Добавлено через 1 минуту
Можно ещё заменить ebx на edx (если это как-то повлияет на сохранение ebx в стеке, т.е. отменит это).
2
Эксперт CЭксперт С++
5118 / 4557 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
06.04.2017, 11:37 6
Jin X, кто бы спорил Только каков смысл вылавливания даже не блох, а блошечек?
Разве что только ради стремления к идеалу...
0
Asm/C++/Delphi/Py/PHP/VBA
6747 / 1993 / 231
Регистрация: 14.12.2014
Сообщений: 4,186
Записей в блоге: 12
06.04.2017, 11:55 7
_liv_, в данном случае никакого. Забавы ради только
1
06.04.2017, 11:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.04.2017, 11:55
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru