0 / 0 / 0
Регистрация: 03.11.2013
Сообщений: 11
1

Что нужно изменить в функции на assembler-е, чтобы удаляло пробелы в начале и в конце строки

29.10.2014, 22:26. Показов 1863. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
изменить в функции assembler,чтобы удаляло пробелы в начале и в конце строки,а то удаляет только повторяющиеся пробелы
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "stdafx.h"
#include  <stdio.h>
#include <locale.h>
#include <string.h>
#include <time.h>
#include <iostream>
using namespace std;
char* si(char* str, char* res)
{
    int j = 0;
    int i;
    for (i = 0; i < strlen(str); i++) {
        if (str[i] == ' ')
        {
            if (j == 0) continue;
            if (str[i + 1] == ' ') continue;
        }
        res[j] = str[i];
        j++;
    }
    i = strlen(res); // подсчет длины строки
    if (res[i - 2] == ' ')
        res[i - 2] = '\0';
    return res;
}
char* assembler(char* str, char* res)
{
    int str_len = strlen(str);
    _asm
    {
        mov ecx, str_len //Заносим длину первой строки
            mov edi, str //Заносим первую строку
            mov esi, res //Заносим вторую строку
        m1 :
           
        mov al, byte ptr[edi] //Первый символ первой строки
            inc edi // увеличиваем значение на 1
            mov byte ptr[esi], al  //Первый символ второй строки
            inc esi // увеличиваем значение на 1
            dec ecx // уменьшаем счетчик
            cmp al, ' ' // сравниваем
            jne m2   // переход если(al) = ' '
            repe scasb // поиск пробелов
            je m2 // переход к m2
            dec edi // уменьшаем счетчик
            inc ecx // увеличиваем значение на 1
        m2 :
        test ecx, ecx
            jnz m1 // переход если ecx=ecx
            mov byte ptr[esi], 0 // хранение в 8 бит
    }
    return res;
}
int main() {
    setlocale(LC_ALL, "");
    char str[101] = ""; // ввод строки
    char res[101] = ""; // вывод строки
    printf("Введите строку:");
    fgets(str, 101, stdin);
    long int time1 = 0, time2 = 0;
    // c++
    time1 = clock();
    for (int k = 1; k < 1000000; k++)
        si(str, res);
        time2 = clock();
        cout << "Время выполнения 1000000 итераций на Си: " << time2 - time1 << "ms" << endl;
        cout << res << endl;
        // assembler
    time1 = clock();
    for (int k = 1; k<1000000; k++)
        assembler(str,res);
    time2 = clock();
    cout << "Время выполнения 1000000 итераций на ассемблере: " << time2 - time1 << "ms" << endl;
    cout << res << endl;
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2014, 22:26
Ответы с готовыми решениями:

Удалить повторяющиеся пробелы, также пробелы в начале и в конце строки (ассемблерная вставка)
Написать ассемблерную вставку, реализующую следующую обработку строки: согласно варианту. Оформить...

Удалить пробелы в начале и в конце строки
Задали в универе программу именно на FASM, помогите кто сможет. Задана строка, удалить из неё...

Удалить пробелы в начале и конце строки
Удалить группу пробелов, с которых, возможно начинается и заканчивается строка строки читаются из...

Как обрезать пробелы в начале и в конце строки?
Как обрезать любое количество пробелов в начале и в конце строки, если они там есть? И вернуть ту...

7
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
30.10.2014, 00:33 2
Лучший ответ Сообщение было отмечено SajeD как решение

Решение

Ну вот как-то так[Watcom 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//#include "stdafx.h"
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <time.h>
//#include <iostream>
//using namespace std;
char* si(char* str, char* res)
{
int j = 0;
int i;
for (i = 0; i < strlen(str); i++) {
if (str[i] == ' ')
{
if (j == 0) continue;
if (str[i + 1] == ' ') continue;
}
res[j] = str[i];
j++;
}
i = strlen(res); // подсчет длины строки
if (res[i - 2] == ' ')
res[i - 2] = '\0';
return res;
};
char* trim(char* _str, char* _res)
{
__asm
{
    xor ecx,ecx
    mov al,cl
    mov edi, dword ptr [_str]
    mov esi, edi    // ещё пригодится
    dec ecx     // ECX = -1
    repne   scasb
    not ecx
    sub edi,2
// в ECX - длина str, EDI->на последний символ в строке
    std
    mov al, 0x20    // пробел
    repe    scasb
// в ECX длина str без хвостовых пробелов
    mov edi, esi
// EDI-> на начало _str
    cld
    repe    scasb
    inc ecx
//в ECX длина str без начальных и хвостовых пробелов
    mov esi, edi
    dec esi
//ESI->на первый непобельный символ
    mov edi, dword ptr [_res]
    rep movsb
    xor al,al
    stosb
};
return _res;
};
int main() {
//setlocale(LC_ALL, "");
char str[101]; // ввод строки
char res[101]; // вывод строки
long int time1 = 0, time2 = 0;
int k;
printf("Введите строку:");
gets(str);
// c++
time1 = clock();
for (k = 1; k < 1000000; k++)
si(str, res);
time2 = clock();
printf("Время выполнения 1000000 итераций на Си: %d ms\n\r%s|\n\r", time2 - time1,res);
// assembler
time1 = clock();
for (k = 1; k<1000000; k++)
trim(str,res);
time2 = clock();
printf("Время выполнения 1000000 итераций на ассемблере: %d ms\n\r%s|\n\r", time2 - time1,res);
getch();
return 0;
};
1
0 / 0 / 0
Регистрация: 03.11.2013
Сообщений: 11
30.10.2014, 18:15  [ТС] 3
все равно не выходит
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
30.10.2014, 19:14 4
SajeD, компилятор какой? Если вышивальная студия(M$VC), то это не мои проблемы.
0
0 / 0 / 0
Регистрация: 03.11.2013
Сообщений: 11
30.10.2014, 19:42  [ТС] 5
вшивая)

Добавлено через 4 минуты
могу сказать одно,все работает,но не удаляет повторяющие пробелы,только в начале и в конце строки удаляет
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
30.10.2014, 19:55 6
Цитата Сообщение от SajeD Посмотреть сообщение
только в начале и в конце строки удаляет
Дык, что хотелось-то?
Цитата Сообщение от SajeD Посмотреть сообщение
чтобы удаляло пробелы в начале и в конце строки
Сказано — сделано. Насчёт удаления повторяющихся пробелов внутри строки уговора не было. Допилить, конечно, можно, но лень...
0
0 / 0 / 0
Регистрация: 03.11.2013
Сообщений: 11
30.10.2014, 19:59  [ТС] 7
Тогда спасибо
0
Клюг
7674 / 3189 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
30.10.2014, 20:45 8
SajeD, да там всё в лобовую, вот кусочек, который надо поменять:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//ESI->на первый непробельный символ
    mov edi, dword ptr [_res]
    mov ah, al
again:  lodsb
    cmp al, ah
    jnz next
    cmp [esi], ah
    jz  skip
next:   stosb
skip:   loop    again
//  rep movsb
    xor al,al
    stosb
};
return _res;
Moreover, ваш алгоритм на Си изволит лажать:
Миниатюры
Что нужно изменить в функции на assembler-е, чтобы удаляло пробелы в начале и в конце строки  
1
30.10.2014, 20:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2014, 20:45
Помогаю со студенческими работами здесь

Удалить все пробелы в начале и в конце строки
Дана символьная строка.Удалить все пробелы в начале и в конце строки. Помогите решить пожалуйста.

Функция удаляющая пробелы в начале и в конце строки
Разработайте функцию std::string TrimBlanks(std::string const&amp; str), выполняющую отрезание...

Исключить пробелы, стоящие в начале и в конце каждой строки
Дан текстовый файл f, состоящий из нескольких строк. Исключить пробелы, стоящие в начале и в конце...

Как убрать все пробелы в начале и конце строки ?
У меня есть файл там хранится такая матрица ) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

Удалить из строки все лишние пробелы: в начале, в конце, повторяющиеся
Дана строка предложение. Удалить из строки все лишние пробелы: в начале, в конце, повторяющиеся. ...

Как удалить пробелы и знаки табуляции в начале и конце строки?
Как удалить пробелы и знаки табуляции в начале и конце строки? Я написал код но не понимаю в чем...


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

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

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