请教众位高手!(SOS)
下面这段发声程序为什麽一RUN就死机?
DATA SEGMENT PARA 'DATA'
MUS_FREQ DW 330,392,330,294,330,392,330,294,330
DW 330,392,330,294,262,294,330,392,294
DW 262,262,220,196,196,220,262,294,330,262
DW -1
MUS_TIME DW 3 DUP(50),25,25,50,25,25,100
DW 2 DUP(50,50,25,25),100
DW 3 DUP(50,25,25),100
DATA ENDS
STK SEGMENT PARA STACK 'STACK'
DB 100 DUP(?)
TOS LABEL WORD
STK ENDS
CODE SEGMENT PARA 'CODE'
ASSUME CS:CODE,SS:STK,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AX,STK
MOV SS,AX
MOV SP, OFFSET TOS
MUSIC PROC FAR
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
LEA SI,DS:MUS_FREQ
LEA BP,DS:MUS_TIME
FREQ:
MOV DI,[SI]
CMP DI,-1
JE END_MUS
MOV BX,DS:[BP]
CALL GENSOUND
ADD SI,2
ADD BP,2
JMP FREQ
END_MUS:
RET
MUSIC ENDP
GENSOUND PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DI
MOV AL,0B6H
mov dx,43h
OUT dx,AL
;MOV DX,12H ;原书用这段代码,但明显AX overflow,故我将其改为下面一段代码.
;MOV AX,533H*896
;DIV DI
;OUT 42H,Al
;MOV al,ah
;OUT 42H,al
mov dx,12h
mov ax,533h
mov cx,896
mul cx
mov cx,di
div cx
out 42h,al
mov al,dl
out 42h,al
IN AL,61H ;save the mode and turn on the speaker.
MOV AH,AL
OR AL,3
OUT 61H,AL
WAIT1:MOV CX,2801
DELAY:LOOP DELAY
DEC BX
JNZ WAIT1
MOV AL,AH
OUT 61H,AL
POP DI
POP DX
POP CX
POP BX
POP AX
RET
GENSOUND ENDP
CODE ENDS
END START