鱼C论坛

 找回密码
 立即注册
查看: 2362|回复: 5

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

[复制链接]
发表于 2012-5-4 20:25:23 | 显示全部楼层 |阅读模式
3鱼币
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*4]
   pop ds:[0]
   push es:[9*4+2]
   pop ds:[2]
   
   mov word ptr es:[9*4],offset int9
   mov es:[9*4+2],cs
   
   mov ax,0b800h
   mov es,ax
   mov ah,'a'
s:mov es:[160*12+40*2],ah
   call delay
   inc ah
   cmp ah,'z'
   jna s
   mov ax,0
   mov es,ax
   push ds:[0]
   pop es:[9*4]
   push ds:[2]
   pop es:[9*4+2]
   
   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:[0]
   
   cmp al,1
   jne int9ret
   
   mov ax,0b800h
   mov es,ax
   inc byte ptr es:[160*12+40*2+1]
   
   int9ret:
   pop es
   pop bx
   pop ax
   iret
   
   code ends
   end dong

有太多不懂,
call dword ptr ds:[0]
这里CALL  ds:[0]的偏移不是到了标号int9的位置,这样不是死循环吗?
我想用单步来看运行过程可是
到 mov word ptr es:[9*4],offset int9
   mov es:[9*4+2],cs
这里就是出错, 未命名.jpg
求指点,最好详细些,谢谢了

最佳答案

查看完整内容

{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-4 20:25:24 | 显示全部楼层
{:1_1:}{:1_1:}{:1_1:}{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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*4]    ;将原来9号中断例程的位置保存起来
           pop ds:[0]
           push es:[9*4+2]
           pop ds:[2]
          
           cli         ;将IF置零,屏蔽其它可屏蔽的中断
           mov word ptr es:[9*4],offset int9  ;安放中断向量表
           mov es:[9*4+2],cs
           sti
          
           mov ax,0b800h
           mov es,ax    ;设置显示缓存区的起始地
           mov ah,'a'
        s: mov es:[160*12+40*2],ah
           call delay
           inc ah         ;转换字母
           cmp ah,'z'
           jna s
           mov ax,0
           mov es,ax
           push ds:[0]
           pop es:[9*4]
           push ds:[2]
           pop es:[9*4+2] ;将中断向量表中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:[0]   ;ds中保存了原来的int 9 中断处理程序。
                       ;此处是调用原来的int 9中断处理程序
          
           cmp al,1
           jne int9ret
          
           mov ax,0b800h
           mov es,ax
           inc byte ptr es:[160*12+40*2+1]
          
int9ret:
           pop es
           pop bx
           pop ax
           iret
   
code ends
end dong
;此程序好像不能单步调试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-5 23:23:21 | 显示全部楼层
呵呵。。看看。。学习啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-6 14:46:32 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-6 22:08:05 | 显示全部楼层
flying 发表于 2012-5-6 14:46
为什么不能单步调试?
直接运行的话,按下ESC也会跳出出错提示信息
这是怎么回事?

程序应该没错,我这可以运行。
至于为什么不能单步运行,我只提供个人见解:程序中修改了与键盘输入有关的int9中断程序,而单步执行时需要进行键盘输入,因而会产生错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-20 04:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表