Вывод строк

Тема в разделе "WASM.BEGINNERS", создана пользователем studentTest, 3 дек 2009.

  1. studentTest

    studentTest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2009
    Сообщения:
    3
    в общем нужно ввести строку из нескольких слов, а вывести каждое слово на новой строке с фиксированным отступом от предыдущего слова, т.е. должна получиться лесенка из введенных слов.

    пока получилось только просто столбик сделать
    Код (Text):
    1. data segment
    2. NL db 0Ah, 0Dh, '$'
    3. Buf DB 255, 0, 256 DUP (0) ;
    4. data ends
    5. code segment ;отмечаем начало сегмента кодов
    6. assume cs:code, dsata
    7. START:
    8. mov ax,data ;копируем адрес
    9. mov ds,ax ;сегмента данных
    10. mov dx,offset Buf ;считываем строку с клавиатуры
    11. mov ah,0Ah
    12. int 21h
    13. xor cx,cx
    14. mov al,[Buf+1] ;если считано 0 байт, то выход из
    15. mov cl,al ;задаем количество повторений (длина строки)
    16. test al,al ;программы
    17. jz Exit
    18. mov ah,09h
    19. mov dx,offset NL ; перейти на следующую строку
    20. int 21h
    21. mov si,offset Buf+2
    22. Cycle:
    23. mov dl,[si] ;считать символ
    24. cmp dl,' ' ;сравнить с пробелом
    25. jne Print ;если не пробел - вывести
    26. mov ah,09h ;если пробел - перевод каретки
    27. mov dx,offset NL ;адрес строки с переводом каретки
    28. int 21h ;вызов DOS
    29. jmp Space ;пропустить код вывода - пробел не выводим
    30. Print:
    31. mov ah,02h ;выбор функции 2
    32. int 21h ;вызов DOS
    33. Space:
    34. inc si ;перейти к следующему символу
    35. loop Cycle
    36. Exit:
    37. mov AX,4C00h ;выход
    38. int 21h ;из программы
    39. code ends
    40. END START
    а как сделать лесенку?
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.901
    studentTest
    наверное так
    Код (Text):
    1. .model tiny; приложение типа СОМ
    2. .286
    3. .code
    4. org 100h
    5. begin:  mov ax,3
    6.     int 10h; очищаем экран чтобы лучше видеть результат
    7.     mov ah,9
    8.     mov dx,offset a0    ;Выводим "лесенкой" 'Hello, world!'
    9.     int 21h
    10.     mov ah,0; ждем когда нажмут любую клавишу
    11.     int 16h
    12.     ret; выходим из программы
    13. a0 db 'He',0Ah,'ll',0Ah,'o,',0Ah,' world!$'
    14. end    begin
     
  3. MEPOX

    MEPOX New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    259
    0Ah это и есть ввод строки,а ему, как я понял, надо чтобы была обычная строка. Так или не так?
     
  4. studentTest

    studentTest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2009
    Сообщения:
    3
    нужно ввести строку из нескольких слов. Например: слово1 слово2 слово3 слово4
    вывод на экране должен быть вот какой:
    слово1
    слово2
    слово3
    слово4
     
  5. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Если в первом примере кода удалить из второй строки "0Dh", чтоб получилось так:NL db 0Ah, '$', то скорее всего получится так:
    слово1
    слово2
    слово3
    слово4

    Сойдет?
     
  6. studentTest

    studentTest New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2009
    Сообщения:
    3
    конечно сойдет =))) а как чтобы с начала строки выводить? а то выводиться сначала со значительным отступом =(
     
  7. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    studentTest
    Всегда, всегда решайте задачу словами перед тем, как записать ее на языке программирования ;) Сразу можно написать только либо простые, либо рутинные фрагменты.

    Вывести слово 1. Перейти на строку ниже, в начало.
    Вывести Х пробелов. Вывести слово 2. Перейти на строку ниже, в начало.
    Вывести 2Х пробелов. Вывести слово 3. ...
    ...
    и так пока слова не кончились.

    Варианты: установка позиции курсора после вывода слова на строку ниже, с нужного столбца (если выводить пробелы кажется некрасивым решением). То есть вам надо что-то вроде:

    Код (Text):
    1. input string
    2. cls
    3. read_pos=String_start
    4. @infinite:
    5. read byte (read_pos)
    6. if read_pos=String_end then exit
    7. if byte=space then
    8.  col=col+N
    9.  row=row+1
    10.  setCurPos row, col
    11. else
    12.  print byte
    13. endif
    14. jmp @infinite
    Вот это, хрен знает на каком языке написанное (наверно, Бейсик - я к нему не равнодушен ;) ) - переведите на ассемблер. Для установки позиции курсора есть прерывание - или можно писать в некую ячейку в системных переменных. Для вывода 1 символа есть прерывание. +1 заменяете на inc, сложение - add, условия меняются на cmp+jz/jnz, а цикл уже и так есть - я сразу jmp написал :) Строка задается как есть (то есть как ее ввели - без всяких ухищрений с
    ), пробел будет признаком начала нового слова. N - это количество отступов от предыдущей ступеньки. Ввод кажется уже реализован выше - значит, остался только вывод.

    ЗЫ: А в "Студентам с лабораторными - сюда" для такого примитивного задания уже не подходила?
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.901
    studentTest
    Видимо мой пример для вас не подошел, хотя куда уж проще.
    Код (Text):
    1. .model small
    2. .286
    3. .code
    4. START:  mov ax,@data ;копируем адрес
    5.     mov ds,ax ;сегмента данных
    6.     mov es,ax
    7.     mov dx,offset Buf ;считываем строку с клавиатуры
    8.     mov ah,0Ah
    9.     int 21h
    10.     xor cx,cx
    11.     mov cl,[Buf+1]
    12.     jcxz Exit ;если считано 0 байт, то выход из программы
    13.     mov di,offset Buf+2
    14.     add di,cx
    15.     mov byte ptr [di],'$'; для дальнейшего вывода 9-ой функцией DOS
    16.     mov ax,3
    17.     int 10h; очищаю экран
    18.     mov al,' '; ищем пробелы в строке Buf
    19.     mov di,offset Buf+2
    20. a0: repne scasb
    21.     jnz a1; если cx=0 значит обработали всю строку
    22.     mov byte ptr [di-1],0Ah;если нашли пробел заменим его на перевод каретки
    23.     jmp a0
    24. a1: mov ah,09h
    25.     mov dx,offset Buf+2;адрес строки с переводом каретки
    26.     int 21h ;выводим лесенку из слов
    27.     mov ah,0
    28.     int 16h ;ждем пока пользователь нажмет клавишу
    29. Exit:   mov AX,4C00h ;выход
    30.     int 21h ;из программы
    31. .data
    32. Buf  DB 255, 0, 256 DUP (0) ;
    33. END START
     
  9. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.901
    studentTest
    вариант когда между словами вставляется 4 пробела и переход на новую строку
    Код (Text):
    1. .model small
    2. .286
    3. .code
    4. START:  mov ax,@data ;копируем адрес
    5.     mov ds,ax ;сегмента данных
    6.     mov es,ax
    7.     mov dx,offset Buf ;считываем строку с клавиатуры
    8.     mov ah,0Ah
    9.     int 21h
    10.     xor cx,cx
    11.     mov cl,[Buf+1] ;если считано 0 байт, то выход из
    12.     jcxz Exit
    13.     mov si,offset Buf+2 ;считываем строку с клавиатуры
    14.     mov di,offset Buf1 ;считываем строку с клавиатуры
    15. a0: lodsb
    16.     cmp al,' '; ищем пробел
    17.     jne a1
    18.     mov word ptr [di],'  '
    19.     add di,2
    20.     mov word ptr [di],0A20h
    21.     add di,2
    22. a1: stosb
    23.     dec cx; если cx=0 значит обработали всю строку
    24.     jnz a0
    25. a2: mov ax,3
    26.     int 10h
    27.     mov ah,09h
    28.     mov dx,offset Buf1;адрес строки с переводом каретки
    29.     int 21h ;выводим лесенку из слов
    30.     mov ah,0
    31.     int 16h ;ждем пока пользователь нажмет клавишу
    32. Exit:   mov AX,4C00h ;выход
    33.     int 21h ;из программы
    34. .data
    35. Buf  DB 255, 0, 256 DUP (0) ;
    36. Buf1 db 256 dup ('$')
    37. END START