鱼C论坛

 找回密码
 立即注册
查看: 2945|回复: 2

15章外中断例子有疑问

[复制链接]
发表于 2016-4-14 11:32:40 | 显示全部楼层 |阅读模式
1鱼币
  1. ;任务,一个新的9号中断处理例程,按F1改变颜色,其它键无变化
  2. assume cs:code , ds:data , ss:stack

  3. stack segment
  4.         db 128 dup ('0')
  5. stack ends

  6. data segment
  7.         db 128 dup('0')
  8. data ends

  9. code segment
  10. start:
  11.                 ;0.段初始化
  12.                 mov ax,stack
  13.                 mov ss,ax
  14.                 mov sp,128
  15.                
  16.                 mov ax,data
  17.                 mov ds,ax
  18.                
  19.                 ;3.将程序安装到内存
  20.                 push cs
  21.                 pop ds
  22.                 mov si,offset bk9
  23.                 mov ax,0
  24.                 mov es,ax
  25.                 mov di,204h
  26.                 mov cx,offset bk9end - offset bk9
  27.                 cld
  28.                 rep movsb
  29.                 ;1.先保存原9号中断例程入口,不能存到本程序中,可指定到某内存位置
  30.                 mov ax,0
  31.                 mov es,ax
  32.                 push es:[9h*4+2]
  33.                 pop es:[202h]
  34.                 push es:[9h*4]
  35.                 pop es:[200h]
  36.                 ;2.改写入口地址
  37.                 cli
  38.                 mov word ptr es:[9*4+2] , 0
  39.                 mov word ptr es:[9*4],204h
  40.                 sti

  41.                
  42.                 ;4.程序结束
  43.                 mov ax,4c00h
  44.                 int 21h
  45. ;----以下是中断处理程序-----
  46. bk9:       
  47.                 push ax
  48.                 push bx
  49.                 push cx
  50.                 push es
  51.                 ;1.读取60号端口
  52.                 in al,60h
  53.                 pushf  ;模拟原9号中断时,注意pushf位置
  54.                 ;2.执行原9号中断,注意位置
  55.                 ;下三句错误
  56.                 ;mov bx,0
  57.                 ;mov es,bx       
  58.                 ;call dword ptr es:[200h]
  59.                 call dword ptr cs:[200h]
  60.                 ;3.新加的处理
  61.                 cmp al,3bh
  62.                 jne bk9ret
  63.                 mov ax,0b800h
  64.                 mov es,ax
  65.                 mov bx,1
  66.                 mov cx,2000
  67.   s1: add byte ptr es:[bx],1
  68.                 add bx,2
  69.                 loop s1
  70. bk9ret:
  71.                 pop es
  72.                 pop cx
  73.                 pop bx
  74.                 pop ax
  75.                 iret
  76. bk9end:nop
  77. ;----以上是中断处理程序-----
  78. code ends
  79. end start
复制代码

一、按下图移动代码位置后,程序能编译不能运行。
1.png
二、按下图白框的写法,能编译不能运行。
2.png
请教各位,为什么会这样? 我用的虚拟机 dos7 环境

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-4-14 15:29:05 | 显示全部楼层
第一个位置问题,按书上代码移动位置后,可以运行。对比了半天,发现自己多了个data段,把它删掉,就也可以移动位置了。可为什么会这样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-4-14 17:23:34 | 显示全部楼层
图1、图2都可以运行,F1正常
win7+DOSBox 0.74
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 10:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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