Ввод с клавиатуры

Тема в разделе "WASM.BEGINNERS", создана пользователем darkness, 8 дек 2006.

  1. darkness

    darkness New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2006
    Сообщения:
    14
    Пытаюсь осуществить следующее: вводится строка, и тут же, после ввода, она отображается:

    Код (Text):
    1.     .model
    2.     .code
    3.     .286
    4.      org 100h
    5. st:
    6.      mov dx, offset mes1
    7.      mov ah, 9
    8.      int 21h
    9.      mov ah, 07h
    10.      mov viv, ah          ; как я понимаю введённый символ помещается в ah, но как сделать чтобы из ah это
    11.  ;значение присвоить переменной, а после чего эту переменную послать на вывод
    12.      int 21h
    13.  
    14.      mov dx, offset viv
    15.      mov ah, 9
    16.      int 21h
    17.      ret
    18. coni:
    19.      mes1  db "Vvod : $"
    20.      viv   db ?
    21.      end st
     
  2. murtix

    murtix New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    110
    Адрес:
    Russia
    Посмотри в "програмирование на асме для дзенствующих"
     
  3. darkness

    darkness New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2006
    Сообщения:
    14
    ок... будет непонятно отпишусь
     
  4. darkness

    darkness New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2006
    Сообщения:
    14
    а что это за W9X ? где его можно взять?
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    win 9x ? windows 95 - Me
     
  6. morkster

    morkster New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    31
    Это ошибка copy/paste? :)
    Помоему дожно быть так:

    Код (Text):
    1. mov ah, 07h
    2. int 21h ;введённый символ помещается в [b]al[/b] [i]после[/i] вызова перерывания
    3. mov viv, al
    и если не хочеш вывода всей памяти поселе viv то добавь

    Код (Text):
    1. mes1  db "Vvod : $"
    2. viv   db ?
    3. db "$"
    4. end st
     
  7. darkness

    darkness New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2006
    Сообщения:
    14
    вот код:
    Код (Text):
    1. .model tiny
    2. .code
    3.  org 100h
    4. sta:
    5.    mov dx, offset mes
    6.    mov ah, 9
    7.    int 21h
    8.   ; mov dx, offset buf
    9.    mov ah, 07h
    10.    int 21h
    11.  
    12.    mov viv, al
    13.    
    14.    mov dx, offset viv
    15.    mov ah, 9
    16.    int 21h
    17.    ret
    18.    mes db "vvedite:$"
    19.    buf db 9
    20.    viv db ?
    21.    db "$"
    22.    end sta
    просматривю его через debug всё равно догнать не могу.... почему резалт такой... Вроде всё логично сделал....

    P.S.: Прочитал "для Дзенствующих" - думал что всё понял, но как выясняется - нихрена....
     
  8. darkness

    darkness New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2006
    Сообщения:
    14
    Вот как оказывается:
    Код (Text):
    1. .model tiny
    2. .code
    3.  org 100h
    4. sta:
    5.    mov dx, offset mes
    6.    mov ah, 9
    7.    int 21h
    8.    mov ah, 07h
    9.    int 21h
    10.    mov viv, al
    11.     mov dx, offset cr
    12.    mov ah, 9
    13.    int 21h
    14.  
    15.  
    16.    mov dx, offset viv
    17.    mov ah, 9
    18.    int 21h
    19.    ret
    20.   print:
    21.    mes db "vvedite:$"
    22.    buf db 9
    23.    viv db ?
    24.    cr    db 0Dh, 0Ah, "$"
    25.    end sta
    В первом случае дамп показывал состояние следующее: vvedite:$.....
    Т.е. я могу предположить что при выводе, выводилась как сказал morkster вся память, или частично вся


    В этом же случае дамп показывает: vvedite:$.....$ Что так скажем ограничивает вывод 0Dh - 0Ah байтами...


    А теперь скажите, я в чём-нибудь прав?


    И ещё есть такая функция 0Ah - считать строку символов
    Про неё говорят
    вход: AH = 0Ah
    DS:lol: X - адрес буфера
    выход: буфер содрежит введённую строку

    т.е. это получается что при
    Код (Text):
    1.  mov dx, offset buf
    2.    mov ah, 0Ah
    3.    int 21h
    4. ; при buf db 9
    по адресу DX хранится введдённая строка?
    и мы можем спокойно значение DX присвоить какойнибудь перменной той же viv (у меня в коде) чтобы потом можно сторку вывести след образом:
    Код (Text):
    1.  mov dx,  viv        
    2.    mov ah, 9
    3.    int 21h
    Разъясните! ПЛИЗ!!!!
     
  9. morkster

    morkster New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    31
    тааак...
    функция 09h просит $ terminated string, то-есть если у тебя после viv не будет значка $ то DOS будет выводить содержимое памяти пока его не найдёт или а) конца сегмента б) не знаю, но не проще ли поставить $

    тут просьба, если дамп то приводи hex коды тоже. я конечно могу догадаться что ..... скорее всего означает 09 хх 0D 0A где хх ASCII код считанной клавиши, но пятая точка меня немного конфузит...

    как я уже сказал наверху, вывод ограничивается значком $, если ты это имел ввиду

    Вроде-бы оба кода в последних постах должны работать(тасма под рукой нету, не смог проверить).
    Первый должен вывести(при условии что нажали X):
    Код (Text):
    1. vvedite:X
    а второй:
    Код (Text):
    1. vvedite:
    2. X
    Просьба привести вывод программы, иначе не могу понять в чем проблема


    а насчёт 0Ah:

    Код (Text):
    1. mov dx, offset buf ;buf это не буффер, а структура типа http://www.ctyme.com/intr/rb-2563.htm#Table1344
    2. mov ah, 0Ah
    3. int 21h
    4. xor bx,bx
    5. mov bl,byte ptr [buf+1] ;заносим число считанных байтов в BX(в это число не входит cr)
    6. mov byte ptr [offset buf+2 + BX],"$" ;добавляем $ в конец. cr aka carrige return обрезаются
    7.  
    8. ...
    9.  
    10. mov dx,offset buf+2 ;а вот тут начало введённых символов
    11. mov ah,9
    12. int 21h
    13.  
    14. ...
    15.  
    16. buf db 9
    17. db ?
    18. db 9 dup("") ;если компилятор такого dupа не понимает замени на db "123456789"
     
  10. darkness

    darkness New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2006
    Сообщения:
    14
    так и есть...

    вот относительно рабочий код, резульатат след:
    Код (Text):
    1. vvedite:good   ; к примеру
    2.     goodgood    ; после ввода и нажатия Enter
    Вот сам код по ходу возникло ещё неск вопросов:
    Код (Text):
    1.  .model tiny
    2.  .code
    3.  org 100h
    4. sta:
    5.    mov dx, offset mes
    6.    mov ah, 9
    7.    int 21h
    8.    mov dx, offset buf
    9.    mov ah, 0Ah
    10.    int 21h
    11.    xor bx, bx
    12.    mov bl,byte ptr [buf]      ; ptr - переопределние типа             ;  что написано понимаю,
    13. ;но вот необходимость с трудом
    14. ; нельзя ли просто <asm> mov bl,byte ptr [buf] </asm>   и почему?
    15.  
    16.    mov byte ptr [offset buf+2 + BX],"$"    ;  buf+2 - это у нас начало введённых символов, по записи видно
    17. ; что offset buf+2+BX конец текущей строки, если это так то получается что строка всего занимает BX ???
    18. ; по-моему я немного запутался....
    19.  
    20.    mov dx, offset cr               ; в Зубкове написато что это что-то вроде перехода на новую строку
    21.    mov ah, 9                        ; но по результату это не видно
    22.    int 21h
    23.  
    24.    mov dx,offset buf+2
    25.    mov ah, 9
    26.    int 21h
    27.    ret
    28.    print:
    29.    mes db "vvedite:$"
    30.    buf db 9
    31.    db ?                       ; здесь нет никакой метки ну к примеру <asm> table db ? </asm>  т.е. мы неизвестно
    32. ;что определяем как  байт,  неинициализируя
    33.    db 9 dup("")               ; и вот это можно немного подробнее пояснить
    34.    cr    db 0Dh, 0Ah, "$"
    35.    end sta
     
  11. morkster

    morkster New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    31
    во первых в моем коде было "mov bl,byte ptr [buf+1]"
    во вторых, без xor bx,bx можно, в данном случае, потому-что BX у нас с самого начала программы "скорее всего" оставался 0
    я его(xor) туда запихал чисто по привычке
    почему?: надо убедится что bl=bx когда будем выполнять mov [offset buf+2 + BX],"$"
    если ты до этого кода использовал верхнюю часть bx aka bh и bh!=0 то доллар пролетит мимо и дальше возможно всякое. можешь написать mov bh,0 Если будешь читать про оптимизацию кода, поймёшь почему многие обнуляют регистры через xor

    в предидущем посте был линк на описание структуры буффер
    "mov dx, offset buf ;buf это не буффер, а структура типа http://www.ctyme.com/intr/rb-2563.htm#Table1344"
    видимо с английским не все дружат :dntknw:

    Код (Text):
    1. my_buffer:
    2. сколько_значков_пользователь_может_ввести_MAXimum db 9
    3. сколько_значков_пользователь_ввел db ? ;это заполнит DOS во время перерывания
    4. буффер_длинною_(сколько_значков_пользователь_может_ввести_MAXimum)байт db 9 dup(0) ; если компилятор такое понимает то это тоже самое что db 0,0,0,0,0,0,0,0,0 если нет, то можно любую строку длинной в (сколько_значков_пользователь_может_ввести_MAXimum)байт типа db "123456789" ;dup("") это моя опечатка :(
    "получается что строка всего занимает BX ???" да(если забыть про carrigereturn) так как в BX мы запихали сколько_значков_пользователь_ввел

    странно.. попробуй вывести строку типа message db "line1",0Dh,0Ah,"line2$"

    P.S. кажется что я только все запутываю :p
    P.P.S. орфография не проверена
     
  12. darkness

    darkness New Member

    Публикаций:
    0
    Регистрация:
    8 дек 2006
    Сообщения:
    14
    Кое в чём всё-таки разобрался...
    По-крайней мере я догнал свою ошибку с буффером...
    вот код:
    Код (Text):
    1.  .model tiny
    2.  .code
    3.  org 100h
    4. sta:
    5.    mov dx, offset mes
    6.    mov ah, 9
    7.    int 21h
    8.    mov dx, offset npar
    9.    mov ah, 0Ah
    10.    int 21h
    11.    xor bx, bx
    12.  
    13.    
    14.    mov [offset nam+bx+3],"$"
    15.  
    16.  
    17.    mov dx, offset cr
    18.    mov ah, 9
    19.    int 21h
    20.  
    21.   add viv, nam     ; !!!вот!!!
    22.    mov dx,offset viv
    23.    mov ah, 9
    24.    int 21h
    25.    ret
    26.    print:
    27.    mes db "vvedite:$"
    28.    viv db 5
    29.    NPAR     LABEL     BYTE           ;Список параметров:
    30.    MAX      DB        9             ; Максимальная длина
    31.    ACT      DB        ?              ; Реальная длина
    32.    NAM    DB        9 DUP (' ')
    33.  
    34.    cr    db 0Dh, 0Ah, "$"
    35.    end sta
    Вывддит только трёхзначные и меньше цифры, но в принципе я знаю как и это исправить...
    Вопрос другой: если я ввожу число и хочу выполнить с ним какую-н арифметику....
    как бы исбежать Illegal memory reference ???
     
  13. morkster

    morkster New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    31
    ну раз в принципе знаешь, то тебе и флаг в руки :)
    кстати, правильно выводит он только трёхзначные числа. можешь проверить заменив пробел в dup(' ') на любой 'видимый' значок, например dup('9')
    во первых, проц не понимает комбинаций типа 'команда память,память'(конечно может быть я неправ, компилятора под рукой нету а google лень), поэтому сначала надо завести один/оба из параметров в регистр

    для того чтобы это сделать, надо сначала переделать строку которую ввёл пользователь в 'номер'

    пример, если ACT=3:

    Код (Text):
    1. xor bx,bx; bx=0
    2.  
    3. mov bl,[NAM]
    4. sub bl,'0'
    5. mov ax,bx
    6. mov dx,10
    7. mul dx
    8.  
    9. mov bl,[NAM+1]
    10. sub bl,'0'
    11. add ax,bx
    12. mov dx,10
    13. mul dx
    14.  
    15. mov bl,[NAM+2]
    16. sub bl,'0'
    17. add ax,bx
    делать это надо конечно по-другому(в цикле), но идея вроде понятна
    авось опечаток небыло :)

    P.S. пояснение: от пользователя ты получаеш ASCII коды, а не номер. ASCII код нуля 30h, девятки 39h.
    Вывод, чтобы получить из 'знака числа' число, надо: sub znak,30h или sub znak,'0'