离丶dong子 发表于 2012-5-4 20:25:23

汇编15章安装int 9中断例程

assume cs:code
stack segment
db 128 dup(0)
stack ends
data segment
dw 0,0
data ends
code segment
dong: 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 word ptr es:,offset int9
   mov es:,cs
   
   mov ax,0b800h
   mov es,ax
   mov ah,'a'
s:mov es:,ah
   call delay
   inc ah
   cmp ah,'z'
   jna s
   mov ax,0
   mov es,ax
   push ds:
   pop es:
   push ds:
   pop es:
   
   mov ax,4c00h
   int 21h
   
   delay:
   push ax
   push dx
   mov dx,1000h
   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
   
   int9:push ax
   push bx
   push es
   
   in al,60h
   
   pushf
   pushf
   pop bx
   and bh,11111100b
   push bx
   popf
   
   call dword ptr ds:
   
   cmp al,1
   jne int9ret
   
   mov ax,0b800h
   mov es,ax
   inc byte ptr es:
   
   int9ret:
   pop es
   pop bx
   pop ax
   iret
   
   code ends
   end dong

有太多不懂,
call dword ptr ds:
这里CALLds:的偏移不是到了标号int9的位置,这样不是死循环吗?
我想用单步来看运行过程可是
到 mov word ptr es:,offset int9
   mov es:,cs
这里就是出错,
求指点,最好详细些,谢谢了

小糊涂仙 发表于 2012-5-4 20:25:24

{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}

hxs554f 发表于 2012-5-4 22:32:50

assume cs:code
stack segment
db 128 dup(0)
stack ends
data segment
dw 0,0
data ends
code segment
dong:mov ax,stack
       mov ss,ax
           mov sp,128
          
           mov ax,data
           mov ds,ax
          
           mov ax,0
           mov es,ax
          
           push es:    ;将原来9号中断例程的位置保存起来
           pop ds:
           push es:
           pop ds:
          
           cli         ;将IF置零,屏蔽其它可屏蔽的中断
           mov word ptr es:,offset int9;安放中断向量表
           mov es:,cs
           sti
          
           mov ax,0b800h
           mov es,ax    ;设置显示缓存区的起始地
           mov ah,'a'
        s: mov es:,ah
           call delay
           inc ah         ;转换字母
           cmp ah,'z'
           jna s
           mov ax,0
           mov es,ax
           push ds:
           pop es:
           push ds:
           pop es: ;将中断向量表中int 9中断例程入口恢复为原来的地址
          
           mov ax,4c00h
           int 21h
          
delay:
           push ax
           push dx
           mov dx,1000h
           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
          
int9:push ax
           push bx
           push es
          
           in al,60h;读取端口60h的数据,放入ax中
          
           pushf   ;将标志寄存器入栈
           pushf
           pop bx
           and bh,11111100b
           push bx
           popf      ;以上为将IF、TF置
          
           call dword ptr ds:   ;ds中保存了原来的int 9 中断处理程序。
                       ;此处是调用原来的int 9中断处理程序
          
           cmp al,1
           jne int9ret
          
           mov ax,0b800h
           mov es,ax
           inc byte ptr es:
          
int9ret:
           pop es
           pop bx
           pop ax
           iret
   
code ends
end dong
;此程序好像不能单步调试。

九墓 发表于 2012-5-5 23:23:21

呵呵。。看看。。学习啊。

flying 发表于 2012-5-6 14:46:32

hxs554f 发表于 2012-5-4 22:32 static/image/common/back.gif
assume cs:code
stack segment
db 128 dup(0)


为什么不能单步调试?
直接运行的话,按下ESC也会跳出出错提示信息
这是怎么回事?

hxs554f 发表于 2012-5-6 22:08:05

flying 发表于 2012-5-6 14:46 static/image/common/back.gif
为什么不能单步调试?
直接运行的话,按下ESC也会跳出出错提示信息
这是怎么回事?

程序应该没错,我这可以运行。
至于为什么不能单步运行,我只提供个人见解:程序中修改了与键盘输入有关的int9中断程序,而单步执行时需要进行键盘输入,因而会产生错。
页: [1]
查看完整版本: 汇编15章安装int 9中断例程