Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
21 / 9 / 6
Регистрация: 10.11.2017
Сообщений: 148

Команды для работы со строками в ассемблере

20.12.2024, 10:24. Показов 4904. Ответов 46
Метки нет (Все метки)

Здравствуйте. Нужно решить данную задачу во встроенном ассемблере C++: Найти слова, оканчивающиеся на заданную с клавиатуры букву, и перевернуть.
Пытаюсь сделать уже вторую неделю, выходит так себе. Прикладываю код, который писал сам.
Писать на С++ можно только считывание с клавиатуры и вывод на экран, как написано в приложенном коде.
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
52
53
54
55
56
57
58
59
#include <iostream>
#include <cstring>
using namespace std;
 
int main() {
    char ch;
    char source[30] = "send string stronge";
    char dest[30] = "                 ";
    int len1;
    short cch;
    int i = 0;
    len1 = strlen(source);
    cout << "Enter a character: ";
    cin >> ch;
    cch = int(ch);
 
    _asm {
        lea edi, source; // Загружаем адрес исходной строки в регистр edi
        mov ecx, len1; // Загружаем длину строки в регистр ecx
        mov esi, 0; // Инициализируем индекс для dest
 
    search_loop:
        mov al, byte ptr[cch]; // Загружаем считанный символ в регистр al
        repne scasb; // Ищем символ в строке
        mov ebx, edi; // Сохраняем адрес найденного символа в ebx
        dec ebx; // Переходим к найденному символу
 
        mov al, ' '; // Загружаем пробел в регистр al
        repne scasb; // Ищем пробел в строке
        dec edi; // Переходим к пробелу
 
        mov edx, edi; // Сохраняем адрес пробела в edx
        sub edx, ebx; // Вычисляем длину словаd
        dec edi; // Переходим к последнему символу слова
        mov esi, edi; // Сохраняем адрес последней буквы слова в esi
 
        lea edi, dest; // Загружаем адрес для записи в dest
 
    copy_word:
        mov  al, byte ptr[esi];
        mov[edi], al;
        dec  esi;
        inc  edi;
        dec  cx;
        jne  copy_word;
        jne search_loop;
    }
 
    cout << "source - "; // Выводим исходную строку
    for (i = 0; i < 20; i++)
        cout << source[i]; // Выводим часть исходной строки
    cout << "\n";
 
    cout << "dest - "; // Выводим строку dest
    for (i = 0; i < 20; i++)
        cout << dest[i]; // Выводим часть строки dest
 
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.12.2024, 10:24
Ответы с готовыми решениями:

Заменить в строке каждую точку ‘.’ на многоточие “…” , используя команды работы со строками
Нужно заменить &quot;.&quot; на &quot;...&quot; . Я уже написал код, который заменяет первую точку на многоточие, но мне нужно зациклить так, чтобы все...

Найти невозможные или ошибочные команды на Ассемблере для микроконтроллера Intel 8051
Пожалуйста, срочно нужно Найти невозможные или ошибочные команды на Ассемблере для микроконтроллера Intel 8051 JC 23H AJMP RR IE:...

Реализовать на ассемблере функцию для работы с числами половинной точности
Реализовать на ассемблере функцию для работы с так называемыми числами половинной точности (формат binary16 стандарта IEEE 754-2008. В...

46
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
27.12.2024, 18:57
Лучший ответ Сообщение было отмечено Женя Брянцев как решение

Решение

Цитата Сообщение от Женя Брянцев Посмотреть сообщение
но результат не выводится...
Теперь выводится)). Можно наверно оптимизировать, но и так сойдет:
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
52
53
54
55
56
57
58
59
60
61
62
#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, _TCHAR* argv[]){
    char cy;
    int l, r;
    char source[30] = " sends string stronges";
    cout <<  source << endl;
    cout << "Enter a character: ";
    cin >> cy;
     __asm {
         mov esi, -1;
         xor eax, eax;
OUTWORD:
         inc esi;
         mov al, source[esi];
         cmp eax, 0;
         jz End;
         cmp al, 32;
         jz outword;
         mov l, esi;
INWORD:
         inc esi;
         cmp source[esi], 32;
         jnz L2;
L5:
         dec esi;
         mov r, esi;
         mov edi, l;
         mov al, source[edi];
         mov ebx, r;
         cmp al, source[ebx];
         jnz L3;
         cmp al, cy;
         jnz L3;
L4:
         cmp edi, ebx;
         jge L3;
         mov al, source[edi];
         mov cl, source[ebx];
         mov source[edi], cl;
         mov source[ebx], al;
         inc edi;
         dec ebx;
         jmp L4;
L3:
         jmp OUTWORD;
 
L2:
         cmp source[esi], 0;
         jz L5;
         jmp INWORD;
END:
   
    }
    
    cout <<  source << endl; // Выводим исходную строку
    cin >> cy;
 
    return 0;
}
3
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,252
27.12.2024, 23:55
Да ну вас с вашим ассемблером

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
 
int main()
{
    std::cout << "Enter a character: ";
    char c; (std::cin >> c).get();
    std::cout << "Enter a sentence: ";
    std::string s; std::getline(std::cin, s); std::stringstream ss(s);
    while (ss >> s)
    {
        if (std::tolower(s.back()) == std::tolower(c))
            std::reverse(s.begin(), s.end());
        std::cout << s << ' ';
    }
}
1
 Аватар для sporta1982
215 / 61 / 7
Регистрация: 05.10.2023
Сообщений: 522
28.12.2024, 03:45
Цитата Сообщение от Royal_X Посмотреть сообщение
добавлю, что не просто есть, а это один из лучших отладчиков среди всех существующих.
не хочу злить богов, но там нет перехода по 8 byte, 4 byte. в x64dbg есть эта функция...

Цитата Сообщение от Royal_X Посмотреть сообщение
Можно по шагам пробежаться не только в режиме кода, но и в режиме дизассемблера
тут так придирались, к моим словам , проблема терминологии. И еще он не может запустить процесс .exe файла, только attach.
только x32dbg и x64dbg. Если говорить о низком уровне просмотре программы, только эти отладчики.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6279 / 3003 / 1051
Регистрация: 01.06.2021
Сообщений: 11,252
28.12.2024, 10:07
sporta1982, отладчик Visual Studio лучший, когда доступен исходный код. Конечно, это не означает, что он прям подойдёт для всех случаев. Например, для отладки ядра, драйверов и пр. есть WinDbg от майкрософт. А вот упомянутый тобой "паук" хорош для реверс инженеринга, поиска уязвимостей и прочих таких штук. Когда инструменты разные, их сравнение становится сомнительным.
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
28.12.2024, 10:28
Отладчик в vs очень удобный. Даже в асм вставках показывает содержимое регистров, что очень хорошо.
1
 Аватар для sporta1982
215 / 61 / 7
Регистрация: 05.10.2023
Сообщений: 522
28.12.2024, 10:38
вы на название флагов посмотрите...
0
 Аватар для CoderHuligan
1753 / 1019 / 257
Регистрация: 30.06.2015
Сообщений: 5,132
Записей в блоге: 56
28.12.2024, 11:49
Цитата Сообщение от sporta1982 Посмотреть сообщение
вы на название флагов посмотрите...
OV = 0 UP = 0 EI = 1 PL = 0 ZR = 0 AC = 0 PE = 1 CY = 0
Это вот об этих флагах? Ну, это уже традиция, так обозначать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.12.2024, 11:49

Команды в ассемблере
Здравствуйте. Начал изучение ассемблера. Появились некоторые вопросы по описанию команд: №1. xchg ax,di Мнемоника: XCHG ax,r16 КОП:...

Подскажите команды для работы с БД
Добрый день.Подскажите пожалуйста команды для БД.Вернее как производить чтение,запись,редактирование БД.Или дайте ссылку где можно...

Команды для работы с XML
Уважаемые Soft'о'делы! Пожалуйста помогите. Какими командами &quot;вытаскивать&quot; и &quot;втаскивать&quot; данные из/в XML документ(а). В интернете...

AT команды для работы в интернете
Здравствуйте. Подскажите пожалуйста последовательность AT команд для подключения устройства(quectel m80) к интернету(скажем через...

Класс для работы со строками
Всем привет,может кто-то помочь решить? Cоздать класс для работы со строчками. Максимальная длина последовательности – 254. Первый...


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

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
Новые блоги и статьи
Взрослые отношения, и почему они не получаются
kumehtar 09.06.2026
Когда в детстве ребёнок не получает от родителей чего-то важного, он лишается не просто приятных переживаний, а основы для формирования определённых внутренних качеств и навыков. Если ребёнок не. . .
[golang] Worker Pool
alhaos 09.06.2026
Worker Pool Worker Pool — паттерн конкурентной обработки задач в Go. Суть: фиксированное количество горутин-воркеров читают задачи из общего канала и пишут результаты в общий канал результатов. . . .
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru