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

Переписать в виде ассемблерной вставки

06.11.2023, 01:25. Показов 918. Ответов 1

Студворк — интернет-сервис помощи студентам
Приветствую, уважаемые программисты! Столкнулся с такой задачей есть функция на C++ которая прекрасно работает, но необходимо реализовать аналогичный алгоритм в виде ассемблерной вставки, мои попытки выдают ошибки с точками остановки в разных местах. Подскажите где искать ошибку и как правильно сделать?
часть Сишного кода который прекрасно работает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void delete_null(char* buffer, int result[], int length) {
    int resultIndex = 0;
 
    for (int bufferIndex = 0; bufferIndex < length; bufferIndex++) {  // Перебираем символы в массиве buffer
        if (isdigit(buffer[bufferIndex])) {  // Если текущий символ является числом
            result[resultIndex] = atoi(&buffer[bufferIndex]); // Преобразуем текущий символ в число и добавляем его в массив result
            resultIndex++;  // Увеличиваем индекс для перехода к следующему элементу
            while (isdigit(buffer[bufferIndex])) bufferIndex++;  // Пропускаем все символы числа
        }
    }
}
 
int main() {
char* buffer = new char[text_length]
int result[2048]{};
int len = sizeof(result) / sizeof(result[0]);
delete_null(buffer, result, len);
}
Мои попытки реализовать тоже самое на asm:
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 delete_null(char* buffer, int result[], int length) {
 
    __asm {
        mov esi, buffer; //сохраняем адрес начала строки в ebx
        mov ecx, 0; //устанавливаем индекс ecx в 0
        mov edx, result; //сохраняем адрес начала массива result в edx
 
        del_function: ; //метка del_function
 
        mov al, [esi + ecx]; //загружаем символ в регистр al
        cmp al, '0'; //сравниваем символ с '0'
        jb not_number; //если символ меньше '0', переходим к метке not_number
        cmp al, '9'; //сравниваем символ с '9'
        ja not_number; //если символ больше '9', переходим к метке not_number
 
        sub al, '0'; //преобразуем символ в число
        mov[edx], al; //сохраняем число в массив result
        add ecx, 1; //увеличиваем индекс для исходного массива
        add edx, 1; //увеличиваем индекс для массива result
        jmp skip_number; //переходим к метке skip_number
 
        not_number :
        add ecx, 1; //увеличиваем индекс только для исходного массива
 
        skip_number :
        cmp byte ptr[esi + ecx], 0; //сравниваем символ с 0
            jmp del_function
    }
}
Добавлено через 32 минуты
Немного подправил теперь запускается, но функция получилась зацикленной, дальше неё программа не идёт
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 delete_null(char* buffer, int result[], int length) {
 
    __asm {
        mov esi, buffer; //сохраняем адрес начала строки в ebx
        mov ecx, 0; //устанавливаем индекс ecx в 0
        mov edx, result; //сохраняем адрес начала массива result в edx
 
        del_function: ; //метка del_function
 
        mov al, byte ptr[esi]; //загружаем символ в регистр al
        cmp al, '0'; //сравниваем символ с '0'
        jb not_number; //если символ меньше '0', переходим к метке not_number
        cmp al, '9'; //сравниваем символ с '9'
        ja not_number; //если символ больше '9', переходим к метке not_number
 
        sub al, '0'; //преобразуем символ в число
        mov [edx], al; //сохраняем число в массив result
        add ecx, 1; //увеличиваем индекс для исходного массива
        add edx, 1; //увеличиваем индекс для массива result
        jmp skip_number; //переходим к метке skip_number
 
        not_number :
        add ecx, 1; //увеличиваем индекс только для исходного массива
 
        skip_number :
        cmp al, 0; //сравниваем символ с 0
            jmp del_function
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.11.2023, 01:25
Ответы с готовыми решениями:

Ошибка компиляции ассемблерной вставки
Добрый вечер. Захотелось мне сделать ассемблерную вставку в C++ код. Сделал. Но компилятору MinGW чето не нравится. Выдает следующие ошибки...

Выполнить с использованием ассемблерной вставки
Нужно подсчитать кол-во цифр в троке из 10 символов. Реализовать в виде ассемблерной вставки. Подскажите пожалуйста как сделать!

Как вывести числа в цикле ассемблерной вставки?
Доброго времени, суток! Мне нужно вывести каждый результат получившийся в цикле, как это можно сделать? _asm { metka: .... ftp...

1
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
07.11.2023, 05:26
Лучший ответ Сообщение было отмечено Artem_Proger как решение

Решение

Цитата Сообщение от Artem_Proger Посмотреть сообщение
Подскажите где искать ошибку и как правильно сделать?
Открываем compiler explorer и запихиваем туда код на плюсах.
Смотрим, что там нагенерилось.

Assembler
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
delete_null(char*, int*, int):                   # @delete_null(char*, int*, int)
        push    rbp
        mov     rbp, rsp
        sub     rsp, 32
        mov     qword ptr [rbp - 8], rdi
        mov     qword ptr [rbp - 16], rsi
        mov     dword ptr [rbp - 20], edx
        mov     dword ptr [rbp - 24], 0
        mov     dword ptr [rbp - 28], 0
.LBB1_1:                                # =>This Loop Header: Depth=1
        mov     eax, dword ptr [rbp - 28]
        cmp     eax, dword ptr [rbp - 20]
        jge     .LBB1_9
        mov     rax, qword ptr [rbp - 8]
        movsxd  rcx, dword ptr [rbp - 28]
        movsx   edi, byte ptr [rax + rcx]
        call    isdigit
        cmp     eax, 0
        je      .LBB1_7
        mov     rdi, qword ptr [rbp - 8]
        movsxd  rax, dword ptr [rbp - 28]
        add     rdi, rax
        call    atoi
        mov     edx, eax
        mov     rax, qword ptr [rbp - 16]
        movsxd  rcx, dword ptr [rbp - 24]
        mov     dword ptr [rax + 4*rcx], edx
        mov     eax, dword ptr [rbp - 24]
        add     eax, 1
        mov     dword ptr [rbp - 24], eax
.LBB1_4:                                #   Parent Loop BB1_1 Depth=1
        mov     rax, qword ptr [rbp - 8]
        movsxd  rcx, dword ptr [rbp - 28]
        movsx   edi, byte ptr [rax + rcx]
        call    isdigit
        cmp     eax, 0
        je      .LBB1_6
        mov     eax, dword ptr [rbp - 28]
        add     eax, 1
        mov     dword ptr [rbp - 28], eax
        jmp     .LBB1_4
.LBB1_6:                                #   in Loop: Header=BB1_1 Depth=1
        jmp     .LBB1_7
.LBB1_7:                                #   in Loop: Header=BB1_1 Depth=1
        jmp     .LBB1_8
.LBB1_8:                                #   in Loop: Header=BB1_1 Depth=1
        mov     eax, dword ptr [rbp - 28]
        add     eax, 1
        mov     dword ptr [rbp - 28], eax
        jmp     .LBB1_1
.LBB1_9:
        add     rsp, 32
        pop     rbp
        ret
Дальше можно оптимизировать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.11.2023, 05:26
Помогаю со студенческими работами здесь

Получение значения элемента массива с помощью ассемблерной вставки
У меня есть функция int kontr(char* str1, int len) { __asm{ lea esi, ; xor ebx, ebx; mov eax, ; //ну и дальше } ...

Определить размер кеша инструкций первого уровня с помощью ассемблерной вставки
Не знал в каком разделе создать тему, но думаю этот вопрос будет понятен программистам С++. Встала такая задача: определить размер кеша...

С помощью ассемблерной вставки найти отрицательные элементы в массиве, и среднее положительных элементов
Создать массив X. Определить среднее арифметическое положительных чисел, из отрицательных создать массив Y. При этом максимальное и...

С помощью ассемблерной вставки сложить a+b, вывести результат, в переменную bool записать было ли переполнение
Нужно написать ассемблерную вставку Есть переменные unsigned char a,b; bool c; Как с помощью ассемблерной вставки сложить a+b,...

Получить строку, обратную к заданной в виде ассемблерной вставки
Получить строку, обратную к заданной, то есть все символы которой записаны в обратном порядке. Ассемблерная вставка языка c++. Ввод/вывод с...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru