| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1036 人关注过本帖
标题:为什么程序跳转后有条语句不执行?
只看楼主 加入收藏
paul_wing
Rank: 1
等 级:新手上路
帖 子:11
专家分:7
注 册:2012-4-6
结帖率:33.33%
收藏
已结贴  问题点数:10 回复次数:13 
为什么程序跳转后有条语句不执行?
程序代码:
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
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
出现问题:JNE  RETU

RETU:     DISPLAY INFO6
END_MUS: RET

对啊 跳转了没跳回来啊

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

所以 肯定不会返回。。
2012-05-14 10:57
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
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:10 
每次都是你们一说我才看明白 呵呵 一方面我看的不仔细 另一方面 你要是注释写的好我不懂都应该能看明白

MUSIC   PROC NEAR
          PUSH DS
          SUB AX,AX
          PUSH AX         

这里的函数 应该是个近跳转 而且因为是用的call music 所以不需要你压栈。。。 我上面没看明白以为你是没返回 后来发现不需要返回 那 这里的几条压栈没意义 反而覆盖了返回地址

TIGER:    ADDRESS MUS_FREG3,MUS_TIME3
          CALL MUSIC
          JMP TIGER

更大的问题是 这里应该是个死循环罢 总之 我还是没看懂。。
2012-05-14 11:50
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
还有就是这个程序貌似没有退出 按理应该是到music返回的时候程序就退出了 我理解的就是这样 不知道你的思路

你看 你的思路 我还要靠猜才能知道。。。 你觉得这样好么

再进一步

;********** 定义一个宏显示
DISPLAY   MACRO b
          LEA DX,b
          MOV AH,9
          INT 21H
          ENDM
;**********************音乐地址宏
ADDRESS   MACRO A,B
          LEA SI,A
          LEA BP,DS:B
          ENDM
;***********************

虽然宏可以这样写在代码里 但为啥不单独放在前面呢 搅合在一块 很乱啊 如果放在前面 你不用加分割线也很清晰

总之 清晰的思路是关键 如果你的思路清晰 应该能写出清晰的代码 或者 至少把你清晰的思路写在注释里

如果我又理解错了 欢迎再问 不过 建议你把你的思路写在代码的注释里 这样利人利己

如果觉得问题解决应该给分!!!最近都不给分很不好啊。。。
2012-05-14 11:57
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
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
主程序确实写了个死循环

如果有按键按下,则停止播放,并显示“MUSIC WAS STOPPED!”

设计思路就有矛盾 死循环没跳出怎么能停呢

END_MUS: RET

直接在这里写成

mov ah, 4ch
int 21h

让它退出就好了 反正也已经显示了提示信息了


[ 本帖最后由 zklhp 于 2012-5-15 10:48 编辑 ]
2012-05-15 10:43
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
更好的方法是 主程序里不要写死循环 加个对函数返回值的判断 用返回值来确定 我觉得这样比较好


[ 本帖最后由 zklhp 于 2012-5-15 10:47 编辑 ]
2012-05-15 10:44
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
快速回复:为什么程序跳转后有条语句不执行?
数据加载中...
 
   



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

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