求救:下面程序为何进不了Ring中断子程序

发布于 2022-09-18 10:48:42 字数 8174 浏览 9 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

我还不会笑 2022-09-25 10:48:42

建议LZ先把环境描述清楚. 在什么CPU? X86? 什么OS? LINUX? 如果是LINUX X86-32. 那么你的程序应该要在内核态才可以用INT 21 之类的指令.

追我者格杀勿论 2022-09-25 10:48:42

另外,还有一点,贴代码的时候请用

  1. ....代码

复制代码
把代码包起来
或者用所见即所得模式
所见即所得模式好象我也没用过

[ 本帖最后由 cjaizss 于 2009-12-18 09:24 编辑 ]

昨迟人 2022-09-25 10:48:42

X86 的汇编语言“标准”程序,正常在WINDOWS 或 DOS 或 LINUX下需可调试。
我是用WINDOWS 或 DOS 下用masm用LINK后使用 DEBUG工具进行调试的。
DEBUG工具应该为汇编语言自带的调试工具。

独孤求败 2022-09-25 10:48:42

不要使用 debug,debug 状态下不会产生 时钟中断的。

编译成 exe 或 com 文件执行。

度的依靠╰つ 2022-09-25 10:48:42

我用是先用Link 生成EXE或COM文件之后(如Ring.exe). 在DOS 下用 Debug Ring.exe 在们-下 用T跟踪至 INT 21H,正确进入中断RING程序继续使用 T,但无法进入Ring中断程序,而是产生NOP的指令。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文