Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Ассемблер] Работа со строками 
:(
    Опции темы
InviZible
Дата 7.4.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.9.2006

Репутация: нет
Всего: нет



Задание:
Вывести на экран те слова, которые отличны от последнего слова строки и первая буква этого слова входит в него ещё раз. 

Опыта работы со строками в асме вообще нет. Как я понимаю через 21 прерывания считывать и выводить. А вот как найти последнее слово и что б первая буква слова, отличного от последнего, входила в него ещё раз - проблема.
Заранее спасибо.
PM MAIL   Вверх
JAPH
Дата 8.4.2007, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 12
Всего: 23



Предположения, не оговорённые в задании: слова разделяются пробелами, всё, что отлично от пробела, входит в слово. Если не устраивает, то можно после ввода строки все несловесные символы заменить на пробел.
Код

        .386
dseg    segment use16
strn    db      0050h dup (0) ; Введённая строка
dseg    ends
cseg    segment use16
        assume  cs:cseg, ds:dseg, ss:sseg
@:      mov     ax, dseg
        mov     ds, ax
        mov     es, ax
        ; Вводим строку
        mov     ah, 3Fh
        mov     cx, 0050h
        xor     dx, dx
        xor     bx, bx
        int     21h
        ; Удаляем CRLF
        mov     di, ax
        sub     di, 2
        ; Заодно находим длину строки
        ; В CX будет храниться количество необработанных символов
        mov     cx, di
        mov     word ptr [di], 0
        ; Устанавливаем DI на последний символ
        dec     di
        ; В AL заносим разделитель
        mov     al, 20h
        ; Пропускаем концевые пробелы
        std
   repe scasb
        inc     di ; "Занесло"
        mov     bp, di ; Сохраним адрес последнего символа слова
        inc     cx ; CX тоже
        ; Найдём начало
  repne scasb
        ; Если не нашли пробел перед словом, то слово простирается до начала строки => строка из одного слова
        jne     short @quit
        ; Иначе в SI сохраняем адрес начала последнего слова
        lea     si, [di+2]
        ; В BP высчитываем его длину
        sub     bp, si
        inc     bp
        ; Далее пойдём от начала строки
        xor     di, di
        ; Запоздавшая корректировка CX
        inc     cx
        cld
        ; Цикл, находящий слова и выводящий подходящие
        ; Разделитель в AL
@1:     mov     al, 20h
        ; Пропускаем пробелы в начале строки и между словами
   repe scasb
        ; Если необработанных непробельных символов больше нет, то закругляемся
        je      short @quit
        ; Иначе корректируемся на первый непробельный символ
        inc     cx
        dec     di
        ; В DX сохраним адрес начала слова
        mov     bx, di
        mov     dx, di
        ; Найдём его конец
  repne scasb
        ; DI вернём на пробел после слова
        dec     di
        inc     cx
        ; Найдём длину слова в BX
        sub     bx, di
        neg     bx
        ; Сравним его длину с длиной последнего слова
        cmp     bx, bp
        jne     short @2
        ; Если длины совпали, то сами слова могут совпасть
        push    si
        push    di
        push    cx
        ; В CX длина слов
        mov     cx, bp
        ; В DI - начало тестируемого слова
        mov     di, dx
        ; В SI - начало последнего слова
        ; Сравниваем
   repe cmpsb
        pop     cx
        pop     di
        pop     si
        ; Если равны, то выводить не надо
        je      short @1
        ; Проверим второе условие
@2:     push    di
        push    si
        push    cx
        ; Возьмём первую букву
        mov     si, dx
        lodsb
        ; И поищем её в остатке слова
        mov     di, si
        mov     cx, bx
        dec     cx
  repne scasb
        pop     cx
        pop     si
        pop     di
        ; Если не нашли, переходим к следующему слову
        jne     short @1
        ; Иначе выводим
        push    cx
        ; Выведем символы слова
        mov     cx, bx
        ; И ещё один - символ после слова - пробел, чтобы разделить выводимые слова
        inc     cx
        xor     bx, bx
        mov     ah, 40h
        ; В DX уже хранится адрес начала слова
        int     21h
        pop     cx
        jmp     short @1
        ; Перед выходом переведём строку
@quit:  mov     ah, 02h
        mov     dl, 0Dh
        int     21h
        mov     dl, 0Ah
        int     21h
        mov     ax, 4C00h
        int     21h
cseg    ends
sseg    segment stack use16
        db      0400h dup (?)
sseg    ends
        end     @



--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
InviZible
Дата 8.4.2007, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 13.9.2006

Репутация: нет
Всего: нет



Спасибо, буду разбираться

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1709 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.