求救:下面程序为何进不了Ring中断子程序
DATA SEGMENT
COUNT DW 1
MSG DB 'The bell is ring!',0DH,0AH, '$'
BEEP DB 07H,'$'
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DSATA,ESATA
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AL,1CH
MOV AH,35H
INT 21H
PUSH ES
PUSH BX
PUSH DS
MOV DX,OFFSET RING ;取中断向量
MOV AX,SEG RING
MOV DS, AX
MOV AL,1CH
MOV AH,25H
INT 21H
POP DS
IN AL,21H
AND AL,11111110B
OUT 21H,AL
STI
MOV DI,2
DELAY: MOV SI,3
DELAY1: DEC DI ;产生中断位置
JNZ DELAY1
DEC DI
JNZ DELAY1
POP DX
POP DS
MOV AL,1CH
MOV AH,25H
INT 21H
;DEBUG T时无法进入RING中断子程序,下一条为NOP
RET
MAIN ENDP
RING PROC NEAR
PUSH DS
PUSH AX
PUSH CX
PUSH DX
MOV AX,@DATA
MOV DS,AX
STI
DEC COUNT
JNZ EXIT
MOV DX ,OFFSET MSG ;显示
MOV AH,09H
INT 21H
MOV DX,10
IN AL,61H
AND AL,0FCH
SOUND:
XOR AL,02
OUT 61H,AL
MOV CX,1400H
WAIT1:
LOOP WAIT1
DEC DX
JNE SOUND
MOV COUNT ,182 ; 18.2 1秒
EXIT: ;断续执行中断
CLI
POP DX
POP CX
POP AX
POP DS
IRET
RING ENDP
END START
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
建议LZ先把环境描述清楚. 在什么CPU? X86? 什么OS? LINUX? 如果是LINUX X86-32. 那么你的程序应该要在内核态才可以用INT 21 之类的指令.
另外,还有一点,贴代码的时候请用
复制代码
把代码包起来
或者用所见即所得模式
所见即所得模式好象我也没用过
[ 本帖最后由 cjaizss 于 2009-12-18 09:24 编辑 ]
X86 的汇编语言“标准”程序,正常在WINDOWS 或 DOS 或 LINUX下需可调试。
我是用WINDOWS 或 DOS 下用masm用LINK后使用 DEBUG工具进行调试的。
DEBUG工具应该为汇编语言自带的调试工具。
不要使用 debug,debug 状态下不会产生 时钟中断的。
编译成 exe 或 com 文件执行。
我用是先用Link 生成EXE或COM文件之后(如Ring.exe). 在DOS 下用 Debug Ring.exe 在们-下 用T跟踪至 INT 21H,正确进入中断RING程序继续使用 T,但无法进入Ring中断程序,而是产生NOP的指令。