Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 30.04.2018
Сообщений: 26
MASM

Составить новую строку из слов исходной строки заданной длины

22.07.2019, 21:34. Показов 2645. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь разобраться, как в ассемблере работает цикл по строке.
Пишу процедуру, которая составляет новую строку из слов исходной строки заданной длины
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
NewString proc
        push ebp
        mov ebp, esp
        push esi
        push edi
        
        mov esi, [ebp + 8]  ; доступ к аргументу 4 (строка, из которой будут копироваться слова)
        mov edi, [ebp + 16] ; доступ к аргументу 2 (строка, в которую будут копироваться слова) 
        mov al, [ebp + 12] ; доступ к аргументу 3 (пока не используется)
 
        xor edx, edx    ; обнуление регистра
 
        dec esi
 
        ; переход к следующему слову
    L1: inc esi
        mov cl, [esi]   ; Заносим в регистр cl очередной символ
        test cl, cl
        jz END    ; Тут переход к выводу
        cmp cl, ' '
        jz PR ; Если пробел, то переходим к проверке числа букв
Правильно ли я написал цикл? И как правильно объявить переменную под счетчик букв?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.07.2019, 21:34
Ответы с готовыми решениями:

Сформировать строку из слов исходной длины заданной строки
Здравствуйте, помогите решить задачу на ассемблере, никак не могу сделать :(

Сформировать новую строку, состоящую из слов исходной строки
задача такая: дана строка состоящая из слов разделенных пробелами сформировать новую строку состоящую из слов исходной строки Пример...

Из исходной строки составить новую строку по правилу
HELP! Из исходной строки составить новую строку по следующему принципу: Сначала идет n символов исходной строки в прямом порядке, затем...

4
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8656 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
22.07.2019, 21:43
А где здесь цикл?

Для проработки алгоритма решили бы вы эту задачку на C. А так, вы на ходу экспериментируете.
0
0 / 0 / 0
Регистрация: 30.04.2018
Сообщений: 26
22.07.2019, 23:05  [ТС]
Про переход на L1 забыл
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
NewString proc
        push ebp
        mov ebp, esp
        push esi
        push edi
        
        mov esi, [ebp + 8]  ; доступ к аргументу 4 (строка, из которой будут копироваться слова)
        mov edi, [ebp + 16] ; доступ к аргументу 2 (строка, в которую будут копироваться слова) 
        mov al, [ebp + 12] ; доступ к аргументу 3 (пока не используется)
 
        xor edx, edx    ; обнуление регистра
 
        dec esi
 
        ; переход к следующему слову
    L1: inc esi
        mov cl, [esi]   ; Заносим в регистр cl очередной символ
        test cl, cl
        jz END    ; Тут переход к выводу
        cmp cl, 'a'
        jb L1
        cmp cl, 'z'
        ja L1
        cmp cl, ' '
        jz PR ; Если пробел, то переходим к проверке числа букв
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8656 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
22.07.2019, 23:32
Проработайте алгоритм на языке высокого уровня (ЯВУ).
Думаю, что у вас в алгоритме несколько ошибок:
1. Символ 00h нужно обрабатывать дважды - сначала как разделитель слов (пробел), а после - как признак конца строки. А у вас сразу завершается обработка.
2. Если отдельно не оговаривается, то в учебных заданиях слова разделяются пробелами, и за содержимым слов никакого контроля нет. У вас же как-то странно по разному будут обработаны слова vivat и Vivat.

Ещё раз повторю - отработайте алгоритм на ЯВУ!!!

Добавлено через 13 минут
На мой взгляд, должна быть примерно такая обработка - выделение слов. А уже, что делать со словами - другой вопрос.
Число палиндромов в строке

Ещё раз повторю - первичен алгоритм.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8656 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
04.08.2019, 17:29
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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
.686
.model flat, stdcall
option casemap :none
 
        include \masm32\include\windows.inc
 
        include \masm32\include\user32.inc
        include \masm32\include\kernel32.inc
        include \masm32\include\masm32.inc
 
        includelib \masm32\lib\user32.lib
        includelib \masm32\lib\kernel32.lib
        includelib \masm32\lib\masm32.lib
.data
        aszMsgInstant   db      0Dh, 0Ah, 'Instant:', 0Dh, 0Ah, 0
        aszMsgResult    db      0Dh, 0Ah, 'Result:', 0Dh, 0Ah, 0
        aszPressEnter   db      0Dh, 0Ah, 0Dh, 0Ah, "Press ENTER to exit", 0
        Delimiter       db      ' '
        uiLength        dd      3
        aszString       db      '    99   ghj tyt tyyt t    ui    uou hj', 0
.data?
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Result          dd      ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
 
.code
 
Process proc    lpSrcStr:DWORD, lpDestStr:DWORD, nLength:DWORD
 
        xor     ebx,    ebx             ;количество скопированных слов
        mov     esi,    [lpSrcStr]
        mov     edi,    [lpDestStr]
 
        ;пропуск разделителей
        @@SkipDelimiters:
                lodsb
                cmp     al,     [Delimiter]
        je      @@SkipDelimiters
        or      al,     al
        jz      @@Exit
        ;выделение слова из строки
        mov     edx,    esi             ;(edx-1) - на начало слова
        @@ExtractWord:
                or      al,     al      ;строка завершилась?
                je      @@Break
                cmp     al,     [Delimiter]
                je      @@Break
 
                lodsb
        jmp     @@ExtractWord
@@Break:
        mov     ecx,    esi             ;(esi-1) - на последнюю букву слова
        sub     ecx,    edx             ;ecx - длина слова
        cmp     ecx,    [nLength]
        jne     @@Continue
        ;длина слова равна требуемой - копируем слово в новую строку
        inc     ecx                     ;копируем не только слово, но и разделитель за ним
        sub     esi,    ecx
        rep     movsb
        inc     ebx                     ;количество скопированных слов
@@Continue:
        or      al,     al
        jnz     @@SkipDelimiters
@@Exit:
        cmp     ebx,    1               ;если слова копировались, то записать ноль по адресу [edi-1]
        adc     edi,    -1              ;если искомых слов не нашлось, то записать ноль по адресу [edi]
        mov     [edi],  al
        mov     eax,    ebx
        ret
Process endp
 
main    proc
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
 
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
 
        invoke  ClearScreen
 
        ;вывод исходных данных
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgInstant,\
                LENGTHOF aszMsgInstant - 1, ADDR BufLen, NULL
        invoke  WriteConsole, hConsoleOutput, ADDR aszString,\
                LENGTHOF aszString - 1, ADDR BufLen, NULL
        ;обработка
        invoke  Process,        ADDR aszString, ADDR Buffer, [uiLength]
        mov     [Result],       eax
        ;вывод результата
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
                LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL
        invoke  StrLen, ADDR Buffer
        mov     [BufLen],       eax
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
 
        invoke  ExitProcess, 0
main    endp
 
end     main
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.08.2019, 17:29
Помогаю со студенческими работами здесь

Добавлять в исходную строку заданной длины новые строки, пока не будет превышен размер исходной строки
Описать строку из 50 символов. В цикле запрашивать у пользователя строки длиной до 10 символов и добавлять их к исходной до тех пор, пока...

Сформировать новую строку, состоящую из нечётных слов исходной строки, разделённых 1 пробелом
Здравствуйте ,помогите разобраться со строками на примере это программы, и если можно то объясните как все таки работают стандартные...

Составить новую строку из всех гласных латинских букв исходной строки без повторений
доброго времени суток. прошу помоч знающих людей. вобщем задание такое.. есть строка, выбрать из нее все латинские гласные буквы и...

Строки. Составить новую строку из слов, в которых не встречается бука «н»
Дана произвольная строка символов. Составить новую строку из слов, в которых не встречается бука «н» («Н»). В результирующей стоке слова...

Сформировать новую строку, состоящую из чисел длин слов в исходной строке
Дана строка символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Сформировать новую строку,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru