Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > ввод с клавиатуры - РАЗЪЯСНИТЕ!!!


Автор: darkness 10.12.2006, 16:49
Хочу: чтобы я ввёл строку и она отобразилась

Что я делаю:
Код

.model tiny
 .code
 org 100h
sta:
   mov dx, offset mes
   mov ah, 9
   int 21h
   
   mov dx, offset buf
   mov ah, 0Ah
   int 21h
   mov viv, dx
   mov dx, offset cr
   mov ah, 9
   int 21h
   mov dx,  viv
   mov ah, 9
   int 21h
   ret
   print:
   mes db "vvedite:$"
   buf db 9
   viv dw ?
   cr    db 0Dh, 0Ah, "$"
   end sta

Здесь для ввода строки используется функция AH = 0Ah, для которой  DS:DX - адрес буфера
выход: буфер содрежит введённую строку...
Как я понимаю это происходит так:
по адресу DX хранится введдённая строка
и мы можем спокойно значение DX присвоить какой-нибудь перменной той же viv (у меня в коде), чтобы потом  сторку вывести...

В чём я не прав?


Автор: anwe 10.12.2006, 20:38
Почитай-ка поподробнее описание функций 0Ah и 09h. Относительно первой почитай что содержится в первых двух байтах буфера. Относительно второй почитай чем ограничивается выводимая строка.

Автор: darkness 11.12.2006, 00:22
Про 0Ah:
в первый байт что записывается не нашёл, зато про второй- туда загоняется длина строки, а сама строка записывается начиная с третьего байта.....
Про 09h  подробного описания не нашёл....

Значит мне надо:

Код

 mov dx, offset buf
   mov ah, 0Ah
   int 21h
   mov viv, [dx+2]        ; так?
   mov dx, offset cr
   mov ah, 9
   int 21h
   mov dx,  viv
   mov ah, 9
   int 21h
   ret
   print:
   mes db "vvedite:$"
   buf db 9
   viv dw ?
   cr    db 0Dh, 0Ah, "$"
   end sta

Автор: anwe 11.12.2006, 01:09
09 выводит строку до первого встеченного "$".
Либо заполни свой буфер знаком.

Автор: darkness 11.12.2006, 01:40
anwe, это я понял...
 а что касается ввода:
Правильно ли я понимаю, что в DX хранится  адрес начала буфера?
И следовательно чтобы выйти на введённую строку нужно мы делаем
Код

 mov viv, [dx+2]

а после того чтобы вывести эту строку делаем:
Код

 mov dx,  viv
   mov ah, 9
   int 21h


Так?

Автор: anwe 11.12.2006, 02:03
Да так. Только оптимизируй его. Ты перегоняешь из viv в dx туда-сюда.

Автор: darkness 11.12.2006, 02:38
anwe,  ругается TASM на строку  mov viv, [dx+2]
говорит что illegal memmory reference. В чём ошибка?


Цитата

оптимизируй его


 smile  

Код

 .model tiny
 .code
 org 100h
sta:
   mov dx, offset mes
   mov ah, 9
   int 21h
   
   mov dx, offset buf
   mov ah, 0Ah
   int 21h
   mov viv, [dx+2]
   mov dx, offset cr
   mov ah, 9
   int 21h
   mov dx,  viv
   mov ah, 9
   int 21h
   ret
   print:
   mes db "vvedite:$"
   buf db 9
   viv dw ?
   cr    db 0Dh, 0Ah, "$"
   end sta

Автор: anwe 11.12.2006, 19:54
Эту ошибку он выдает потому, что из ячейки в памяти заносишь значение из ячейки в памяти. Команда mov этого не позваляет: должен быть один из операндов регистр.
Но после этого выдаст еще ошибку адрессации. До процессора 386 в качестве базы можно использовать только регистры bx, di, si и bp.

Автор: darkness 12.12.2006, 09:53
anwe, и какая альтернатива?

Автор: anwe 12.12.2006, 21:26
Как какая? Считывай переменную в регистр (любой), а после, если надо - в любую переменную.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)