鱼C论坛

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

15章外中断例子有疑问

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

stack segment
        db 128 dup ('0')
stack ends

data segment
        db 128 dup('0')
data ends

code segment
start:
                ;0.段初始化
                mov ax,stack
                mov ss,ax
                mov sp,128
                
                mov ax,data
                mov ds,ax
                
                ;3.将程序安装到内存
                push cs
                pop ds
                mov si,offset bk9
                mov ax,0
                mov es,ax
                mov di,204h
                mov cx,offset bk9end - offset bk9
                cld
                rep movsb
                ;1.先保存原9号中断例程入口,不能存到本程序中,可指定到某内存位置
                mov ax,0
                mov es,ax
                push es:[9h*4+2]
                pop es:[202h]
                push es:[9h*4]
                pop es:[200h]
                ;2.改写入口地址
                cli
                mov word ptr es:[9*4+2] , 0
                mov word ptr es:[9*4],204h
                sti

                
                ;4.程序结束
                mov ax,4c00h
                int 21h
;----以下是中断处理程序-----
bk9:        
                push ax
                push bx
                push cx
                push es
                ;1.读取60号端口
                in al,60h
                pushf  ;模拟原9号中断时,注意pushf位置
                ;2.执行原9号中断,注意位置
                ;下三句错误
                ;mov bx,0
                ;mov es,bx        
                ;call dword ptr es:[200h]
                call dword ptr cs:[200h]
                ;3.新加的处理
                cmp al,3bh
                jne bk9ret
                mov ax,0b800h
                mov es,ax
                mov bx,1
                mov cx,2000
  s1: add byte ptr es:[bx],1
                add bx,2
                loop s1
bk9ret:
                pop es
                pop cx
                pop bx
                pop ax
                iret
bk9end:nop
;----以上是中断处理程序-----
code ends
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-11-19 10:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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