求比较简单的歌曲跳跃程序
求比较简单的歌曲的跳转程序假设已编制好5个歌曲程序,它们的段地址和偏移地址存放在数据段的跳跃表SINGLIST中。试编制一程序,根据从键盘输入的歌曲编号1~5,转去执行5个歌曲程序中的某一个。
写了一下,不对.输入5时候,就跳出来来了,而且还想输入别的数字可以提示.
data segment
singlist dw music1,music2,music3,music4,music5
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov ah,1
int 21h
sub al, '0 '
mov bx,0
mov bl,al
add bx,bx
jmp singlist[bx]
jmp exit
music1:mov dl, '1 '
mov ah,2
int 21h
jmp exit
music2:mov dl, '2 '
mov ah,2
int 21h
jmp exit
music3:mov dl, '3 '
mov ah,2
int 21h
jmp exit
music4:mov dl, '4 '
mov ah,2
int 21h
jmp exit
music5:mov dl, '5 '
mov ah,2
int 21h
jmp exit
exit: mov ax,4c00h
int 21h
code ends
end start
[解决办法]
这个还算比较简单吧. 稍对输入部分改进下就可以了:
....
start:
mov ax,data
mov ds,ax
l_keyin:
mov ah,1
int 21h
sub al, '0 '
cmp al, 0
je exit ; 输入 0 结束
cmp al, 5
ja l_keyin ; 输入大于 5 的话, 不理睬
dec al ; 输入 1-5 播放 music1-5, 但地址偏址是以 0 为基, 所以要减 1
mov bx,0
mov bl,al
add bx,bx
call singlist[bx] ; 以子程方式调用相应的播放 这就要求 music1 等须以 ret 返回
jmp l_keyin ; 继续等待按键
music1:mov dl, '1 '
mov ah,2
int 21h
ret ; jmp exit ;* ret 以返回到字符输入循环 以下同
....