1 Востаннє редагувалося Rolana (13.12.2013 17:06:08)

Тема: Потрібна допомога! Обробка рядкових змінних

В нас Асемблер вивчається з ціллю ознайомлення, але лабораторні здавати потрібно.

Завдання: Ввести рядок тексту . Перевірити , чи є цей текст гіперпосиланням у форматі « 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

Я щось там намагалася переробляти. Наприклад , щоб підраховувало довжину рядка ... на цьому і заглохло все ( (

2

Re: Потрібна допомога! Обробка рядкових змінних

Переробити програму, яка робить щось інше, на ту, що робить те, що вам треба, складніше - бо все одно доведеться писати все, що вам треба, і ще додатково придумувати, як викинути те, що вам не треба.
А вам треба ввести рядок, це функція 0Ah переривання 21h. Потім по одній літері перевіряєте, чи воно те, що вам треба, до знаку нового рядку.

Подякували: Rolana1