4 / 3 / 1
Регистрация: 30.10.2012
Сообщений: 339
1

Нужно переделать С++ функцию на ассемблерную вставку

29.06.2015, 18:41. Показов 677. Ответов 8
Метки нет (Все метки)

Вот у меня имеется функция,осуществляющая реверс строки на С++
C++
1
2
3
4
5
6
7
8
9
void reverse(const char *s) {
    if (s && *s)
    {
        int l;
        for (l = 0; s[l]; l++);
        for (l -= 1; l >= 0; l--) 
            cout << s[l];
    }
}
Да,возможно,функцию можно написать как-то более оптимально,но я не знаю,как. Нужно переделать её на ассемблерную вставку. Подскажите,как это сделать?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.06.2015, 18:41
Ответы с готовыми решениями:

Как переделать ассемблерную вставку из x32 в x64
Вот есть такая функция. Как её скомпилировать под Win64? __declspec(naked) void...

Переписать используя ассемблерную вставку
Есть подпрограмма написанная на С++: void sion(char *&amp;str){ int len = 0; for(;str; len++);...

Как сделать ассемблерную вставку в с++ ?
void encode_symbol (short int symbol ) { long range=0; asm{ mov ax,high...

Не могу запустить ассемблерную вставку на c++
Вставка находит скалярное произведение двух векторов, помогите запустить __asm { movaps ...

8
3660 / 2997 / 828
Регистрация: 25.03.2012
Сообщений: 11,045
Записей в блоге: 1
29.06.2015, 18:43 2
Цитата Сообщение от Генрисон Посмотреть сообщение
Да,возможно,функцию можно написать как-то более оптимально,но я не знаю,как.
не выводить строку по буквам, а сначало честно отреверсить, может быть, не?
0
4 / 3 / 1
Регистрация: 30.10.2012
Сообщений: 339
29.06.2015, 19:00  [ТС] 3
Kuzia domovenok, например так ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void reverse(const char *s) {
    int i = 0;
    if (s != NULL) {
        while (s[i] != 0){
            i++;
        }
        while (i >= 0){
            cout << s[i];
            i--;
        }
 
    }
}
или не то?

Добавлено через 1 минуту
Kuzia domovenok, или вот такой вариант есть
C++
1
2
3
4
5
6
7
8
9
    if (s && *s) {
        unsigned int len = 0;
        const char *ch = s;
        while (*ch)
            ch++;
        len = ch - s;
        while (len--)
            cout << *--ch;
    }
Добавлено через 28 секунд
Kuzia domovenok, вы можете со вставкой помочь?
0
Заблокирован
29.06.2015, 19:43 4
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
void reverse(const char *s) 
{
    _asm
    {
        mov esi,s
        mov edi,esi
    go0:inc edi
        cmp byte ptr[edi],0
        jne go0
        dec edi
    go1:lodsb
        xchg al,[edi]
        mov [esi-1],al
        dec edi
        cmp esi,edi
        jb go1
    }
}
void main()
{
    char s[]="ABCDE";
    reverse(s);
    printf("%s\n",s);
    system("pause");
}
0
Эксперт С++
4978 / 3085 / 456
Регистрация: 10.11.2010
Сообщений: 11,164
Записей в блоге: 10
29.06.2015, 19:47 5
Генрисон, тебе вставка нужна по условию, или для оптимизации?
1
836 / 639 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
29.06.2015, 19:48 6
Навряд ли ускорить получиться, вот набросал не вдаваясь в производительность, ибо нужно пройтись до конца строки затратив O(n) далее ещё обменять O(n).

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
//Синтаксис INTEL
char* s_rev(char* s){
    __asm {
        mov esi, s
        mov edi, s
__next:
        movsx edx, byte ptr [esi]
        test  edx, edx
        jz  __fin;
        add  esi, 1
        jmp __next;
__fin:
        dec esi
__rev:
        cmp edi, esi
        ja __end;
        
        mov  dl, [esi]
        xchg [edi], dl
        mov  [esi], dl
        add  edi, 1
        sub  esi, 1
        jmp __rev;
__end:
    };
    return s;
}
0
4 / 3 / 1
Регистрация: 30.10.2012
Сообщений: 339
29.06.2015, 19:53  [ТС] 7
castaway, по условию

Добавлено через 3 минуты
MansMI, у вас на строке
xchg al,[edi]
выдаёт вот такую ошибку:
Необработанное исключение по адресу 0x00A557EB в as.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00A5C981.
0
7166 / 6141 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
29.06.2015, 20:06 8
Геомеханик, а почему не используешь inc и dec в циклах?
0
castaway
30.06.2015, 12:32     Нужно переделать С++ функцию на ассемблерную вставку
  #9

Не по теме:

Цитата Сообщение от Генрисон Посмотреть сообщение
castaway, по условию
Тогда мне эта тема не интересна...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.06.2015, 12:32

Как сделать ассемблерную вставку
Доброе время суток: подскажите хотя бы теоретично как сделать ассемблерную вставку в код паскаля?...

Как сделать ассемблерную вставку?
Нужно сложить два числа. Не могу понять ошибки вроде примеры смотрел вставки делаются именно так...

Как сделать ассемблерную вставку на с++?
Вроде бы ничего нет сложного, код очень простой, и много где есть, но не идет код У меня c++...

Системные вызов через ассемблерную вставку
Добрый день. Ребята помогите вызов функции getpid() return : -14 почему -14 ? #include...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru