Loops 跳转后计数器不工作-汇编语言
由于某些原因,当我切换到鼠标输入时,切换回程序的键盘输入,增加或减少计数器都没有效果。它在我们输入字符的第一个循环中非常有效。 这是程序,有什么建议吗? 查看whatspeed jump,以便在鼠标跳转后参考。 CX计数器没有更新,或者类似于这些内容。我不知道计数器是否没有更新,或者在我从mousetime切换到keytime后比较CX时是否出现问题Loops 跳转后计数器不工作-汇编语言,loops,assembly,counter,increment,Loops,Assembly,Counter,Increment,由于某些原因,当我切换到鼠标输入时,切换回程序的键盘输入,增加或减少计数器都没有效果。它在我们输入字符的第一个循环中非常有效。 这是程序,有什么建议吗? 查看whatspeed jump,以便在鼠标跳转后参考。 CX计数器没有更新,或者类似于这些内容。我不知道计数器是否没有更新,或者在我从mousetime切换到keytime后比较CX时是否出现问题 CLEAR MACRO MOV AX,0600H MOV BH,07 MOV CX,0000 MOV
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
导致该故障的原因是鼠标中断33h函数AX=0003h返回CX和DX中的鼠标位置 这将覆盖寄存器CX中的计数器 在整个程序中,将值保存在寄存器中始终是一个危险的游戏。最好有一个内存变量位置 您也可以尝试在执行鼠标功能之前推送CX,然后再弹出CX,但您的程序结构和流程可能不利于我,因为我没有完全遵循它 此外,程序无法从上下文中恢复CX的荒谬值的原因是您使用的测试指令。举个例子
INCREASE: CMP CX,7
JE CANNOTINCREASESPEED
您必须始终保持谨慎,捕捉任何超出范围的值,即使您认为它不会超出范围
JGE CANNOTINCREASESPEED
也有
CANNOTINCREASESPEED: MOV CX,7 ;clamp the value
...
柜台请具体说明,是哪个计数器?很抱歉,计数器CX没有更新并相应地显示CX比较,然后显示n0-n7这在单个位置上的代码太多了。听说过调试吗?很抱歉,还是新的和正在学习的,我一定要了解更多关于调试的知识,并在未来的文章中做得更好。很多人,你的建议帮助很大。为了解决我的困境,我按照你的指示用count替换了CX。COUNT DB'0'、'$'解决了我所有的问题。