鱼C论坛

 找回密码
 立即注册
查看: 2280|回复: 6

实验十五的一个问题

[复制链接]
发表于 2012-5-7 18:48:22 | 显示全部楼层 |阅读模式
1鱼币
int9: push ax
  push bx
  push cx
  push es
  
  
  in al,60h

  
  pushf
  
  
  call dword ptr cs:[200h]
  
  cmp al,9eh
  
  jne int9ret
  mov ax,0b800h
  mov es,ax
  mov bx,0
  
  mov cx,2000
s:  mov byte ptr es:[bx],41h
  add bx,2
  loop s

安装新的int 9中断例程中,为什么要 call dword ptr cs:[200h],为什么要是CS:[200h]呢?我用debug看过cs:[200h]所对应的数据是00 00 00 00 00 00 00。。。。因此,它应该跳转到0:0的地址中执行除法溢出的中断例程啊,为什么解释是只把(CS)=0呢??
求解啊

最佳答案

查看完整内容

这里 mov ax,0 mov es,ax mov si,offset int9 ;设置ds:si指向源地址 mov di,204h ;设置es:di指向目标地址 mov cx,offset int9end-offset int9 ;设置cx为传输长度 cld ;设置传输方向为正 rep movsb 你把中断例程安在0:204h处,当CPU处理中断时,将cs置0,IP置204h,跳到此处执行你的中断例程,执行到call dword ptr cs:[200h]时,此时cs仍为0,将 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-5-7 18:48:23 | 显示全部楼层
本帖最后由 hxs554f 于 2012-5-8 21:23 编辑

这里
      mov ax,0
      mov es,ax
      mov si,offset int9     ;设置ds:si指向源地址
      mov di,204h            ;设置es:di指向目标地址
      mov cx,offset int9end-offset int9    ;设置cx为传输长度
      cld                ;设置传输方向为正
      rep movsb
你把中断例程安在0:204h处,当CPU处理中断时,将cs置0,IP置204h,跳到此处执行你的中断例程,执行到call dword ptr cs:[200h]时,此时cs仍为0,将IP置200h(保存了原来的中断例程)后,执行原来的中断例程。debug看cs:[200]时应该先运行exe,在进入debug查看0:200处(我猜测你是查看了cs:[200]处,进入debug后cs不是0).
1.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-7 19:04:35 | 显示全部楼层
只能说我的汇编还没学好,爱莫能助啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-7 21:43:46 | 显示全部楼层
难道又没大牛解决我的问题吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-5-8 13:07:18 | 显示全部楼层
cs:[200h]中放的是原来中断例程的地址。在此之前你应该有把原int 9中断例程的起始偏移地址保存在这里。
另外,先运行exe在进入debug查询cs:[200h]才能看到正确的内容。
最后,建议下次把所有源码都贴出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-8 13:40:17 | 显示全部楼层

assume cs:code

stack segment

     db 128 dup (0)

stack ends

code segment

start:   mov ax,stack

     mov ss,ax

     mov sp,128

     push cs

     pop ds

     mov ax,0

     mov es,ax

     mov si,offset int9     ;设置ds:si指向源地址

     mov di,204h            ;设置es:di指向目标地址

     mov cx,offset int9end-offset int9    ;设置cx为传输长度

     cld                ;设置传输方向为正

     rep movsb

;将原来的int 9中断例程的入口地址保存在ds:200、ds:202单元中

     push es:[9*4]

     pop es:[200h]

     push es:[9*4+2]

     pop es:[202h]

;在中断向量表中设置新的int 9中断例程的入口地址

     cli                ;设置IF=0屏蔽中断

     mov word ptr es:[9*4],204h

     mov word ptr es:[9*4+2],0

     sti                ;设置IF=1不屏蔽中断

;结束

     mov ax,4c00h

     int 21h

;新的int 9中断例程

int9:    push ax

     push bx

     push cx

     push es

     in al,60h          ;从端口60h读出键盘输入

;对int指令进行模拟,调用原来的int 9中断例程

     pushf                  ;标志寄存器入栈

     call dword ptr cs:[200h]    ;CS,IP入栈,(IP)=cs:[200h],(CS)=0

;如果是A断码,改变当前屏幕的显示字符

     cmp al,9eh             ;和A的断码(1eh+80h)比较

     jne int9ret            ;不等于A时转移

     mov ax,0b800h

     mov es,ax

     mov bx,0

     mov cx,2000

s:   mov byte ptr es:[bx],41h    ;将A的ASCII码写入,改变字符

     add bx,2

     loop s

int9ret:pop es

     pop cx

     pop bx

     pop ax

     iret

int9end:nop

code ends

end start



代码就是上面的,但是我有个问题,就是CS:[200h]中,我好像都没把中断例程放在cs段中啊,我只是放在0:200h的地址中而已,而我查看了cs:[200]中的值是00 00 00 00 00......求讲解一下思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-5-8 23:05:39 | 显示全部楼层
hxs554f 发表于 2012-5-8 21:21
这里
      mov ax,0
      mov es,ax

噢,经你这么一说我突然恍然大悟啦,谢谢啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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