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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.02.2009, 11:55   #1
Jonikru
 
Аватар для Jonikru
 
Регистрация: 25.02.2009
Сообщений: 5
По умолчанию Вывод сообщение на заданную клавишу

Задание: Написать программу, которая при нажатии "стрелка вправо" выводит вашу фамилию, имя, отчество, по нажатии буквы "М" выходит из программы. На остальные клавиши не реагирует.

Проблема: По заданию у нас получается так, что мы можем для "стрелка вправо" использовать только ASCII код. Большая буква М у меня работает, а стрелка нет. Не могу понять в чём дело...

Код:
;Вывод сообщения по нажатию клавиши.
.model small              ;орпеделить модель вычислений
.stack 100h               ;определяем сегмент стека и задаём его, задаём размер
.data                     ;определяем сегмент данных
                                     
message1 db 'Jonikru Jonikru Jonikru', 0dh, 0ah, '$'  ;сообщение
 
.code                     ;определяем сегмент кода
      mov ax,@data        ;инициализируем сегмент данных
      mov ds,ax           ;в DS заносим адрес начала сегмента данных
if_char:                  ;закр. метка
      mov ah,0h           ;вызов обработки клавиши
      int 16h             ;вызываем 16 прерывание функции 0h
      cmp al,0h

      cmp ah,1ah          ;код клавиши 'right'
jne strv                  ;метка: если нет то переходим по метке
      mov dx,offset message1  ;первая строка
      mov ah,9h               ;вывод строки на экран
      int 21h                 ;вызываем 21 прерывание
jmp if_char               ;метка: возврат

strv:                     ;закр. метка
      cmp al,4dh          ;код клавиши M
jne if_char               ;метка: если нет то переходим по метке
      mov ah,4ch          ;выход из программы
      int 21h             ;вызываем 21 прерывание
end                       ;конец
Jonikru вне форума Ответить с цитированием
Старый 25.02.2009, 12:36   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

cmp ah, 77 ; а не 1а
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 25.02.2009, 12:43   #3
Jonikru
 
Аватар для Jonikru
 
Регистрация: 25.02.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
cmp ah, 77 ; а не 1а
Это понятно А если в 16 с\с?
Jonikru вне форума Ответить с цитированием
Старый 25.02.2009, 13:38   #4
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

4Dh это будет. Переводить можно очень быстро с помощью дефолтового калькулятор или лучше конечно в уме. Отнимаете ближайшее число-степень двойки(в данном случае это 64) и дальше уже считаете как одно разрядное число -
77-64 = 13 = D
64= 40h
40+D= 4Dh
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Старый 25.02.2009, 13:57   #5
Jonikru
 
Аватар для Jonikru
 
Регистрация: 25.02.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Ivan_32 Посмотреть сообщение
4Dh это будет. Переводить можно очень быстро с помощью дефолтового калькулятор или лучше конечно в уме. Отнимаете ближайшее число-степень двойки(в данном случае это 64) и дальше уже считаете как одно разрядное число -
77-64 = 13 = D
64= 40h
40+D= 4Dh
Но и это не поможет Код правильный! Почему-то нет отображение, хотя если ставить вместо стрелки буквы - будет отображение!
Для наглядности напишу вам табличку в 16 с\с:

Код:
Символ                       |  ASCII| SCAN
"Стрелка вправо"      |    1a  |  4d
"Заглавная буква М"  |    4d  |  нет
То бишь, ситуация такая, нам надо использовать только ASCII коды! Плюс только 16 с\с.

Последний раз редактировалось rpy3uH; 25.02.2009 в 20:11.
Jonikru вне форума Ответить с цитированием
Старый 25.02.2009, 20:43   #6
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

16-ое прерывание по стрелке вправо возвращает ax = 4D00h
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 04.03.2009, 07:45   #7
kirillmm
Новичок
Джуниор
 
Регистрация: 04.03.2009
Сообщений: 1
По умолчанию

Прикольно, спасибо за советик.
kirillmm вне форума Ответить с цитированием
Старый 12.03.2009, 18:45   #8
Jonikru
 
Аватар для Jonikru
 
Регистрация: 25.02.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Ulex Посмотреть сообщение
16-ое прерывание по стрелке вправо возвращает ax = 4D00h
Спасибо! А как вы это определили? Просто вдруг другие похожие ситуации будут, а что с ними делать не знаю...
Jonikru вне форума Ответить с цитированием
Старый 12.03.2009, 22:07   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Jonikru Посмотреть сообщение
Спасибо! А как вы это определили? Просто вдруг другие похожие ситуации будут, а что с ними делать не знаю...
1) есть таблицы с кодами.
2) ну Вы программист или где?!

вот (для простоты на TurboPascal) программка показывающая коды нажатых клавиш!

исходный текст
Код:
var Cod : word;

function ReadKeyWord : word; assembler;
asm
      mov ah,0h
      int 16h
      ret
end;

const
  Digits : array[0..$F] of Char = '0123456789ABCDEF';

function HexW(W : Word) : string;
    {-Return hex string for word}
  begin
    HexW[0] := #4;
    HexW[1] := Digits[hi(W) shr 4];
    HexW[2] := Digits[hi(W) and $F];
    HexW[3] := Digits[lo(W) shr 4];
    HexW[4] := Digits[lo(W) and $F];
  end;
  
begin
   repeat
     Cod := ReadKeyWord;
     WriteLn(HexW(Cod));
   until (Cod=$1C0D) or (Cod=$011B);
end.
Вложения
Тип файла: rar KeyCode.rar (2.2 Кб, 10 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.03.2009, 10:37   #10
Jonikru
 
Аватар для Jonikru
 
Регистрация: 25.02.2009
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
1) есть таблицы с кодами.
2) ну Вы программист или где?!

вот (для простоты на TurboPascal) программка показывающая коды нажатых клавиш!

исходный текст
Вы конечно молодец...
1. Толи вы до сих пор сути проблемы не поняли, я уже не знаю как объяснять.
2. Нет не являюсь, просто изучаю(сарказм здесь не уместен).

Получается вы предлагаете чтобы написать одну программу, надо параллельно написать ещё одну. Этот способ я пробовал, мне интересно есть ли более простое решение.
Jonikru вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Содержит ли текст заданную отдельную строку длинной не более 255 из символов 0 и 1 Curtis Помощь студентам 1 15.02.2009 20:08
Pascal - возведение 2 в заданную с клавиатуры степень katletta Помощь студентам 3 25.10.2008 12:24
Нажатие на клавишу 3.14oner Паскаль, Turbo Pascal, PascalABC.NET 1 14.07.2008 17:14
связать клавишу с кнопочкой Voucik Общие вопросы .NET 1 01.03.2008 19:30
У знаём нажатую клавишу... Altera Общие вопросы Delphi 2 10.02.2008 11:30