в общем нужно ввести строку из нескольких слов, а вывести каждое слово на новой строке с фиксированным отступом от предыдущего слова, т.е. должна получиться лесенка из введенных слов. пока получилось только просто столбик сделать Код (Text): data segment NL db 0Ah, 0Dh, '$' Buf DB 255, 0, 256 DUP (0) ; data ends code segment ;отмечаем начало сегмента кодов assume cs:code, dsata START: 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 ;из программы code ends END START а как сделать лесенку?
studentTest наверное так Код (Text): .model tiny; приложение типа СОМ .286 .code org 100h begin: mov ax,3 int 10h; очищаем экран чтобы лучше видеть результат mov ah,9 mov dx,offset a0 ;Выводим "лесенкой" 'Hello, world!' int 21h mov ah,0; ждем когда нажмут любую клавишу int 16h ret; выходим из программы a0 db 'He',0Ah,'ll',0Ah,'o,',0Ah,' world!$' end begin
нужно ввести строку из нескольких слов. Например: слово1 слово2 слово3 слово4 вывод на экране должен быть вот какой: слово1 слово2 слово3 слово4
Если в первом примере кода удалить из второй строки "0Dh", чтоб получилось так:NL db 0Ah, '$', то скорее всего получится так: слово1 слово2 слово3 слово4 Сойдет?
конечно сойдет =))) а как чтобы с начала строки выводить? а то выводиться сначала со значительным отступом =(
studentTest Всегда, всегда решайте задачу словами перед тем, как записать ее на языке программирования Сразу можно написать только либо простые, либо рутинные фрагменты. Вывести слово 1. Перейти на строку ниже, в начало. Вывести Х пробелов. Вывести слово 2. Перейти на строку ниже, в начало. Вывести 2Х пробелов. Вывести слово 3. ... ... и так пока слова не кончились. Варианты: установка позиции курсора после вывода слова на строку ниже, с нужного столбца (если выводить пробелы кажется некрасивым решением). То есть вам надо что-то вроде: Код (Text): input string cls read_pos=String_start @infinite: read byte (read_pos) if read_pos=String_end then exit if byte=space then col=col+N row=row+1 setCurPos row, col else print byte endif jmp @infinite Вот это, хрен знает на каком языке написанное (наверно, Бейсик - я к нему не равнодушен ) - переведите на ассемблер. Для установки позиции курсора есть прерывание - или можно писать в некую ячейку в системных переменных. Для вывода 1 символа есть прерывание. +1 заменяете на inc, сложение - add, условия меняются на cmp+jz/jnz, а цикл уже и так есть - я сразу jmp написал Строка задается как есть (то есть как ее ввели - без всяких ухищрений с ), пробел будет признаком начала нового слова. N - это количество отступов от предыдущей ступеньки. Ввод кажется уже реализован выше - значит, остался только вывод. ЗЫ: А в "Студентам с лабораторными - сюда" для такого примитивного задания уже не подходила?
studentTest Видимо мой пример для вас не подошел, хотя куда уж проще. Код (Text): .model small .286 .code START: mov ax,@data ;копируем адрес mov ds,ax ;сегмента данных mov es,ax mov dx,offset Buf ;считываем строку с клавиатуры mov ah,0Ah int 21h xor cx,cx mov cl,[Buf+1] jcxz Exit ;если считано 0 байт, то выход из программы mov di,offset Buf+2 add di,cx mov byte ptr [di],'$'; для дальнейшего вывода 9-ой функцией DOS mov ax,3 int 10h; очищаю экран mov al,' '; ищем пробелы в строке Buf mov di,offset Buf+2 a0: repne scasb jnz a1; если cx=0 значит обработали всю строку mov byte ptr [di-1],0Ah;если нашли пробел заменим его на перевод каретки jmp a0 a1: mov ah,09h mov dx,offset Buf+2;адрес строки с переводом каретки int 21h ;выводим лесенку из слов mov ah,0 int 16h ;ждем пока пользователь нажмет клавишу Exit: mov AX,4C00h ;выход int 21h ;из программы .data Buf DB 255, 0, 256 DUP (0) ; END START
studentTest вариант когда между словами вставляется 4 пробела и переход на новую строку Код (Text): .model small .286 .code START: mov ax,@data ;копируем адрес mov ds,ax ;сегмента данных mov es,ax mov dx,offset Buf ;считываем строку с клавиатуры mov ah,0Ah int 21h xor cx,cx mov cl,[Buf+1] ;если считано 0 байт, то выход из jcxz Exit mov si,offset Buf+2 ;считываем строку с клавиатуры mov di,offset Buf1 ;считываем строку с клавиатуры a0: lodsb cmp al,' '; ищем пробел jne a1 mov word ptr [di],' ' add di,2 mov word ptr [di],0A20h add di,2 a1: stosb dec cx; если cx=0 значит обработали всю строку jnz a0 a2: mov ax,3 int 10h mov ah,09h mov dx,offset Buf1;адрес строки с переводом каретки int 21h ;выводим лесенку из слов mov ah,0 int 16h ;ждем пока пользователь нажмет клавишу Exit: mov AX,4C00h ;выход int 21h ;из программы .data Buf DB 255, 0, 256 DUP (0) ; Buf1 db 256 dup ('$') END START