鱼C论坛

 找回密码
 立即注册
查看: 3463|回复: 1

关于检测点15.1的问题

[复制链接]
发表于 2011-10-11 15:06:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
(2) 仔细分析程序中的主程序,看看有什么潜在的问题?
在主程序中,如果在设置执行设置int 9中断例程的段地址和偏移地址的指令之间发生了键盘中段,则CPU将转去一个错误的地址执行,将发生错误。找出这样的程序段,改写他们,排除潜在的问题。
书上是这么说的。看完题目后我是在开始保存原int 9程序的时候就设置了if=0。
在网上搜索了相关的答案,都是在设置新的int 9的时候设置if=0
相关代码
  1. assume cs:code

  2. stack segment

  3.      db 128 dup (0)

  4. stack ends

  5. data segment

  6.      dw 0,0

  7. data ends

  8. code segment

  9. start:   mov ax,stack

  10.      mov ss,ax

  11.      mov sp,128



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

  13.      mov ax,data

  14.      mov ds,ax



  15.      mov ax,0

  16.      mov es,ax



  17.      push es:[9*4]

  18.      pop ds:[0]

  19.      push es:[9*4+2]

  20.      pop ds:[2]



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

  22.      cli           ;设置IF=0屏蔽中断

  23.      mov word ptr es:[9*4],offset int9

  24.      mov word ptr es:[9*4+2],cs

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



  26. ;依次显示'a'~'z'

  27.      mov ax,0b800h

  28.      mov es,ax

  29.      mov ah,'a'

  30. s:   mov es:[160*12+40*2],ah ;第12行第40列

  31.      inc ah

  32.      cmp ah,'z'

  33.      jnb s



  34. ;将中断向量表中int 9中断例程的入口恢复为原来的地址

  35.      mov ax,0

  36.      mov es,ax



  37.      push ds:[0]

  38.      pop ss:[9*4]

  39.      push ds:[2]

  40.      pop es:[9*4+2]



  41. ;结束

  42.      mov ax,4c00h

  43.      int 21h



  44. ;循环延时,循环100000h次

  45. delay:   push ax

  46.      push dx

  47.      mov dx,1000h

  48.      mov ax,0

  49. delay1:  sub ax,1

  50.      sbb dx,0      ;(dx)=(dx)-0-CF

  51.      cmp ax,0

  52.      jne delay1

  53.      cmp dx,0

  54.      jne delay1

  55.      pop dx

  56.      pop ax

  57.      ret



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

  59. int9:    push ax

  60.      push bx

  61.      push es



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



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

  64.      pushf              ;标志寄存器入栈

  65.      call dword ptr ds:[0]  ;CS、IP入栈;(IP)=ds:[0],(CS)=ds:[2]



  66. ;如果是ESC扫描码,改变显示颜色

  67.      cmp al,1      ;和esc的扫描码01比较

  68.      jne int9ret        ;不等于esc时转移



  69.      mov ax,0b800h

  70.      mov es,ax

  71.      inc byte ptr es:[160*12+40*2+1]  ;将属性值+1,改变颜色



  72. int9ret:pop es

  73.      pop bx

  74.      pop ax

  75.      iret



  76. code ends

  77. end start
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-10-11 15:20:33 | 显示全部楼层
  1.      push es:[9*4]



  2.      pop ds:[0]



  3.      push es:[9*4+2]



  4.      pop ds:[2]







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



  6.      cli           ;设置IF=0屏蔽中断



  7.      mov word ptr es:[9*4],offset int9



  8.      mov word ptr es:[9*4+2],cs



  9.      sti     
复制代码
上例中,是在设置新的int 9中断时将if设置为0。如果在保存中发生中断,那保存的原int 9地址不就会出错?下面的还原也就会出错。麻烦高手讲一下!
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-4 09:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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