| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1036 人关注过本帖
标题:为什么程序跳转后有条语句不执行?
取消只看楼主 加入收藏
paul_wing
Rank: 1
等 级:新手上路
帖 子:11
专家分:7
注 册:2012-4-6
结帖率:33.33%
收藏
已结贴  问题点数:10 回复次数:5 
为什么程序跳转后有条语句不执行?
程序代码:
DATA      SEGMENT 
INFO1     DB 0DH,0AH,'welcome to this programe!$' 
INFO2     DB 0DH,0AH,'please enjoy the music!$'  
INFO6     DB 0DH,0AH,'music was stopped!$'
MUSLIST   DB 0DH,0AH,'press any key to stop the music!' 
          db 0dh,0ah,'$' 
;******************************************音乐 两只老虎
MUS_FREG3 DW 262,294,330,262
          DW 262,294,330,262
          DW 330,349,392
          DW 330,349,392
          DW 392,440,392,349,330,262
          DW 392,440,392,349,330,262
          DW 294,196,262
          DW 294,196,262,-1         
MUS_TIME3 DW 50,50,50,50 
          DW 50,50,50,50
          DW 50,50,100
          DW 50,50,100
          DW 25,25,25,25,50,50 
          DW 25,25,25,25,50,50 
          DW 50,50,100 
          DW 50,50,100 
DATA      ENDS 
;***********************************************************
STACK     SEGMENT
          DB 200 DUP ('STACK')
STACK     ENDS
CODE      SEGMENT
          ASSUME DS:DATA,SS:STACK,CS:CODE 
START:    MOV AX,DATA
          MOV DS,AX
          MOV aH, 0 
          MOV AL,00 
          INT 10H           
;********** 定义一个宏显示
DISPLAY   MACRO b 
          LEA DX,b 
          MOV AH,9 
          INT 21H 
          ENDM 
;**********************音乐地址宏 
ADDRESS   MACRO A,B 
          LEA SI,A 
          LEA BP,DS:B 
          ENDM 
;*********************** 
          DISPLAY INFO1 
          DISPLAY INFO2 
          DISPLAY MUSLIST 
TIGER:    ADDRESS MUS_FREG3,MUS_TIME3 
          CALL MUSIC
          JMP TIGER 
;******************************************发声 
GENSOUND PROC NEAR 
          PUSH AX 
          PUSH BX 
          PUSH CX 
          PUSH DX 
          PUSH DI 
          MOV AL,0B6H 
          OUT 43H,AL 
          MOV DX,12H 
          MOV AX,3280H 
          DIV DI 
          OUT 42H,AL 
          MOV AL,AH 
          OUT 42H,AL 
          IN AL,61H 
          MOV AH,AL 
          OR AL,3 
          OUT 61H,AL 
WAIT1:    MOV CX,3314 
          call waitf 
DELAY1:   DEC BX 
          JNZ WAIT1 
          MOV AL,AH 
          OUT 61H,AL 
          POP DI 
          POP DX 
          POP CX 
          POP BX 
          POP AX 
          RET 
GENSOUND ENDP 
;******************************************** 
waitf proc near 
      push ax 
waitf1: 
      in al,61h 
      and al,10h 
      cmp al,ah 
      je waitf1 
      mov ah,al 
      loop waitf1 
      pop ax 
      ret 
waitf endp 
;********************************************* 音乐播放
MUSIC   PROC NEAR 
          PUSH DS 
          SUB AX,AX 
          PUSH AX                                  
FREG:     mov ah, 0bh                ;检测是否有任意键按下?
          int 21h
          cmp al,00
出现问题:JNE  RETU
          MOV DI,[SI] 
          CMP DI,-1 
          JE END_MUS 
          MOV BX,DS:[BP] 
          CALL GENSOUND 
          INC SI
          INC SI
          INC BP
          INC BP
          JMP FREG 
          JMP END_MUS
RETU:     DISPLAY INFO6
END_MUS: RET 
MUSIC    ENDP 
CODE      ENDS 
          END START



代码见上。这个程序是自动播放一段音乐,然后按任意键结束。正常执行的时候,按任意键结束后,应该显示一条信息“music was stopped!”,也就是我数据段中的变量 INFO6。但是按任意键结束播放,音乐停止后,却没有显示。这是怎么回事啊?我是在音乐播放的循环体中写了一句跳转语句(红色的那行代码),然后跳转执行“RETU:     DISPLAY INFO6”

