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

Ввести строку. Вывести слова, содержащие букву «о» и количество таких слов

25.10.2016, 19:56. Показов 2324. Ответов 9
Метки нет (Все метки)

Здравствуйте, есть задание по написанию программы на ассемблере для консоли. Перелазила почти весь Интернет, просмотрела ваш форум, но ничего не помогло. Нашла кусочек программы, разбиралась в нем часов 5, пыталась переделать под свою, но тоже ничего не вышло.

Вот кусочек кода:
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
 m2: 
    mov eax, Len  ;длину строки в счетчик
    lea ebx, BUF  ;начало строки в ebx
    lea edx, Rez ;начало строки в edx   
    dec ebx
m3:
    cmp eax, 2   ;не равен ли счетчик 0
    je FAILED     ;равен=> к метке exit
    dec eax      ;ecx - 1 (смещение)  
    inc ebx     ;ebx + 1 (смещение)
    mov al, [ebx]    ;в регистр содержимое ячейки из строки  
    cmp al, 'r' ;сравниваем с "r"
    je m4       ;равен,переходим к метке m4
    
    cmp al, ' ' ;сравниваем с пробелом
    je m3       ;равен пробелу,переходим к метке m3
    
    inc ebx      ;перешли к след элементу строки
    cld         ;cбросили флаг,идем слева направо
    mov al, ' ' ;в регистр записываем пробел
    mov edi, ebx  ;в edi записываем ebx
repne scasb       ;пока не встретится пробел сравниваем
    dec edi ;    ;нашли пробел,получили его смещение
    mov ebx, edi  ;записали в ebx текущую позицию пробела    
    jmp m3      ;в метку m3
    
 
m4:         ;записываем слово начинающееся на букву 'r' в строку Rez   
    mov esi, ebx  ;для lodsb
    mov edi, edx  ;для stosb
    cld
n1:  
    lodsb       ;из esi символ в al
    mov ebx, edi
    cmp al, ' '
    je m5       ;если дошли до пробела, то слово закончилось,в метку m5
    stosb       ;символ al в edi     
    loop n1     ;цикл
m5: 
    inc COUNT   ;увеличили переменную, отвеч. за кол-во слов
    stosb       ;запишем пробел в строку rez чтобы слова были разделены 
    mov edx, edi  ;текущее смещение в dx
    dec eax      ;уменьшили счетчик
    jmp m3
Не понимаю, как организовать поиск пробела и переход к следующему слову (строки 18-25), а также как организовать в строках 11-13 поиск символа в слове не с начала строки, а во всем слове. Помогите, пожалуйста. Совсем потеряла надежду разобраться
Вложения
Тип файла: rar Console.rar (4.1 Кб, 3 просмотров)
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2016, 19:56
Ответы с готовыми решениями:

Ввести строку текста и распечатать слова содержащие букву И
Ввести строку текста и распечатать слова содержащие букву И

Вывести все слова из каждой строки, начинающиеся и заканчивающиеся на заданную букву и количество таких слов в каждой строке.
Ребят, всем привет!; Помогите, пожалуйста, решить задачу со строками на С++; Даны две строки,...

Ввести строку и букву, вывести только слова, заканчивающиеся на заданную букву
Помогите пожалуйста написать программу, нужно ввести строку и букву, вывести только слова,...

Ввести строку и слово. Вывести количество слов в строке, имеющих длину, равную длине введенного слова.
Как ввести строку и слово, чтобы вывести количество слов в строке, имеющих длину, равную длине...

9
1624 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,256
25.10.2016, 20:30 2
Renk, это задача на ассемблерную вставку? Если да, то во что? В С++? Т.к. ввода и прерываний чего-то не видно, да и код 32-битный.

Добавлено через 8 минут
Аааа, у вас там самопальная библиотека ввода-вывода...ну вообще веселуха.
0
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
25.10.2016, 20:53 3
Kukuxumushu, тут же обсуждалось, что от ТС надо хотя бы пару строчек кода. Вот Вам пожалуйста и даже не пару. Не важно что откуда то скачено, главное выложить (это я так понял новая фишка). А теперь делайте. Но делать ли ? это дело каждого.
0
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 4
25.10.2016, 21:04  [ТС] 4
мановар, простите, что у меня на форуме тысяча тем, где я прошу (нет, требую!) написать мне код по каждой программе, не попытавшийся при этом что-либо сделать самой или хотя бы понять, о чем там речь. Искренне раскаиваюсь.
0
1624 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,256
25.10.2016, 21:34 5
мановар, да причём тут это? Я прост попытался понять как там ввод/вывод происходит, куда и в каком формате буфер писать/читать, а оказалось там всё самопалом. Т.к. выводить надо несколько слов, а это или разделять 10,13 или за несколько обращений, которые в саму процедуру пихать. Обычно же такие поделки под ДОС делают.
0
1718 / 567 / 187
Регистрация: 12.03.2016
Сообщений: 2,169
25.10.2016, 22:44 6
Renk, объясните мне пожалуйста, для кого Вы выложили этот кусочек кода и зачем? Я этого не понимаю, а когда я что то не понимаю, мне очень хочется это понять.

Добавлено через 17 минут
Kukuxumushu, я вот тоже сижу репу чешу.
0
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 4
25.10.2016, 23:09  [ТС] 7
Kukuxumushu, другого способ я не нашла, поэтому попробовала сделать этот вариант. Но, увы, не настолько оказалась понятливая.

мановар, я когда чего-то не понимаю, мне тоже хочется понять это и разобраться в этом. Если бы у меня был человек, который смог это объяснить мне или натолкнуть хотя бы на мысль, вряд ли бы я писала сюда.

И код я выложила, чтобы было видно, от чего я отталкивалась и что пыталась сделать. Этот код без некоторых строчек выводит мне в консоль одно слово с заданной буквой, но вот несколько слов не хочет. Я не знаю всех тонкостей этого прекрасного языка, но все-таки думала, что строка в ДОСе и строка в консоли одинаковые и пробелы в них тоже одинаковые.
0
1624 / 809 / 146
Регистрация: 13.06.2015
Сообщений: 3,256
26.10.2016, 00:17 8
Цитата Сообщение от Renk Посмотреть сообщение
думала, что строка в ДОСе и строка в консоли одинаковые и пробелы в них тоже одинаковые.
Это в корне ошибочное мнение.
Так вам то надо в ДОСе или в консоли Windows через WinAPI?
0
0 / 0 / 0
Регистрация: 25.10.2016
Сообщений: 4
26.10.2016, 18:57  [ТС] 9
Kukuxumushu, мне необходимо в консоли Windows, но я не знаю, как это организовать другим способом.
0
Эксперт Hardware
Эксперт Hardware
5406 / 1947 / 357
Регистрация: 29.07.2014
Сообщений: 2,863
Записей в блоге: 4
28.10.2016, 14:02 10
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Renk, есть куча вариантов, ..вот тебе один из них на FASM'е..
Здесь, создаётся таблица с адресом начала каждого слова в строке, и его длиной.
Формат таблицы такой: 00401010:15, 00401025:10 и т.д. Такая запись означает, что первое слово в строке начинается с адреса(401010h) и имеет длину 15-символов. Второе - с адреса(401025h), и длиной(10). Каждая запись размером DWORD.

Теперь можно проверить каждое слово на символ("о"), и если таковой имеется, то выводим его на экран. 'REPNE SCASB' ищёт символ(AL) в строке с адресом(EDI) и длиной(ECX). После каждого шага 'EDI' автоматом увеличивается на один, а ECX - уменьшается. Если после 'SCASB' установился флаг(CF) или регистр(ECX) не равен нулю, значит поиск дал результат. Иначе - нет такого символа:
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
;FASM-code...
format PE Console 4.0
include 'win32a.inc'
entry start
 
section '.data' data readable writeable
 
