Пытаюсь осуществить следующее: вводится строка, и тут же, после ввода, она отображается: Код (Text): .model .code .286 org 100h st: mov dx, offset mes1 mov ah, 9 int 21h mov ah, 07h mov viv, ah ; как я понимаю введённый символ помещается в ah, но как сделать чтобы из ah это ;значение присвоить переменной, а после чего эту переменную послать на вывод int 21h mov dx, offset viv mov ah, 9 int 21h ret coni: mes1 db "Vvod : $" viv db ? end st
Это ошибка copy/paste? Помоему дожно быть так: Код (Text): mov ah, 07h int 21h ;введённый символ помещается в [b]al[/b] [i]после[/i] вызова перерывания mov viv, al и если не хочеш вывода всей памяти поселе viv то добавь Код (Text): mes1 db "Vvod : $" viv db ? db "$" end st
вот код: Код (Text): .model tiny .code org 100h sta: mov dx, offset mes mov ah, 9 int 21h ; mov dx, offset buf mov ah, 07h int 21h mov viv, al mov dx, offset viv mov ah, 9 int 21h ret mes db "vvedite:$" buf db 9 viv db ? db "$" end sta просматривю его через debug всё равно догнать не могу.... почему резалт такой... Вроде всё логично сделал.... P.S.: Прочитал "для Дзенствующих" - думал что всё понял, но как выясняется - нихрена....
Вот как оказывается: Код (Text): .model tiny .code org 100h sta: mov dx, offset mes mov ah, 9 int 21h mov ah, 07h int 21h mov viv, al mov dx, offset cr mov ah, 9 int 21h mov dx, offset viv mov ah, 9 int 21h ret print: mes db "vvedite:$" buf db 9 viv db ? cr db 0Dh, 0Ah, "$" end sta В первом случае дамп показывал состояние следующее: vvedite:$..... Т.е. я могу предположить что при выводе, выводилась как сказал morkster вся память, или частично вся В этом же случае дамп показывает: vvedite:$.....$ Что так скажем ограничивает вывод 0Dh - 0Ah байтами... А теперь скажите, я в чём-нибудь прав? И ещё есть такая функция 0Ah - считать строку символов Про неё говорят вход: AH = 0Ah DSX - адрес буфера выход: буфер содрежит введённую строку т.е. это получается что при Код (Text): mov dx, offset buf mov ah, 0Ah int 21h ; при buf db 9 по адресу DX хранится введдённая строка? и мы можем спокойно значение DX присвоить какойнибудь перменной той же viv (у меня в коде) чтобы потом можно сторку вывести след образом: Код (Text): mov dx, viv mov ah, 9 int 21h Разъясните! ПЛИЗ!!!!
тааак... функция 09h просит $ terminated string, то-есть если у тебя после viv не будет значка $ то DOS будет выводить содержимое памяти пока его не найдёт или а) конца сегмента б) не знаю, но не проще ли поставить $ тут просьба, если дамп то приводи hex коды тоже. я конечно могу догадаться что ..... скорее всего означает 09 хх 0D 0A где хх ASCII код считанной клавиши, но пятая точка меня немного конфузит... как я уже сказал наверху, вывод ограничивается значком $, если ты это имел ввиду Вроде-бы оба кода в последних постах должны работать(тасма под рукой нету, не смог проверить). Первый должен вывести(при условии что нажали X): Код (Text): vvedite:X а второй: Код (Text): vvedite: X Просьба привести вывод программы, иначе не могу понять в чем проблема а насчёт 0Ah: Код (Text): mov dx, offset buf ;buf это не буффер, а структура типа http://www.ctyme.com/intr/rb-2563.htm#Table1344 mov ah, 0Ah int 21h xor bx,bx mov bl,byte ptr [buf+1] ;заносим число считанных байтов в BX(в это число не входит cr) mov byte ptr [offset buf+2 + BX],"$" ;добавляем $ в конец. cr aka carrige return обрезаются ... mov dx,offset buf+2 ;а вот тут начало введённых символов mov ah,9 int 21h ... buf db 9 db ? db 9 dup("") ;если компилятор такого dupа не понимает замени на db "123456789"
так и есть... вот относительно рабочий код, резульатат след: Код (Text): vvedite:good ; к примеру goodgood ; после ввода и нажатия Enter Вот сам код по ходу возникло ещё неск вопросов: Код (Text): .model tiny .code org 100h sta: mov dx, offset mes mov ah, 9 int 21h mov dx, offset buf mov ah, 0Ah int 21h xor bx, bx mov bl,byte ptr [buf] ; ptr - переопределние типа ; что написано понимаю, ;но вот необходимость с трудом ; нельзя ли просто <asm> mov bl,byte ptr [buf] </asm> и почему? mov byte ptr [offset buf+2 + BX],"$" ; buf+2 - это у нас начало введённых символов, по записи видно ; что offset buf+2+BX конец текущей строки, если это так то получается что строка всего занимает BX ??? ; по-моему я немного запутался.... mov dx, offset cr ; в Зубкове написато что это что-то вроде перехода на новую строку mov ah, 9 ; но по результату это не видно int 21h mov dx,offset buf+2 mov ah, 9 int 21h ret print: mes db "vvedite:$" buf db 9 db ? ; здесь нет никакой метки ну к примеру <asm> table db ? </asm> т.е. мы неизвестно ;что определяем как байт, неинициализируя db 9 dup("") ; и вот это можно немного подробнее пояснить cr db 0Dh, 0Ah, "$" end sta
во первых в моем коде было "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" видимо с английским не все дружат Код (Text): my_buffer: сколько_значков_пользователь_может_ввести_MAXimum db 9 сколько_значков_пользователь_ввел db ? ;это заполнит DOS во время перерывания буффер_длинною_(сколько_значков_пользователь_может_ввести_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. орфография не проверена
Кое в чём всё-таки разобрался... По-крайней мере я догнал свою ошибку с буффером... вот код: Код (Text): .model tiny .code org 100h sta: mov dx, offset mes mov ah, 9 int 21h mov dx, offset npar mov ah, 0Ah int 21h xor bx, bx mov [offset nam+bx+3],"$" mov dx, offset cr mov ah, 9 int 21h add viv, nam ; !!!вот!!! mov dx,offset viv mov ah, 9 int 21h ret print: mes db "vvedite:$" viv db 5 NPAR LABEL BYTE ;Список параметров: MAX DB 9 ; Максимальная длина ACT DB ? ; Реальная длина NAM DB 9 DUP (' ') cr db 0Dh, 0Ah, "$" end sta Вывддит только трёхзначные и меньше цифры, но в принципе я знаю как и это исправить... Вопрос другой: если я ввожу число и хочу выполнить с ним какую-н арифметику.... как бы исбежать Illegal memory reference ???
ну раз в принципе знаешь, то тебе и флаг в руки кстати, правильно выводит он только трёхзначные числа. можешь проверить заменив пробел в dup(' ') на любой 'видимый' значок, например dup('9') во первых, проц не понимает комбинаций типа 'команда память,память'(конечно может быть я неправ, компилятора под рукой нету а google лень), поэтому сначала надо завести один/оба из параметров в регистр для того чтобы это сделать, надо сначала переделать строку которую ввёл пользователь в 'номер' пример, если ACT=3: Код (Text): xor bx,bx; bx=0 mov bl,[NAM] sub bl,'0' mov ax,bx mov dx,10 mul dx mov bl,[NAM+1] sub bl,'0' add ax,bx mov dx,10 mul dx mov bl,[NAM+2] sub bl,'0' add ax,bx делать это надо конечно по-другому(в цикле), но идея вроде понятна авось опечаток небыло P.S. пояснение: от пользователя ты получаеш ASCII коды, а не номер. ASCII код нуля 30h, девятки 39h. Вывод, чтобы получить из 'знака числа' число, надо: sub znak,30h или sub znak,'0'