[ 本帖最后由 paul_wing 于 2012-5-14 01:17 编辑 ]
2012-05-14 01:07
paul_wing
Rank: 1
等 级:新手上路
帖 子:11
专家分:7
注 册:2012-4-6
收藏
得分:0 
程序代码:
MUSIC   PROC NEAR 
          PUSH DS 
          SUB AX,AX 
          PUSH AX                                  
FREG:     mov ah, 0bh                ;检测是否有任意键按下?
          int 21h
          cmp al,00
JNE  RETU
          MOV DI,[SI] 
          CMP DI,-1 
          JE END_MUS 
          MOV BX,DS:[BP] 
          CALL GENSOUND 
          INC SI
          INC SI
          INC BP
          INC BP
          JMP FREG 
          JMP END_MUS
RETU:     DISPLAY INFO6
END_MUS: RET 
MUSIC    ENDP 


主要就是这段程序中,从“JNE RETU”这句跳转到“RETU: DISPLAY INFO6”有问题。。。

[ 本帖最后由 paul_wing 于 2012-5-14 01:16 编辑 ]
2012-05-14 01:14
paul_wing
Rank: 1
等 级:新手上路
帖 子:11
专家分:7
注 册:2012-4-6
收藏
得分:0 
以下是引用zklhp在2012-5-14 10:57:41的发言:

出现问题:JNE  RETU

RETU:     DISPLAY INFO6
END_MUS: RET

对啊 跳转了没跳回来啊

你以为ret能返回 但是ret只有在返回地址压人堆栈的时候才这样做 call自动做了返回地址压栈 而跳转指令不这样

所以 肯定不会返回。。


你的意思是,我的程序在有按键被按下后,没有返回主程序中,所以显示不了“INFO6”?我仅仅是跳转到一条显示信息的语句啊。MUSIC这个子程序中开始不是压栈了吗?
2012-05-14 11:14
paul_wing
Rank: 1
等 级:新手上路
帖 子:11
专家分:7
注 册:2012-4-6
收藏
得分:0 
哦。抱歉啊。
我先解释一下我的程序的运行目的吧。我的程序要的效果是:开始运行后,自动播放一段音乐(两只老虎),如果没有按键按下,则一直循环播放(主程序确实写了个死循环,目的就是这个)。如果有按键按下,则停止播放,并显示“MUSIC WAS STOPPED!”

大大根据我这个思路,看看程序为什么在按键按下后,虽然音乐结束了,却没有显示“MUSIC WAS STOPPED!”......


不管怎么说,感谢大大耐心跟进这个问题啊。。。

[ 本帖最后由 paul_wing 于 2012-5-15 00:47 编辑 ]
2012-05-15 00:45
paul_wing
Rank: 1
等 级:新手上路
帖 子:11
专家分:7
注 册:2012-4-6
收藏
得分:0 
那个死循环调用的music这个子程序。C语言里面有break这样的指令能够实现循环停止的功能(在循环体内部实现循环跳出)。我就想在程序中实现这么个功能。

不过按我上面写的程序,死循环虽然没有跳出来,但是按键按下之后,音乐确实停了。只不过没显示“music was stopped”啊(你可以把我的代码复制一下运行一下看看)。。。

如果在MUSIC子程序中写下面这一句:
mov ah, 4ch
int 21h
那么按键按下之后,就直接退出了,看不到显示的“music was stopped!”啊。我是想在按键按下之后,界面能够停留在“music was stopped!”的提示状态。不要一闪而过。。。

[ 本帖最后由 paul_wing 于 2012-5-15 12:43 编辑 ]
2012-05-15 12:23
paul_wing
Rank: 1
等 级:新手上路
帖 子:11
专家分:7
注 册:2012-4-6
收藏
得分:0 
mov ah,1
int 21h
这个对我的程序没用啊。。。。。

我只想在任意键按下之后,界面停留在“music was stopped!”提示状态不要动(C语言里貌似有这个指令:getche)。。。。

目前看来只有 mov ah,4cH 然后在命令窗口中执行了。。。。多谢帮忙。。
2012-05-15 18:22
快速回复:为什么程序跳转后有条语句不执行?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034343 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved