15.05.2008, 15:38
общий
это ответ
Здравствуйте, Sbuber!
Программа под TASM в приложении
Приложение:
.model tiny .data;Сообщенияprompt db ‘Enter string: $‘result db 0dh,0ah,‘Result: $‘press db 0dh,0ah,0ah,‘Press any key$‘;Буфер для ф-и 0ahmax db 80 ;Максимальное число символовlen db 0 ;Здесь потом будет количество реально введенныхbuf db 80 dup (0) ;Сама строка .code .startup lea dx,prompt mov ah,9 int 21h ;Приглашающее сообщение lea dx,max mov ah,0ah int 21h ;Вводим строку lea si,buf ;Адрес строки mov di,si ;По этому адресу будем писать перевернутые слова xor cx,cx ;Счетчик буквmain_loop: ;Цикл анализа символов веденной строки lodsb ;Очередной символ cmp al,0dh ;Этот код завершает строку je tail ;проанализируем cmp al,‘ ‘ ;пробел? je inverse ;на анализ push ax ;все остальные коды сохраняем в стеке! inc cx ;Увеличиваем счетчик jmp main_loop ;Повторяемinverse: ;Очередной символ - пробел test cx,cx ;пробел сразу за словом? jnz inverse_loop ;Да, есть символы слова в стеке mov di,si ;Для последующих пробелов корректируем адрес записи ; (в строке ничего не делаем) jmp main_loop ;На продолжениеinverse_loop: ;Цикл инверсии слова pop ax ;Восстанавливаем символ из стека stosb ;Пишем по адресу [di] loop inverse_loop ;Повторяем cx раз mov al,‘ ‘ ;Добавляем пробел stosb jmp main_loop ;На продолжениеtail: ;Встретился код 0dh jcxz finish ;Есть предыдущие пробелы?last_inverse_loop: ;Нет, надо перевернуть последнее слово pop ax ;Аналогично... stosb loop last_inverse_loopfinish: ;Завершаем коррекцию строки mov byte ptr [di],‘$‘ ;записью кода ‘$‘(необходимо для 9-й ф-и) lea dx,result mov ah,9 int 21h ;Выводим ‘Result:‘ lea dx,buf mov ah,9 int 21h ;Строка lea dx,press mov ah,9 int 21h ;Press any key mov ah,0 int 16h ;Ждем нажатие на клавишу mov ax,4c00h int 21h ;Выходим в ДОС end
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен