Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка строковых переменных, Проверить нужная ли считана строка. 
:(
    Опции темы
Rolana
Дата 13.12.2013, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ооооочень нужна помощь. У нас Ассемблер изучается ознакомительно, а лабораторные сдавать надо.

Задание: Ввести строку текста. Проверить, является ли этот текст гиперссылкой в формате «http:\\www.abc.ua». Если да, то напечатать сообщение: «Это гиперссылка» в другом случае: «Это не гиперссылка».

Был дан пример работы со строковыми переменными:

Код

.model    small
.stack    100h
.data
    string db 80 dup(?)
    promt db 0Dh,0Ah,'Enter password: $'
    all db 0Dh,0Ah,'That is all$'
    ok db 0Dh,0Ah,'Working!!! $'
    password db 'pass$'
    pass_len dw 3
.code 
start:
    mov    ax,@data
    mov    ds,ax        ;В АХ-адреса початку сегмента даних
@beg1:
    mov    ah,09h    ;Вивiд запиту на введення пароля
    mov    dx,offset promt ;Адреса запиту
    inc    dx
    int    21h
                ;Введемо пароль
    mov    bx,0        ;iнiцiалiзацiя iндексацiї введення
    lea    si, string
@pass:
    mov    ah,08h    ;Функцiя введення символу в AL без ехо
    int    21h
    cmp    al,13        ;<Enter> ?
    je    @compare    ;Так, на порiвняння
    mov    [si],al
    mov    ah,02
    mov    dl,'*'        ;Запишемо на екран *
    int    21h
    inc    si
    jmp    @pass    ;Повторювати
                ;Порiвняння введеного пароля з дiйсним (порiвняння рядкiв)
@compare:
    push    ds        ;Встановити ES на сегмент даних
    pop    es
    lea    si,string    ;DS:SI- початок string
    inc    si
    lea    di,password    ;ES:DI- початок password
    inc    di
    cld            ;DF=0- перегляд вперед
    mov    cx,pass_len    ;Встановити лiчильник порiвняння
    repe    cmpsb    ;Порiвнювати, поки CX<>0 i ZF=1 (тобто повторювати
                ;поки символи двох рядкiв спiвпадають, але не бiльш CX раз)
    jne    @err        ;Рядки не рiвнi
                ;Виведення повiдомлення ОК, пiдтверджуючого правильнiсть пароля
    mov    ah,09h
    mov    dx,offset OK
    inc    dx
    int    21h
    jmp    @end1
@err:
    jmp    @beg1    ;Повторити введення пароля
@end1:
    mov    ah,09h
    mov    dx,offset All
    inc    dx
    int    21h
    jmp    @beg1
    MOV    AH,4ch    ;DOS-функцiя завершення роботи програми
    INT    21h        ;Виклик переривання DOS
start end
end


Я что-то там пыталась переделывать. Например, чтобы подсчитывало длину строки... на этом и заглохло всё(( 
PM MAIL   Вверх
ФедосеевПавел
Дата 14.12.2013, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Rolana, такие вещи проверяются при помощи регулярных выражений. Для учебной задачи на асм под DOS, полагаю подойдёт и сильно упрощённая проверка.
Проверку можно выполнить в такой последоватеьности.
1. Вызов процедуры upper case - привести все символы строки к верхнему регистру - можно ограничиться лишь латинскими символами от 'a' до 'z'.
2. Проверить, что первые 11 символов в строке равны другой строке-шаблону 'HTTP:\\WWW.'
3. Проверить, что следующие символы до точки входят в диапазон от 'A' до 'Z'.
4. Проверить, что осталось 2 символа и они равны строке-шаблону 'UA'.

На время отладки, можно строку не вводить, а задать её в сегменте данных - чтоб рука набивкой тестов не переутомилась.
string db 'http:\\www.abc.ua'

Попробуй начать. Реализуй поэтапно в виде подпрограмм. А потом всё соберёшь в единую прграмму.
Кое-что уже реализовано - сравнение строки с шаблоном.

Подброшу отнюдь не идеальный фрагмент UpperCase. Для преобразования после проверок используется вычитание потому, что в таблице ASCII, прописные символы расположены раньше строчных
Код

.model    small
.stack    100h
.data
    string db 'http:\\abcdefgHJKLMnoprsTUVwxyz.ua', '$'     ;строка
    len    dw ?                                             ;длина строки
    asCRLF db 0dh, 0ah, '$'
.code 
start proc
    mov    ax,@data
    mov    ds,ax        ;В АХ-адреса початку сегмента даних
@beg1:
    mov    ah,09h    ;Вивiд
    mov    dx,offset string ;Адреса запиту
    int    21h

    mov    ah,09h    ;Вивiд
    mov    dx,offset asCRLF
    int    21h

    lea    si, string
    call   UpperCase
    mov    len, cx

    mov    ah,09h    ;Вивiд
    mov    dx,offset string
    int    21h

    mov    ah,09h    ;Вивiд
    mov    dx,offset asCRLF
    int    21h

    mov    ax,4c00h  ;DOS-функцiя завершення роботи програми
    int    21h       ;Виклик переривання DOS
start endp

;Процедура UpperCase преобразует в строке строчные буквы латинского алфавита в прописные
;на входе
; ds:si - адрес преобразуемой строки, заканчивающаяся символом '$'
;на выходе
; преобразованная строка
; cx - длина строки
UpperCase proc
    pushf
    push   ax
    push   si
    cld
    mov    cx, 0
@@Next:
    lodsb
    cmp    al, '$'
    je     @@EndOfProc
    inc    cx
    cmp    al, 'a'
    jb     @@Next
    cmp    al, 'z'
    ja     @@Next
    sub    al, 'a'-'A'
    dec    si
    mov    [si], al
    inc    si
    jmp    @@Next

@@EndOfProc:
    pop    si
    pop    ax
    popf
    ret
UpperCase endp

end start

Хочу обратить твоё внимание на некорректный вызов функций DOS (прерывание 21h):
1. При выводе строки (int 21h ah=09h) лишний inc dx
2. При завершении программы вызов не ax=4c00h, а ah=4ch. Твой вызов был бы корректен, если бы в al загружалось что-то осмысленное - код возврата.

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

Это сообщение отредактировал(а) ФедосеевПавел - 14.12.2013, 09:17
PM   Вверх
Rolana
Дата 17.12.2013, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я сдала лабораторную)
Благодарю!
PM MAIL   Вверх
ФедосеевПавел
Дата 17.12.2013, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Молодец! smile  smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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