yourwafer 发表于 2013-3-31 15:08:33

15-4中断例程int9-代码运行不正常-自己写的却能很好的运行,找不出问题出在哪

;编程:在屏幕中间依次显示“a”~“z”,并可以让人看清。在显示的过程中,按下'Esc'键后,改变显示的颜色。

;对更改中断向量时间间隔内可能发生的中断状况作了进一步安全保障 cli ,sti的使用

;完整功能代码:

assume cs:code

stack segment
        db 128 dup (0)
stack ends

data segment
        dw 0,0
data ends

code segment
start:        mov ax,stack
        mov ss,ax
        mov sp,128
        mov ax,data
        mov ds,ax
        mov ax,0
        mov es,ax



        push es:
        pop ds:
        push es:
        pop ds:                ;将原来的int 9中断例程的入口地址保存在ds:0、ds:2单元中

        cli                        ;置屏蔽中断标志位IF=0

        mov word ptr es:,offset int9
        mov es:,cs        ;在中断向量表中设置新的int 9中断例程的入口地址

        sti                        ;撤消屏蔽,置屏蔽中断标志位IF=1

        mov ax,0b800h
        mov es,ax
        mov ah,'a'
    s:        moves:,ah
        call delay
        inc ah
        cmp ah,'z'
        jna s
        mov ax,0
        mov es,ax

        cli                        ;置屏蔽中断标志位IF=0

        push ds:
        pop es:
        push ds;
        pop es;           ;将中断向量表中int 9中断例程的入口恢复为原来的地址

        sti                        ;撤消屏蔽,置屏蔽中断标志位IF=1

        mov ax,4c00h
        int 21h

delay:        push ax
        push dx
        mov dx,2000h
        mov ax,0
s1:         sub ax,1
        sbb dx,0
        cmp ax,0
        jne s1
        cmp dx,0
        jne s1
        pop dx
        pop ax
        ret

;------以下为新的int 9中断例程--------------------

int9:        push ax
        push bx
        push es

        in al,60h

        pushf
        ;pushf
        ;pop bx
        ;and bh,11111100b
        ;push bx
        ;popf                        ;去掉了中断处理程序中没有意义的指令语句
        call dword ptr ds:         ;对int指令进行模拟,调用原来的int 9中断例程

        cmp al,1
        jne int9ret

        mov ax,0b800h
        mov es,ax
        inc byte ptr es:;属性增加1,改变颜色

int9ret:pop es
        pop bx
        pop ax
        iret

code ends
end start上面是习题代码
问题1:正常运行结束,但按下任意键后,dos就死掉了
问题2:当按键速度过快时,将会出现dos运行终止,并可能会关闭


以上错误,在我写的代码却没有出现,但我始终找不到问题出现在哪里。
我的代码如下
assume cs:codesg

data segment
      dw 16 dup (0)
data ends

stack segment
      dw 128 dup (0)
stack ends
codesg segment
    start:
      mov ax,stack
      mov ss,ax
      mov sp,128

      mov ax,data
      mov ds,ax

      mov ax,0
      mov es,ax

      push es:
      pop ds:
      push es:
      pop ds:

      mov ax,0
      mov es,ax
      cli
      mov word ptr es:,offset int9
      mov es:,cs
      sti

      ; call print_warn
      ; call print_a_z


      push ax
      push ds

      mov ax,0b800h
      mov ds,ax
      mov al,'a'
    mprint_lo:
      call delay
      mov ds:,al
      inc al
      cmp al,'z'

      jna mprint_lo

      pop ds
      pop ax
      ;ret



      cli

      push ds:
      pop es:
      push ds:
      pop es:
      sti
      mov ax,4c00h
      int 21h

    int9:
      push ax
      push ds
      push bx

      in al,60h


      pushf
      pushf
      pop bx
      and bh,11111100b
      push bx
      popf

      mov bx,data
      mov ds,bx
      call dword ptr ds:

      cmp al,1
      jne int9_ret
      mov ax,0b800h
      mov ds,ax
      inc byte ptr ds:
int9_ret:
      pop bx
      pop ds
      pop ax
      iret


    print_a_z:
      push ax
      push ds

      mov ax,0b800h
      mov ds,ax
      mov al,'a'
    print_lo:
      call delay
      mov ds:,al
      inc al
      cmp al,'z'

      jna print_lo

      pop ds
      pop ax
      ret

    ;--------------------------------------------
    print_warn:
      push ax
      push ds

      mov ax,0b800h
      mov ds,ax
      mov al,'a'
    warn_lo:
      call delay
      mov ds:,al
      inc al
      cmp al,'z'

      jna warn_lo

      pop ds
      pop ax
      ret


    delay:
      push ax
      push bx

      mov ax,4000
      mov bx,0

   delay_lo:
      sub bx,1
      sbb ax,0
      cmp bx,0
      jne delay_lo
      cmp ax,0
      jne delay_lo

      pop bx
      pop ax
      ret

codesg ends
end start

页: [1]
查看完整版本: 15-4中断例程int9-代码运行不正常-自己写的却能很好的运行,找不出问题出在哪