mes       db  'Type string: '
stdOut    dd  0                ;место под хэндлы ввода-вывода
stdIn     dd  0                ;
size      dd  0                ;длина строки
buff      db  128 dup(0)       ;буфер для строки (макс.128-символов)
table     dd  32 dup(0)        ;таблица с адресами начала слов (макс.16-слов)
 
section '.text' code readable executable
 
start:  invoke  GetStdHandle, -11     ;получаем хэндлы консоли
        mov     [stdOut], eax         ;(монитор
        invoke  GetStdHandle, -10     ;   ..и клава)
        mov     [stdIn], eax
 
;------ Запрос на ввод, и вводим строку
        invoke  WriteConsoleA, [stdOut], mes, 13,0,0
        invoke  ReadConsoleA, [stdIn], buff, 128, size, 0
 
;------ Создаём таблицу адресов начала и длины каждого слова в строке
        mov     edi,buff              ; адрес строки
        mov     ecx,[size]            ; её длина
        xor     esi,esi               ; смещение в таблице
        mov     ebp,1                 ; счётчик слов (1 в дефолте)
        mov     al,' '                ; что искать
@findSpace:                           ;
        mov     ebx,ecx               ; BX = длина от начала
        mov     dword[table+esi],edi  ; запишем в таблицу адрес начала слова
        add     si,4                  ;    ..(шаг вправо в таблице)
        repne   scasb                 ; искать пробел в строке!
        sub     ebx,ecx               ; вычисляем длину слова
        mov     dword[table+esi],ebx  ; запишем её в таблицу
        add     si,4                  ;    ..(шаг вправо)
        inc     ebp                   ; увеличиваем счётчик слов
        or      ecx,ecx               ; всю строку проверили?
        jnz     @findSpace            ; переход, если нет..
 
;------ Поиск в каждом слове символа(о), и вывод этого слова на консоль
; адрес слов и их длину будем брать из таблицы.
; BP = кол-во указателей в таблице (общее кол-во слов в строке).
        mov     esi,table             ; адрес таблицы в SI
@findChar:
        dec     ebp                   ; все слова проверили?
        jz      @exit                 ; выйти, если да..
        lodsd                         ;
        xchg    edi,eax               ; EDI = адрес начала очередного слова
        lodsd                         ;
        xchg    ecx,eax               ; ECX = длина этого слова
        push    ecx edi               ; запомнить для вывода на консоль!
                                      ;
        mov     al,'o'                ; что искать в слове..
        repne   scasb                 ; поиск!
        or      cx,cx                 ; запомним результат поиска во-флагах
        pop     edi ecx               ; снимаем со-стека атрибуты слова
        jz      @findChar             ; проверить флаги!
                                      ;   ..следующее слово (если нет результата).
 
invoke  WriteConsoleA, [stdOut],edi,ecx,0,0  ; иначе: отправляем атрибуты слова,
        jmp     @findChar                    ; ..в параметры функции вывода на экран.
 
@exit:  invoke  ExitProcess, 0        ; выход из программы!
;---------------------------------------------------------------------------
 
section '.idata' import data readable
 
  library kernel, 'KERNEL32.DLL'
  import kernel,\
       WriteConsoleA,'WriteConsoleA',\      ; API для импорта из кернел32.
       ReadConsoleA,'ReadConsoleA',\
       GetStdHandle,'GetStdHandle',\
       ExitProcess, 'ExitProcess'
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.10.2016, 14:02
Помогаю со студенческими работами здесь

Ввести строку и слово. Вывести количество слов в строке, имеющих длину, равную длине введенного слова.
Ввести строку и слово. Вывести количество слов в строке, имеющих длину, равную длине введенного...

Ввести строку. Определить количество слов, содержащих букву Z
10) Ввести строку. Определить количество слов, содержащих букву Z

Ввести строку Вывести на экран слова, содержащие три буквы
2.Ввести строку. Вывести на экран слова, содержащие три буквы.

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


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

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

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