Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/2: Рейтинг темы: голосов - 2, средняя оценка - 4.50
Novilit-v
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 21
1

Цепочечные операции

31.03.2014, 23:45. Просмотров 418. Ответов 4
Метки нет (Все метки)

Здравствуйте. В рамках одного задания возникла необходимость в цепочечных командах. После некоторой работы было установлено, что даже простейшая задача - копирование одной строки в другую - работает как-то странно. итак:
Кликните здесь для просмотра всего текста
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
void rever(char* stro) {
    char* fmt = "%s\n";
    char* fmt1 = "%c";
    char str1[10];
    str1[0]='0';
    str1[1]='1';
    str1[2]='2';
    str1[3]='3';
    str1[4]='4';
    str1[5]='5';
    str1[6]='6';
    str1[7]='7';
    str1[8]='8';
    str1[9]='\0';
    __asm{  
        mov esi, stro;
        lea edi, str1;
 
        push stro;
        call strlen;
        add esp, 4;
        mov ecx, eax;
    //  cld;
        rep movsb;
 
        push esi;
        push fmt;
        call printf;
        add esp, 8;
 
        push edi;
        push fmt;
        call printf;
        add esp, 8;
    }
}

Ожидалось, что при вводе, к примеру, "12345" первые 5 символов второй строки будут заменены на "12345". Таким образом, будет выведено: пустая строка (из esi символы удалены), "123455678" - строка с перезаписанными символами. Однако - результат на скриншоте.
Цепочечные операции

В esi на самом деле пусто, а вот в edi первые 5 символов просто исчезли. При этом "cld", поставленный в комментарий, на работу никак не влияет - первый результат с ним, второй без него. Подскажите, как исправить ситуацию.
P. S. Студия.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2014, 23:45
Ответы с готовыми решениями:

Строка: Используя цепочечные операции, ввести с клавиатуры строку и вывести его длину.
здравствуйте, помогите пожалуйста реализовать программку. Используя цепочечные...

Цепочечные команды
Помогите пожалуйста с задачкой, очень нужно!!! Дан текст, слова которого...

Цепочечные команды
Очень нужна помощь!!! Есть код, который выводит главную диагональ матрицы на...

Цепочечные команды
На Assembler Допустим дана строка str 1 "a?bc;a?s?" Нужно удалить знаки "?"...

Цепочечные команды
Здравствуйте! Мне нужно проверить упорядочены ли слова в строке по...

4
Mikl___
Автор FAQ
13304 / 6377 / 629
Регистрация: 11.11.2010
Сообщений: 11,536
01.04.2014, 03:56 2
попробуй заменить mov esi,stro на lea esi,stro
0
Novilit-v
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 21
01.04.2014, 18:35  [ТС] 3
Так, часть проблемы решил - просто внезапно понял, какой же я дурак. movcb работает нормально - и копирует, и прибавляет указатель, но вот о возврате к исходному его значению он не заботится. Возвращаем адрес вручную, получаем видимую строку результата. В текущем варианте:
Кликните здесь для просмотра всего текста
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
void rever(char* stro) {
    char* fmt = "%s\n";
    char* fmt1 = "%c";
    char str1[10];
    str1[0]='0';
    str1[1]='1';
    str1[2]='2';
    str1[3]='3';
    str1[4]='4';
    str1[5]='5';
    str1[6]='6';
    str1[7]='7';
    str1[8]='8';
    str1[9]='\0';
    __asm{  
        mov esi, stro;
        lea edi, str1;
 
        push stro;
        call strlen;
        add esp, 4;
        mov ecx, eax;
        mov ebx, eax;
        cld;
        rep movsb;
 
        sub edi, ebx;
 
        push esi;
        push fmt;
        call printf;
        add esp, 8;
 
        push edi;
        push fmt;
        call printf;
        add esp, 8;
    }
}

При вводе "12345" выводит верные "123455678".
Однако разницы между кодом с cld и без него по-прежнему нет, хотя по-смыслу - должна быть, хотя бы в виде ошибки памяти. Теперь хотелось бы научиться выводить "12345"->"123454321". Спасибо тем, кто откликнулся и откликнется в будущем.
0
Mikl___
Автор FAQ
13304 / 6377 / 629
Регистрация: 11.11.2010
Сообщений: 11,536
02.04.2014, 03:49 4
Цитата Сообщение от Novilit-v Посмотреть сообщение
Однако разницы между кодом с cld и без него по-прежнему нет
Novilit-v,
при старте приложения DF=0 поэтому разницы и не будет, но вот если в тексте программы используется команда STD не забудь перед выходом из программы сделать CLD
0
Novilit-v
0 / 0 / 0
Регистрация: 14.10.2013
Сообщений: 21
04.04.2014, 23:17  [ТС] 5
Ошибки версии 2.0.
Есть код:
Кликните здесь для просмотра всего текста
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
55
56
57
58
59
void rever(char* stro) {
    char* fmt = "%s\n";
    char* fmt1 = "%c\n";
    char str1[10];
    str1[0]='a';//5
    str1[1]='b';//\0
    str1[2]='c';//*
    str1[3]='d';//*
    str1[4]='e';//*
    str1[5]='f';//\0
    str1[6]='g';//5
    str1[7]='h';//4
    str1[8]='i';//i
    str1[9]='\0';//\0
    __asm{  
        mov esi, stro;
        lea edi, str1;
 
        push stro;
        call strlen;
        add esp, 4;
        //dec eax;
 
        mov ecx, eax;
        add edi, eax;
 
l2:
        dec edi;
        mov ebx, [esi];
        mov [edi], ebx;
        inc esi;
        loop l2;
 
        push edi;
        push fmt;
        call printf;
        add esp, 8;
 
        inc edi; 
        push edi;
        push fmt;
        call printf;
        add esp, 8;
 
        
        add edi, eax;
        mov ecx, 8;
l3:
        push ecx;
        push edi;
        push fmt;
        call printf;
        add esp, 8;
        pop ecx;
        inc edi;
        loop l3;
        
    }
}

По замыслу он должен создавать строку с обратным порядком символов по отношению к данной, пробегая изначальную строку из начала в конец и результирующую - из конца в начало, без учёта (пока) символов конца строк. Однако вывод, создаваемый в конце, показывает "5\0***\054i\0" при вводе "12345" вместо "\054321ghi". При "54321" ->"1\0***\012i\0". Как исправить? И как это вообще работает при таком, казалось бы, простом коде? Результаты ввода/вывода:
Цепочечные операции
0
04.04.2014, 23:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2014, 23:17

Цепочечные команды
Реализовать на языке ассемблера набор процедур обработки строк из системы Turbo...

Цепочечные команды: поменять местами крайние символы
Ниже представлена мой фрагмент программы для замены местами крайние символы,...

Поменять в матрице четные столбцы с нечетными используя цепочечные команды
Задача: Поменять в матрице четные столбцы с нечетными используя цепочечные...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru