Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 2
Регистрация: 11.10.2015
Сообщений: 42

Поиск слова на экране

28.11.2016, 22:07. Показов 2296. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно написать программу, которая найдет на экране "запретное" слово и заменит его выбранными знаками.
Есть такая программка, которая отображает текст в ASCIZ, возможно на её основе можно сделать что-то подобное, но не совсем понимаю как. Буду благодарна за любые советы.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
org 100h
 
mov ax, 0b800h
mov es, ax 
mov bp, 0
petla:
 
    inc byte [es:bp]
 
    add bp, 2
    cmp bp, 80*24*2
jl petla
 
mov ax, 4c00h
int 21h
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.11.2016, 22:07
Ответы с готовыми решениями:

Поиск слова на экране
Хочу написать программу, которая будет на экране находить слово (в текстовом формате) и выводить координаты его нахождения по осям Х У в...

Дана строка.Найти в ней те слова, которые начинаются и заканчиваются одной и той же буквой.Вывести эти слова на экране
Дана строка.Найти в ней те слова, которые начинаются и заканчиваются одной и той же буквой.Вывести эти слова на экране. Вот код: ...

Дана строка.Найти в ней те слова, которые начинаются и заканчиваются одной и той же буквой.Вывести эти слова на экране
Дана строка.Найти в ней те слова, которые начинаются и заканчиваются одной и той же буквой.Вывести эти слова на экране. Вот код: var ...

22
 Аватар для Ratio
6 / 6 / 0
Регистрация: 24.09.2016
Сообщений: 59
28.11.2016, 23:05
А для вам это понадобилось, если не секрет?
Именно на ассемблере? И под дос?
0
0 / 0 / 2
Регистрация: 11.10.2015
Сообщений: 42
28.11.2016, 23:33  [ТС]
Задание такое. На ассемблере (Nasm).
0
 Аватар для Ratio
6 / 6 / 0
Регистрация: 24.09.2016
Сообщений: 59
29.11.2016, 05:23
Допустим, что вы считали в буфер строку, ищите в ней заданное слово и заменяете его символами '*'.
Имеются следующие переменные:
searchword - слово которое надо найти
wordcharsnum - количество символов в слове
bufstring - строка в буфере
stringcharsnum - количество символов в строке
stringposition - текущая позиция в строке
Тогда алгоритм поиска будет выглядеть примерно так:

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
mov ebx, offset bufstring ; указатель начала строки
mov stringposition, ebx ; сохраняем позицию в начале
label0:
mov eax, offset searchword ; указатель начала слова
mov ebx, stringposition
mov dh, wordcharsnum 
mov dl, 1           ; dl текущее количество считанных символов слова
mov stringposition2, ebx ; сохраняем позицию в строке перед чтением слова
label1:
mov ch, [eax]
mov cl, [ebx] 
cmp ch, cl ; считываем по 1 байт слова и 1 байт строки и сравниваем их
jne notfoundword ; переход, если слово не найдено в текущей позиции
cmp dl, dh ; проверяем не достигли ли мы конца слова
je foundword ; переход, если конец достигнут (слово найдено!)
inc dl
inc eax
inc ebx    ; переход на следующий символ слова
jmp label1 ; повторяем операцию по кругу
foundword: ; если слово найдено
mov stringposition, ebx ; сохраняем позицию строки на конце слова
mov ebx, stringposition2 ; считываем позицию строки на начале слова
mov al, '*'
mov dh, wordcharsnum 
mov dl, 1
label2:
mov [ebx], al ; заменяем слово в строке символами '*'
inc ebx
inc dl
cmp dl, dh
jne label2 ; пока не достигнем конца слова
; в случае, если слово найдено, идем дальше на метку notfoundword
notfoundword: ; если слово не найдено
mov eax, stringposition
mov ebx, stringcharsnum
cmp eax, ebx ; проверяем не достигли ли мы конца строки
jae endsearch ; тогда поиск закончен
inc eax ; иначе переходим на следующий символ строки
mov stringposition, eax
jmp label0 ; и начинаем поиск слова заново
endsearch: ; конец поиска
Nasm'a я, к сожалению, не знаю, так что кое-что придется отредактировать.
Это все чем могу помочь.
1
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6209 / 2443 / 403
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
29.11.2016, 08:40
Цитата Сообщение от Kvitkaa Посмотреть сообщение
которая найдет на экране "запретное" слово
Как я понял, ключевой момент здесь "на экране".
Тогда нужно искать именно в видео-буфере, а не в сегменте данных, как предлагает Ratio.
Если строка лежит внутри программы, то можно просто использовать repe cmpsb
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
29.11.2016, 09:29
Цитата Сообщение от R71MT Посмотреть сообщение
Если строка лежит внутри программы, то можно просто использовать repe cmpsb
Не получится так. В видеопамяти символы лежат не друг за другом, а чередуются с атрибутами цвета.
0
0 / 0 / 2
Регистрация: 11.10.2015
Сообщений: 42
29.11.2016, 09:46  [ТС]
А может кто-то помочь переделать код выше на nasm? Пытаюсь, но выдает кучу ошибок.

Добавлено через 7 минут
Выдает ошибки, что bufstring, searchword и прочее не определены.
0
Эксперт Hardware
Эксперт Hardware
 Аватар для R71MT
6209 / 2443 / 403
Регистрация: 29.07.2014
Сообщений: 3,174
Записей в блоге: 4
29.11.2016, 10:11
Цитата Сообщение от Ethereal Посмотреть сообщение
чередуются с атрибутами цвета
..чередуются они в видеобуфере, а я говорю про буфер строки внутри программы.

Kvitkaa, если ты вводишь строку и не сохраняешь её в буфер, а только выводишь на экран, тогда нужно
искать её в видеобуфере, который построен так: байт-символа, байт-атрибута ..и т.д. для всей строки:
Code
1
2
3
4
5
6
7
C:\>debug
-d b800:0
B800:0000  4D 07 69 07 63 07 72 07 - 6F 07 73 07 6F 07 66 07   M.i.c.r.o.s.o.f.
B800:0010  74 07 20 07 57 07 69 07 - 6E 07 64 07 6F 07 77 07   t. .W.i.n.d.o.w.
B800:0020  73 07 20 07 58 07 50 07 - 20 07 5B 07 82 07 A5 07   s. .X.P. .[.....
B800:0030  E0 07 E1 07 A8 07 EF 07 - 20 07 35 07 2E 07 31 07   ........ .5...1.
B800:0040  2E 07 32 07 36 07 30 07 - 30 07 5D 07 20 07 20 07   ..2.6.0.0.]. . .
Здесь, байт со-значением(07) - это атрибут. Соответственно искать строку нужно будет через символ.
Если-же при вводе строки ты сохраняешь её во-внутренний буфер внутри программы, то достаточно поиска repe cmpsb. Определись, что именно тебе нужно сделать.

Добавлено через 3 минуты
Цитата Сообщение от Kvitkaa Посмотреть сообщение
Выдает ошибки
Это отрывок из кода, поэтому и не компилируется. Там нужно дописать ещё кучу всего
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
29.11.2016, 10:47
Лучший ответ Сообщение было отмечено Kvitkaa как решение

Решение

Code
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
    Model   Tiny        ;COM-программа, ассемблер TASM
    .Code
    Org 100h
 
Start:  xor ax, ax
    mov ds, ax
    mov bx, ds:44Eh ;смещение в видеосегменте тек.видеостраницы
    mov cx, ds:44Ah ;ширина экрана в текстовых колонках
    mov ah, 0B0h    ;B000 - видеосегмент монохромного режима
    cmp byte ptr ds:449h, 7 ;текущий видеорежим не 7 ли ?
    je  Mono
    mov ah, 0B8h    ;B800 - видеосегмент цветного режима
Mono:   mov ds, ax      ;видеосегмент в нашем случае
    mov al, 25      ;считаем, что высота экрана всегда 25 строк
    mul cl      ;получаем в ax число символов на экране
    sub ax, Mat_-Mat-1  ;хвост строки за границой страницы не ищем
    mov cx, ax      ;сколько начал строки будем проверять
        cld
@:  mov si, bx      ;ds:si - начало пров.строки в видеопамяти
    mov     di, offset Mat  ;es:di - начало образца для сравнения
@@: cmp byte ptr es:[di], 0 ;до нуля дошли - мат нашли
    je  Cenzura
    lodsb
    inc si
    cmp al, 'a'
    jb  _
    cmp al, 'z'
    ja  _
    and al, 0DFh    ;приведем к верхнему регистру
_:  scasb           ;буква совпала ?
    je  @@      ;если да - проверим еще одну
@@@:    inc bx
    inc bx
    loop    @
    retn            ;завершение программы
 
Cenzura:mov di, bx      ;ds:bx->начало_строки ds:si->сразу_за_ней
@@@@:   mov byte ptr ds:[di], '*'
    inc di
    inc di
    cmp si, di
    jne @@@@
    jmp @@@
 
Mat     db      'O-O-P-S'       ;заглавными буквами
Mat_    db  0       ;ноль - признак конца строки
 
    End Start
2
0 / 0 / 2
Регистрация: 11.10.2015
Сообщений: 42
29.11.2016, 11:33  [ТС]
все это прекрасно, но я не умею переделывать коды с Tasm на Nasm
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
29.11.2016, 12:07
Я могу принести извинения за неправильную помощь.

NASM достаточно редко встречается в вопросах форума и у него поэтому нет своей ветки.

Единственно, что могу предложить - поискать примеры на NASM в методичке и по ним изменить заголовки в приведённых программах. Сами тексты программ останутся неизменными.
Правильность переделки вы сможете проверить безошибочной компиляцией и последующим запуском для теста работоспособности.

Если сумеете разобраться - пожалуйста, опубликуйте решение.
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
29.11.2016, 12:31
Павел, ты заменил тег code на тег asm и текст ровно нарубленный табуляциями пошел зигзагом. Программа стала выглядеть неряшливо. Как кура лапой. На этом форуме тег asm писал явно не ассемблерный программист. Ну его с этим тегом в лес...

Добавлено через 5 минут
Цитата Сообщение от Kvitkaa Посмотреть сообщение
все это прекрасно, но я не умею переделывать коды с Tasm на Nasm
Тогда медицина бессильна.

Я специально написал в TASM, чтобы ты хоть что-то сделала сама. Поразбиралась с программой что-ли. А такого чтобы тут тебе написали и ты сразу побежала сдавать...
1
0 / 0 / 2
Регистрация: 11.10.2015
Сообщений: 42
29.11.2016, 12:35  [ТС]
Код переделала, он скомпилировался и даже работает, но не совсем как мне нужно. Выполняет замену только одного слова, а мне нужно, чтобы находило в строке это слово и заменяло его на символы.

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
    Org 100h
 
xor ax, ax
    mov ds, ax
    mov bx, [ds:44Eh] ;смещение в видеосегменте тек.видеостраницы
    mov cx, [ds:44Ah] ;ширина экрана в текстовых колонках
    mov ah, 0B0h    ;B000 - видеосегмент монохромного режима
    cmp byte [ds:449h], 7 ;текущий видеорежим не 7 ли ?
    je  Mono
    mov ah, 0B8h    ;B800 - видеосегмент цветного режима
 
Mono:   mov ds, ax      ;видеосегмент в нашем случае
    mov al, 25      ;считаем, что высота экрана всегда 25 строк
    mul cl      ;получаем в ax число символов на экране
    sub ax, Mat_-Mat-1  ;хвост строки за границой страницы не ищем
    mov cx, ax      ;сколько начал строки будем проверять
        cld
 
  @:  mov si, bx      ;ds:si - начало пров.строки в видеопамяти
    mov     di, Mat  ;es:di - начало образца для сравнения
 
@@: cmp byte [es:di], 0 ;до нуля дошли - мат нашли
    je  Cenzura
    lodsb
    inc si
    cmp al, 'a'
    jb  _
    cmp al, 'z'
    ja  _
    and al, 0DFh    ;приведем к верхнему регистру
_:  scasb           ;буква совпала ?
    je  @@      ;если да - проверим еще одну
 
@@@:    inc bx
    inc bx
    loop    @
    retn            ;завершение программы
 
Cenzura:mov di, bx      ;ds:bx->начало_строки ds:si->сразу_за_ней
@@@@:   mov byte [ds:di], '*'
    inc di
    inc di
    cmp si, di
    jne @@@@
    jmp @@@
 
Mat     db      'O-O-P-S'       ;заглавными буквами
Mat_    db  0       ;ноль - признак конца строки
0
29.11.2016, 12:36

Не по теме:

Ethereal, хорошо. Я заменю обратно. И в Ваших сообщениях буду считать это авторской задумкой.

Правда, можно настроить редактор, чтобы он при сохранении заменял табы на пробелы и получать однообразно выглядящий текст.
Кроме того, размеры таба в редакторах выставлены равными 4, а при форматировании в обычных просмотровщиках текста - 8. Поэтому форматирование плывёт.
Тэг ASM даёт преимущество, что у каждой строки есть номер и можно его указывать при обсуждении.
Тэг ASM даёт преимущество, что добавляется подсветка синтаксиса.
При копировании Вашего текста в редактор с другими настройками таба форматирование опять же "поплывёт".

По этим причинам, прошу всё же перенастроить редактор и пользоваться тегом ASM.

