Судя по всему у меня где-то в самых базовых знаниях пробел (честно искал, но не смог прояснить вопрос). Вот простой backspace для PM (находится в обработчике int'ов от клавы): Код (Text): .backsp: xor eax,eax dec [cur] ;по значению cur выводятся символы - в (0B800h+cursor*2) movzx edi,[cur] mov al,' ' mov word [es:edi*2],ax;выводим в видеосегмент jmp .end ;там pop'аем всё и выходим благополучно из прерывания ... cur dw 10 Так судя по всему cur увеличивается. В чём моя ошибка?
я думаю что значение cur всетаки уменьшается с каждым нажатием backspace, но контроля границ нету и за 0 будет ff или ffff (размера cur вы не указали) который расшириться нулями - эффект прыжка вперед
Контроль границ я не делал. Сейчас дело не в том. Просто этот обработчик затирает символы, идущие впереди (вот почему я и решил, что значение не уменьшается). Я предусмотрительно писал в cur большее число. Дело в чём-то другом (и как мне кажется дело в какой-нибудь опечатке... как у меня и бывает по ночам).
Вот, в принципе, весь код клавиатурного обработчика: Код (Text): keyboard: pushad push es push ds xor eax,eax xor edi,edi xor ebx,ebx in al,60h ;is key pushed? mov ah,al and ah,80h jnz .end and al,7Fh cmp al,8h je .backsp jne .just_key .backsp: xor eax,eax movzx edi,[cursor] sub edi,2 mov al,' ' mov word [es:edi*2],ax mov dword [cursor],edi jmp .end .just_key: mov ebx,ascii add ebx,eax mov edi,ebx mov al,byte [edi] mov ah,07h movzx edi,[cursor] mov word [es:edi*2],ax inc [cursor] .end: pop ds pop es popad jmp int_EOI
Igor1024 Из первого поста ничего не понятно. Могу посоветовать только загрузить в OllyDbg и поставить точку останова на 3-й строке. Но в этом мало смысла - вряд ли у тебя процессор глючит.
Я думаю у тс такой возможности нет. Судя по чему? Каретка сдвигается вперед? Символ не затирается? Вы вообще уверены что проц попадает на ветку .backsp? Код (Text): cmp al,8h je .backsp Насколько я помню 08h это ASCII код backspace, но не сканкод её. 0Eh вроде бы оно. Кстати, зачем сбрасывать бит, которого нет? Код (Text): and ah,80h jnz .end and al,7Fh
Как-будто в коде других недочётов мало. А два прыжка зачем? На случай, если один не сработает? Где-то я уже что-то подобное слышал.
Sunzer Возможно. Неграмотно поставленный вопрос в совокупности с этим protected mode (понятие не для новичков, согласитесь) ввёл меня в ступор.
Sasha7b9, Sunzer а почему не Post meridiem или Particulate matter? Google на сокращение PM вон сколько накидал: Мало ли что находится у Igor1024 в "обработчике int'ов от клавы", да и подразумевался скорее Real Mode, а не Protected
Mikl___ Возможно. Потому и спросил: у топикстартера. Вопрос поверг меня в смятение. Но, похоже, Игорь не тратит время на форумы. Делает дело.
Сказал А: Код (Text): push es push ds Говори и Б: Код (Text): push VIDEOBUFFER_SEL pop es push ss pop ds Но самое главное, что работа с аппаратурой в принципе организована не правильно. Не нужно намертво вшивать код вывода на экран в клавиатурный обработчик, потому что в окончательном варианте его там быть не должно. Ты сделал мизер из того, что должно присутствовать в полноценном обработчике, а код уже смотрится коряво. Я тебе посоветовал нормально реализовать putstr (для продвижения по экрану вперед), который можно было временно использовать в обработчике. Но раз речь пошла уже и о BS, то становится понятно, что ты пытаешься сделать. По-хорошему это реализуется через событийный механизм (обработчики шлют сообщения о наступивших событиях - "основная программа" их получает и обрабатывает). Если это в данный момент реализовать не можешь, тогда хотя бы полноценный putchar с обработкой в том числе и BS (в виде управляющего кода) реализуй отдельно, а также что-то типа translate, если "выходные" коды обработчика будут отличаться от управляющих и символьных кодов ASCII. В таком виде это потом будет легко вынести из обработчика.
Phantom_84, теперь вот думаю, что нужно разбираться с TSS, чтобы по-красивому всё это организовать. (Служба обработчик команд, диспетчер задач...) Становится всё интересней и интересней!
Пока ты в нулевом кольце, то это не критично. Хотя, исходя из того же принципа делать несложные вещи сразу (я про TSS), это было бы полезно. Код (Text): xor eax,eax lldt ax mov eax,TSS_SEL ltr ax