Помощь - Поиск - Пользователи - Календарь
Полная версия: разделение на слова
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ассемблер
samec
Добрый день всем. У меня есть такая задачка: "Ввести с клавиатуры строку, состоящую из нескольких слов. Вывести каждое слово на экран в отдельной строке, т.е. выдать слова в столбик."
Наделал вот чего :
 TITLE Program5 ;название программы
.MODEL small ;отводим под стек и под данные по 64Кб
.STACK 100h ;отмечаем начало сегмента стека
.DATA ;отмечаем начало сегмента данных
Char DB 0
Buf DB 255, 0, 256 DUP (0) ;

.CODE ;отмечаем начало сегмента кодов
main PROC
mov AX, @data ;копируем адрес
mov DS, AX ;сегмента данных
mov DX, offset Buf ;считываем строку с клавиатуры
mov AH, 0ah
int 21h
mov al, Buf+1 ;если считано 0 байт, то выход из
or al, al ;программы
jz Exit1
xor DX, DX
mov CX, DX
mov CL, Buf+1 ;задаем количество повторений (длина строки)
mov SI, offset Buf+2
CLD ;
Cycle:
LODS Buf
mov AH, 9h ;Выбор функции 9
mov DX,AX ;Адрес строки
int 21h ;Вызов DOS
Next:
loop Cycle
Exit1:
mov AX,4C00h ;выход
int 21h ;из программы
main ENDP
END main



Всё прекрасно компилируется даже, но работать не хочет На экране мерцает что то непонятное, и всё.
Подскажите, кто в этом шарит, где подправить и как???
Заранее благоарен!
samec
Вот код, если кому интересно, спасибо за него добрым юдям smile.gif
 TITLE Program5                 ;название программы
.MODEL small ;отводим под стек и под данные по 64Кб
.STACK 100h ;отмечаем начало сегмента стека
.DATA ;отмечаем начало сегмента данных
NL db 0Ah, 0Dh, '$'
Buf DB 255, 0, 256 DUP (0) ;

.CODE ;отмечаем начало сегмента кодов
main PROC
mov ax,@data ;копируем адрес
mov ds,ax ;сегмента данных
mov dx,offset Buf ;считываем строку с клавиатуры
mov ah,0Ah
int 21h
xor cx,cx
mov al,[Buf+1] ;если считано 0 байт, то выход из
mov cl,al ;задаем количество повторений (длина строки)
test al,al ;программы
jz Exit
mov ah,09h
mov dx,offset NL ; перейти на следующую строку
int 21h
mov si,offset Buf+2
Cycle:
mov dl,[si] ;считать символ
cmp dl,' ' ;сравнить с пробелом
jne Print ;если не пробел - вывести
mov ah,09h ;если пробел - перевод каретки
mov dx,offset NL ;адрес строки с переводом каретки
int 21h ;вызов DOS
jmp Space ;пропустить код вывода - пробел не выводим
Print:
mov ah,02h ;выбор функции 2
int 21h ;вызов DOS
Space:
inc si ;перейти к следующему символу
loop Cycle
Exit:
mov AX,4C00h ;выход
int 21h ;из программы
main ENDP

END main



Вопрос исчерпан.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.