Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2023, 21:32   #1
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
Смущение tasm Удалить в строке слова, содержащие заданный набор букв

скажите почему не работает код хотел реализовать Удалить в строке слова, содержащие заданный набор букв.
Код:
.model small
.stack 100h

.data
    string db "The quick brown fox jumps over the lazy dog$"
    letters db "oe$"

.code
    mov ax, @data
    mov ds, ax
    
    lea si, string ; загружаем адрес строки в регистр SI
    lea di, string ; загружаем адрес строки в регистр DI для записи результата
    mov cx, 0      ; устанавливаем счетчик символов в 0
    
find_word:
    cmp byte ptr [si], 0 ; проверяем, достигнут ли конец строки
    je end_loop
    
    cmp byte ptr [si], ' ' ; проверяем, является ли текущий символ разделителем слов
    je end_word
    
    mov bx, offset letters ; загружаем адрес набора букв в регистр BX
check_letters:
    cmp byte ptr [bx], 0 ; проверяем, достигнут ли конец набора букв
    je copy_char
    cmp byte ptr [bx], [si] ; сравниваем текущую букву из набора с текущим символом в строке
    je end_word ; если буква из набора найдена в слове, переходим к следующему слову
    
    inc bx ; переходим к следующей букве из набора
    jmp check_letters ; продолжаем поиск
    
end_word:
    mov cx, 0 ; устанавливаем счетчик символов в 0
skip_word:
    inc si ; переходим к следующему символу
    cmp byte ptr [si], ' ' ; проверяем, достигнут ли конец слова
    jne skip_word ; если не достигнут, продолжаем пропускать символы
    
    jmp find_word ; переходим к следующему слову в строке
    
copy_char:
    mov al, [si] ; копируем текущий символ в регистр AL
    mov [di], al ; записываем его в результирующую строку
    inc cx ; увеличиваем счетчик символов
    inc si ; переходим к следующему символу
    inc di ; переходим к следующей позиции в результирующей строке
    
    jmp find_word ; переходим к следующему символу в строке
    
end_loop:
    mov byte ptr [di], 0 ; добавляем завершающий ноль в конец строки
    
    mov ah, 9 ; выводим результирующую строку на экран
    lea dx, string
    int 21h
    
    mov ah, 4ch ; завершаем программу
    int 21h
.end
ChestIotVaga вне форума Ответить с цитированием
Старый 05.04.2023, 23:13   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

1)
Код:
    cmp byte ptr [si], 0 ; проверяем, достигнут ли конец строки
    je end_loop
...
    cmp byte ptr [bx], 0 ; проверяем, достигнут ли конец набора букв
    je copy_char
Тогда как в конце строки у вас не 0, а '$'
Код:
    string db "The quick brown fox jumps over the lazy dog$"
    letters db "oe$"
2)
Код:
cmp byte ptr [bx], [si] ; сравниваем текущую букву из набора с текущим символом в строке
Сравнивать напрямую две ячейки памяти можно только командой cmps, но эти ячейки памяти должны адресоваться регистрами ds:si и esi. Хотя
Код:
    mov ax, @data
    mov ds, ax
о дополнительном сегменте данных вы не помните

P.S. Примерно посчитал индексы и, кажется, вы забываете символ пробела.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В символьной строке удалить все слова, которые содержат буквы, не входящие в разрешенный набор символов. StillNoob Общие вопросы C/C++ 0 07.10.2018 16:05
[C++] Помогите с данной темой: Не создавая отдельного файла, удалить из текстового файла слова, содержащие N гласных букв Mapuo__ Помощь студентам 3 20.04.2017 18:42
Вывести все слова содержащие заданный символ наибольшее количество раз Глеб Иванов Помощь студентам 1 09.04.2017 14:04
Даны предложения. Вывести слова, содержащие максимальное количество различных букв. ggjgj Общие вопросы C/C++ 0 03.12.2016 19:02
в тексте слова, содержащие ровно одну из 10 наиболее часто встречающихся букв yaroslav_bondarev Паскаль, Turbo Pascal, PascalABC.NET 3 16.12.2011 10:11