Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2009, 20:22   #1
olen`
Новичок
Джуниор
 
Регистрация: 03.06.2009
Сообщений: 4
Восклицание состояние регистров клавиатуры

уважаемые програмисты,кто может составить эту прогу,то буду безумно признателен!!!!!!!сам в этом деле ноль поэтому нуждаюсь в вас!!!!!спасибо кто отзовётся. программа которая устанавливает состояние регистров клавиатуры NUMLOCK, CAPSLOCK и SCROLLLOCK в состояние вкл..
olen` вне форума Ответить с цитированием
Старый 03.06.2009, 22:53   #2
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Наверно все-таки так
Код:
mov ds,40h
mov ax,1110000b
mov ds:[17h],ax
Цитата:
Два байта, расположенные в ячейках памяти 0040:0017 и
0040:0018 содержат биты, отражающие статус клавиши сдвига и дру-
гих клавиш-переключателей следующим образом:

Бит Клавиша Значение, когда бит = 1
0040:0017 7 Insert режим вставки включен
6 CapsLock режим CapsLock включен
5 NumLock режим NumLock включен
4 ScrollLock режим ScrollLock включен
3 Alt клавиша нажата
2 Ctrl клавиша нажата
1 левый Shift клавиша нажата
0 правый Shift клавиша нажата

0040:0018 7 Insert клавиша нажата
6 CapsLock клавиша нажата
5 NumLock клавиша нажата
4 ScrollLock клавиша нажата
3 Ctrl-NumLock режим Ctrl-NumLock включен
остальные биты не используются
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 03.06.2009 в 23:01.
Goodwin98 вне форума Ответить с цитированием
Старый 03.06.2009, 23:13   #3
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Так же можите почитать тут, здесь все подробненько расписано
Добавлю Гудвина:
Код:
   SUB  AX,AX                    ;устанавливаем добавочный сегмент на
   MOV  ES,AX                   ;начало памяти
   MOV  AL,10100000B     ;готовим бит 5 к установке
   OR   ES:[418H],AL         ;меняем байт статуса
xor eax, eax
xchg [eax], eax

Последний раз редактировалось MalCer; 03.06.2009 в 23:17.
MalCer вне форума Ответить с цитированием
Старый 03.06.2009, 23:28   #4
DEADHUNT
Пользователь
 
Регистрация: 23.10.2008
Сообщений: 48
По умолчанию

Код:
#define KBC_CNTRL 	0x60
#define KBC_CNTRL_LED	0xED	/* send LED bits (scroll lock - bit 0, num lock - bit 1,caps lock - bit 2, 1 - on, 0 - off) */
#define KBC_STATUS	0x64
...
void set_led()
{
	while (inp(KBC_STATUS) & KBC_STATUS_INPUT);
	outp(KBC_CNTRL,KBC_CNTRL_LED);
	while (inp(KBC_STATUS) & KBC_STATUS_INPUT);
	outp(KBC_CNTRL, kbd_led);
}
вообше-то правильно порты юзать.
DEADHUNT вне форума Ответить с цитированием
Старый 03.06.2009, 23:37   #5
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

DEADHUNT, а давай ещё и на delphi код напишем:
Код:
var
  key: TKeyBoardState;
begin
  GetKeyBoardState(key);
  if BOOL(key[VK_SCROLL]) then
  ShowMessage('SCROLL LOCK включен');
...
На Си одно, в ассемблере другое!!!
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 03.06.2009, 23:41   #6
DEADHUNT
Пользователь
 
Регистрация: 23.10.2008
Сообщений: 48
По умолчанию

а в чём проблема? главное суть, а язык не важен. C лучше асма просто для этого подходит(код переносимый становится, код взял из своей старой самодельной ОСи).
DEADHUNT вне форума Ответить с цитированием
Старый 04.06.2009, 15:01   #7
olen`
Новичок
Джуниор
 
Регистрация: 03.06.2009
Сообщений: 4
Хорошо всем кто помог

спасобо всем огроменное!!!!!!!ещё единственная просьба,напишите как будет выглядить эта программа целиком,чтобы запустив её все эти три клавиши NUM-,CAPS- и SCROLL LOCK стали во включёном состоянии и больше ни чего не надо,всё равно не поймуописание ещё пожалуйста.

Последний раз редактировалось olen`; 04.06.2009 в 15:05.
olen` вне форума Ответить с цитированием
Старый 04.06.2009, 15:29   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и больше ни чего не надо,всё равно не поймуописание ещё пожалуйста.
Ну и нахальство! сорри за оффтоп...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.06.2009, 16:47   #9
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

На С можно еще так
Код:
rg.h.ah = 2;
        int86(0x16, &rg, &rg);
        if((rg.h.al & 0x40) == 0)
        {
          // Клавиша <CapsLock> не нажата,
          // соответствующий светодиод не горит
          . . .
        }
        else
        {
          // Клавиша <CapsLock> нажата
          . . .
        }
xor eax, eax
xchg [eax], eax

Последний раз редактировалось MalCer; 04.06.2009 в 16:52.
MalCer вне форума Ответить с цитированием
Старый 05.06.2009, 19:51   #10
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Цитата:
напишите как будет выглядить эта программа целиком
Так точно, товарищь генерал! Щас сделаем

Вот где-0то нашел этот исходник:
Код:
.model  tiny
.code
org 100h            ; COM-программа

start   proc near
    mov ah,2        ; функция 02 прерывания 1Ah
    int 1Ah         ; получить текущее время
    mov ch,dh       ; сохранить текущую секунду в CH
    mov cl,0100b    ; CL = состояние светодиодов клавиатуры

main_loop:
    call    change_LEDs   ; установить светодиоды в соответствии с CL

    shl cl,1              ; следующий светодиод,
    test    cl,1000b      ; если единица вышла в бит 3,
    jz  continue
    mov cl,0001b          ; вернуть ее в бит 0,
continue:
    mov ah,1              ; проверить, не была ли нажата клавиша,
    int 16h
    jnz exit_loop         ; если да - выйти из программы
    push    cx
    mov ah,2              ; функция 02 прерывания 1Ah
    int 1Ah               ; получить текущее время
    pop cx
    cmp ch,dh             ; сравнить текущую секунду в DH с CH
    mov ch,dh             ; скопировать ее в любом случае,
    je  continue          ; если это была та же самая секунда - не 
; переключать светодиоды,
    jmp short main_loop   ; иначе - переключить светодиоды

exit_loop:
    mov ah,0              ; выход из цикла - была нажата клавиша
    int 16h                  ; считать ее
    ret                       ; и завершить программу
start   endp

; процедура change_LEDs
; устанавливает состояние светодиодов клавиатуры в соответствии с числом в CL
change_LEDs proc near
    call    wait_KBin         ; ожидание возможности посылки команды
    mov al,0EDh
    out 60h,al                  ; команда клавиатуры EDh
    call    wait_KBin          ; ожидание возможности посылки команды 
    mov al,cl
    out 60h,al                  ; новое состояние светодиодов
    ret
change_LEDs endp

; процедура wait_KBin
; ожидание возможности ввода команды для клавиатуры
wait_KBin   proc   near
    in  al,64h                   ; прочитать слово состояния
    test    al,0010b         ; бит 1 равен 1?
    jnz wait_KBin            ; если нет - ждать,
    ret   ; если да - выйти
wait_KBin   endp
    end start
xor eax, eax
xchg [eax], eax

Последний раз редактировалось MalCer; 05.06.2009 в 19:57.
MalCer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
принадлежит ли число, введённое с клавиатуры отрезку (а;в). Границы отрезка вводятся с клавиатуры Maria, Russia Помощь студентам 3 17.02.2009 22:01
Пары регистров в Delphi Jupiter Общие вопросы Delphi 4 13.08.2008 17:29
Узнать состояние подключения Hottabych Работа с сетью в Delphi 8 03.03.2008 18:10
состояние CDRom joker Win Api 12 27.01.2008 08:06
много регистров nntpaha Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 22.12.2007 19:01