0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
29.11.2016, 12:46
Цитата Сообщение от Kvitkaa Посмотреть сообщение
Выполняет замену только одного слова, а мне нужно, чтобы находило в строке это слово и заменяло его на символы.
Почему одного ? Всех что есть на экране. Правда там у меня явно подразумевается, что в текстовом режиме 25 строк (чтобы не усложнять программу еще). Если их больше, то заменит в первых 25 строках консоли все появления нецензурного слова.

Щас проверю твою переделку. Где там у меня NASM ?

Добавлено через 6 минут
Да все правильно работает. Я составил текстовый файл a.txt с каким-то текстом, пересыпанным
O-O-P-S в нескольких местах. Вывалил этот текст на экран командой
type a.txt
и тут-же запустил программу. Все появления O-O-P-S на экране она заменила звездочками.
1
0 / 0 / 2
Регистрация: 11.10.2015
Сообщений: 42
29.11.2016, 13:03  [ТС]
Всё, разобралась, спасибо.

Добавлено через 14 минут
а можно как-то сделать, чтобы были не заглавные буквы?
0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
29.11.2016, 13:07
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Кроме того, размеры таба в редакторах выставлены равными 4
Это в тех редакторах, которые табуляцию насмерть убивают, заменяя ее пробелами. А меж тем табуляция реально существует. Это ASCII управляющий символ с кодом 9. И говоря о табуляции я имею ввиду именно этот символ в тексте.
mov dl,9
mov ah,2
int 21h
Вот этот. И настоящая табуляция с кодом 9 дает оступ 8, только 8 и ничего кроме 8.

Добавлено через 1 минуту
Цитата Сообщение от Kvitkaa Посмотреть сообщение
а можно как-то сделать, чтобы были не заглавные буквы?
Строки с 27-й по 31-ю из твоего исходника выше выкинь и программа не будет приводить буквы к заглавным. Т.е. маленькие и большие буквы будут для нее различными.
0
29.11.2016, 13:21

Не по теме:

Нет, именно в исходнике не заменяют. Замена идёт лишь в каком-то внутреннем, недоступном буфере для отображения на экран. И вот там идёт замена таба на 4 пробела.

Сейчас посмотрел внимательнее. На форуме сделана замена таба на 4 пробела, как и предлагают по-умолчанию многие программистские редакторы (Notepad++, Programmers Notepad [WinAVR], AvrStudio, Code::Block, qeditor [masm32] и т.д.).

Я пока пользуюсь SciTE и для ASM ещё не перенастроил редактор на таб=8 и замену табов на пробелы при сохранении (для Pascal это уже давно настроил). Но это лишь вопрос времени.

0
 Аватар для Ethereal
6773 / 2741 / 385
Регистрация: 17.02.2013
Сообщений: 4,048
29.11.2016, 13:28
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
И в Ваших сообщениях буду считать это авторской задумкой.
Считай это old style старого пня, для которого текстовый редактор - это F4 в Norton Commander.
0
29.11.2016, 13:41

Не по теме:

Но, опять же, напомню, что тэг ASM над CODE имеет преимущества:
- кнопка "Выделить код"
- нумерация строк
- подсветка синтаксиса

А замена табов на пробелы
- при копировании текста в редактор с другими настройками таба форматирование не "поплывёт".

А так, получаем один вид у Вас и другой вид у топикстартера (с тэгами ASM) в пределах одной темы. У незнакомых с причинами появляется брезгливое отношение к "криворукому" топикстартеру.

Год назад я интересовался наличием автоформаттера для ассемблера и, к сожалению, ничего бесплатного не нашёл (кроме скриптов для разработчиков KolibryOS).

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.11.2016, 13:41
Помогаю со студенческими работами здесь

Дана строка. Найти в ней все слова, которые начинаются и заканчиваются одной и той же буквой. Вывести эти слова на экране.
Дана строка. Найти в ней все слова, которые начинаются и заканчиваются одной и той же буквой. Вывести эти слова на экране.

Поиск пикселя и поиск изображения на экране
Переписываю код из clickermann для запуска его на C++. Мне нужны две функции которые выполняли бы сканирование экрана и поиск пикселя...

Поиск изображения на экране
Нужно сделать метод, который будет искать на экране определённое изображение. Ни в каком месте, ни размер изображения нам заранее не...

Поиск пиксела на экране
Нашел тему. вот топик. Удалено Правила 5.8 Запрещено публиковать ссылки на другие форумы, а также их пропаганда. Вот скрипт......

Поиск изображения на экране
Нужно сделать метод, который будет искать на экране определённое изображение. Ни в каком месте, ни размер изображения нам заранее не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru