2015-06-14 2 views
-2

По какой-то причине, когда я переключаюсь на переключатель ввода мыши обратно на ввод клавиатуры для своей программы, увеличение и уменьшение счетчика не влияет. Он отлично работает в первом цикле, где мы вводим символы. Вот программа, любой совет? Посмотрите на какой прыжок прыжка для справки после прыжка в муузе. Счетчик CX не обновляется или что-то в этом роде. (Я не знаю, если счетчик не обновляется или погода существует проблема встречающейся в сравнении CX после того, как перейти от mousetime к KeyTime.)Счетчик не работает после прыжков - язык ассемблера

CLEAR MACRO 
    MOV AX,0600H 
    MOV BH,07 
    MOV CX,0000 
    MOV DX,184FH 
    INT 10H 
    ENDM 

CURSOR MACRO Col, Row 
    MOV AH,02 
    MOV BH,00 
    MOV DL,Col 
    MOV DH,Row 
    INT 10H 
    ENDM 

DISP MACRO MES 
    MOV AH,09 
    MOV DX,OFFSET MES 
    INT 21H 
ENDM 

CLEARLINE MACRO ROW 
    CURSOR 00,ROW 
    DISP SPACES 
    ENDM 

ALWAYSONSCREENINFO MACRO 
     CURSOR 16,00 
     DISP TITLE1 
     CURSOR 50,00 
     DISP NAMES1 
     CURSOR 54,01 
     DISP NAMES2 
     CURSOR 33,7 
     DISP MENU 
     CURSOR 24,9 
     DISP OPTION1 
     CURSOR 24,10 
     DISP OPTION2 
     CURSOR 22,11 
     DISP DASHES 
     CURSOR 18,12 
     DISP MOUSEMENU 
     CURSOR 14,13 
     DISP OPTION3 
     CURSOR 8,14 
     DISP OPTION4 
     CURSOR 13,15 
     DISP CHARMENU 
     CURSOR 21,16 
     DISP KILL 
ENDM 

.MODEL SMALL ; RUN THE PROGRAM IN DIMENSIONS 79x24 
.STACK 64H 
.DATA 

TITLE1   DB  'MICROPROCESSOR - EENG410','$' 
NAMES1   DB  'name1 & name2','$' 
NAMES2   DB  'std1   std2','$' 
MENU   DB  'MENU','$' 
OPTION1   DB  '1. Press "U" to Speed up the motor','$' 
OPTION2   DB  '2. Press "D" to Slow Down the motor','$' 
OPTION3   DB  '1. Right click the mouse to turn motor direction to clockwise','$' 
OPTION4   DB  '2. Left click the mouse to turn the motor direction to anti-clockwise','$' 
DASHES   DB  '----------------------------------------','$' 
MOUSEMENU  DB  '(Press M to switch to the mouse options)','$' 
CHARMENU  DB  '(Press the scroll button to switch back to fist 2 options)','$' 
SPEEDUP   DB  'DC motor is speeding up ','$' 
SLOWDOWN  DB  'DC motor is slowing down','$' 
RIGHT   DB  'DC motor will now rotate clockwise','$' 
LEFT   DB  'DC motor will now rotate anti-clockwise','$' 
KILL   DB  '-----To exit the program, press "E"-----','$' 
PROGRAMEND1  DB  'Thank you for using our program','$' 
PROGRAMEND2  DB  'The program has been terminated','$' 
SPACES   DB  '                     ','$' 
TRY    DB  'Please try again','$' 
SPEEDNOW  DB  'Speed:','$' 
DIRECTION  DB  'Motor Direction:','$' 
CLOCK   DB  'Right','$' 
COUNTER   DB  'Left ','$' 
N1    DB  '1','$' 
N2    DB  '2','$' 
N3    DB  '3','$' 
N4    DB  '4','$' 
N5    DB  '5','$' 
N6    DB  '6','$' 
N7    DB  '7','$' 
MAXSPEED  DB  'Max speed is 7','$' 
MINSPEED  DB  'Min speed is 1','$' 

.CODE 
MAIN: MOV AX,@DATA 
     MOV DS, AX 
     CLEAR 
     ALWAYSONSCREENINFO 

     MOV CX,1 
     CURSOR 28,21 
     DISP SPEEDNOW 
     CURSOR 35,21 
     DISP N1 
     CURSOR 22,22 
     DISP DIRECTION 
     CURSOR 39,22 
     DISP CLOCK 
     MOV CX,1 
L0:  MOV AH,00 ;LOOP START 
     INT 16H 
     CMP AL,' ' 
     JE SPACED 
     CMP AL,'U' 
     JE FASTER 
     CMP AL,'u' 
     JE FASTER 
     CMP AL,'D' 
     JE SLOWER 
     CMP AL,'d' 
     JE SLOWER 
     CMP AL,'M' 
     JE MOUSETIME 
     CMP AL,'m' 
     JE MOUSETIME 
     CMP AL,'E' 
     JE EXIT 
     CMP AL,'e' 
     JE EXIT 
     JNE TRYAGAINKEY 

A1:  MOV AX,03 
     INT 33H 
     CMP BX,0 
     JE A1 
     CMP BX,1 ;MOUSE LEFT 
     JE MRIGHT 
     CMP BX,2 ;MOUSE RIGHT 
     JE MLEFT 
     CMP BX,3 
     JE KEYTIME 

SPACED: CLEARLINE 19 
     JMP L0 

FASTER: CLEARLINE 19 
     CURSOR 27,19 
     DISP SPEEDUP 
     JMP INCREASE 

SLOWER: CLEARLINE 19 
     CURSOR 27,19 
     DISP SLOWDOWN 
     JMP DECREASE 

MOUSETIME: JMP A1 
KEYTIME: JMP L0 

MRIGHT: CLEARLINE 19 
     CURSOR 18,19 
     DISP RIGHT 
     JMP TRIGHT 

MLEFT: CLEARLINE 19 
     CURSOR 18,19 
     DISP LEFT 
     JMP TLEFT 

TRYAGAINKEY: CLEARLINE 19 
       CURSOR 28,19 
       DISP TRY 
       JMP L0 

INCREASE: CMP CX,7 
      JE CANNOTINCREASESPEED 
      INC CX 
      JMP WHATSPEED 

DECREASE: CMP CX,1 
      JE CANNOTDECREASESPEED 
      DEC CX 
      JMP WHATSPEED 

TRIGHT: CURSOR 39,22 
     DISP CLOCK 
     JMP A1 

TLEFT: CURSOR 39,22 
     DISP COUNTER 
     JMP A1 

CANNOTINCREASESPEED: CLEARLINE 19 
         CURSOR 27,19 
         DISP MAXSPEED 
         JMP L0 

CANNOTDECREASESPEED: CLEARLINE 19 
         CURSOR 27,19 
         DISP MINSPEED 
         JMP L0 

WHATSPEED: CMP CX,1 
      JE N11 
      CMP CX,2 
      JE N22 
      CMP CX,3 
      JE N33 
      CMP CX,4 
      JE N44 
      CMP CX,5 
      JE N55 
      CMP CX,6 
      JE N66 
      CMP CX,7 
      JE N77 

N11: CURSOR 35,21 
     DISP N1 
     JMP L0 
N22: CURSOR 35,21 
     DISP N2 
     JMP L0 
N33: CURSOR 35,21 
     DISP N3 
     JMP L0 
N44: CURSOR 35,21 
     DISP N4 
     JMP L0 
N55: CURSOR 35,21 
     DISP N5 
     JMP L0 
N66: CURSOR 35,21 
     DISP N6 
     JMP L0 
N77: CURSOR 35,21 
     DISP N7 
     JMP L0 
EXIT: CLEAR 
     CURSOR 21,12 
     DISP PROGRAMEND1 
     CURSOR 21,13 
     DISP PROGRAMEND2 
     MOV AH, 4CH 
     INT 21H 
    END MAIN 
+0

Счетчик? Пожалуйста, будьте конкретны, * что * счетчик? –

+0

жаль, что счетчик CX не обновляется и отображается соответствующим образом (сравнивается cx, а затем отображается n0 - n7) – corruptdna

+0

Это слишком много кода в одном месте. Вы когда-нибудь слышали об отладке? – user35443

ответ

0

Неисправность вызвана тем, что мышь прерывает 33h функцию AX=0003h возвращающих положение мыши в CX и DX.

Это перезаписывает ваш «счетчик» в регистре CX.

Это всегда опасная игра, которая хранит значения в регистрах во всей программе. Лучше иметь местоположение переменной памяти.

Вы также можете попробовать PUSH CX перед выполнением функций мыши и POP CX после, но ваша структура и поток вашей программы могут не способствовать этому (я не выполнил его полностью).

Кроме того, причина, по которой ваша программа не восстанавливается (в вашем контексте), абсурдное значение CX связано с используемой вами тестовой инструкцией. Для примера здесь

INCREASE: CMP CX,7 
      JE CANNOTINCREASESPEED 

вы всегда должны быть осторожными и ловушки любое значение, что находится вне диапазона (даже если вы думаете, что не будет)

  JGE CANNOTINCREASESPEED 

Также с

CANNOTINCREASESPEED: MOV CX,7 ;clamp the value 
... 
+0

спасибо большое, ваше предложение очень помогло. Чтобы решить мою дилемму, я выполнил ваши инструкции и заменил CX на count. (COUNT DB '0', '$'), и это решило все мои проблемы. – corruptdna

Смежные вопросы