Re: Асемблер
От: Dr_Sh0ck Беларусь  
Дата: 24.06.04 06:51
Оценка:
Здравствуйте, zeny, Вы писали:

Z>Подскажите пожелуйста как решить эту задачу:

Z>Необходимо сделать функцию, которая делает следующее:
Z>Дана строка слов разделённых пробелами, найти слово максимальной длинны.
Z>Зараннее благодарен!

"В лоб", что называется, и решай.
1. Поставь указатель на начало строки.
2. Найди первый символ, не являющийся пробелом. Добаляй к адресу размер 1 символа в байтах, пока не наткнешся на пробел.
3. Как только наткнулся на пробел, количество добавленных на шаге (2) символов и есть длина очередной строки
4. Сравниваешь полученную на шаге (3) длину с длиной предыдущей строки. И если она больше, то сохрани значение указателя.
5. Если не достигнут конец строки, переходи на шаг (2)
6. Как только достигнут конец всей строки, сохраненный указатель будет содержать начало самой длинной подстроки.

Давненько я на ассемблере ничего не писал, но это может выглядеть примерно так:
   mov di, offset _string ;в di загоняем адрес начала строки
   xor bx,bx              ;обнуляем bx - им будем индексировать
skip_spaces:
   mov al, [di+bx]        ;загружает первый символ строки
   inc bx
   cmp al, 020h           ;пропускаем все
   je skip_spaces         ;ведущие пробелы
   lea di, [di+bx-001h]   ;загоняем в di адрес первой подстроки (di = di + bx - 1)
   xor bx,bx
   xor cx,cxcx будем накапливать текущую наибольшую длину строки
next_char:
   mov al, [di+bx]
   inc bx
   or al, al              ;достигли конца строки?
   jz exit
   cmp al, 020h           ;если не достигли пробела,
   jne next_char          ;то продолжаем считать длину текущей подстроки
exit:
   cmp bx,cx              ;длина текущей построки больше, чем предыдущей?
   jna next_substring
   mov cx,bx              ;Если ДА, то сохраняем значение длины
   mov si,di              ;и указатель на эту подстроку
next_substring:
   lea di, [di+bx-001h]   ;переходим к следующему симаолу строки
   or al,al               ;достигли конца строки?
   jnz skip_spaces        ;если ДА, то выводим на печать самую длинную найденную подстроку
   ;на этом этапе в si находится начало самой длинной подстроки, а в cx - ее длина
   ;на экран ее можно вывести примерно так (хотя я тоже е уверен ибо многое забыл уже  :) )
   cld
   mov ah,00Eh
print_char:
   lodsb
   int 010h
   loop print_char


Этот код для ДОС-программы типа СОМ (те изначально CS=DS=ES=SS)

P.S. Это примерный код. Не гарантирую что он даже скомпилируется, ибо на асме не писал уже года 4
Do not fake yourself ;)
ICQ#: 198114726
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.