khan99 发表于 2009-12-16 15:52

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

DATA SEGMENT
      COUNTDW      1
      MSGDB      'The bell is ring!',0DH,0AH, '$'
      BEEPDB      07H,'$'
    DATA ENDS
    CODE SEGMENT
      MAINPROC      FAR
      ASSUME CS:CODE,DS:DATA,ES:DATA
      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
      MAINENDP
      RINGPROC      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
      RINGENDP
            END      START

accessory 发表于 2009-12-18 02:07

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

cjaizss 发表于 2009-12-18 09:22

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

....代码

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

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

khan99 发表于 2009-12-19 20:52

X86

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

mik 发表于 2009-12-20 00:59

回复 #4 khan99 的帖子

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

编译成 exe 或 com 文件执行。

khan99 发表于 2009-12-20 15:50

我用是先用Link 生成EXE或COM文件之后(如Ring.exe). 在DOS 下用 Debug Ring.exe 在们-下 用T跟踪至 INT 21H,正确进入中断RING程序继续使用 T,但无法进入Ring中断程序,而是产生NOP的指令。
页: [1]
查看完整版本: 求救:下面程序为何进不了Ring中断子程序