;这边我们要设计一个中断程序,为7CH中断 ;这边是为显示输出提供如下功能子程序 ;1、清屏 ;2、设置前景色 ;3、设置背景色 ;4、向上滚动一行 ;这边首先整体的构思一下,我们假设中断例程写好,名为 ;SCREENSET,那么我们先安装代码指令,然后将程序的入口地址 ;放到0000:7CH*4-0000:7CH*4+2中,中断例程代码指令放到 ;0000:0200H中至于中断例程之程序,书上已经是有的了,但是 ;第四个功能好像是有点问题了,这边我们自己可以改过 DATAS SEGMENT DATAS ENDS STACKS SEGMENT DB 128 DUP (0) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX ;先安装程序吧 ;安装中断例程代码指令 MOV SI,OFFSET SCREENSET MOV DI,200H PUSH CS POP DS MOV AX,0 MOV ES,AX MOV CX,OFFSET SCREENSETEND- OFFSET SCREENSET CLD REP MOVSB ;设置中断例程入口地址 MOV WORD PTR ES:[7CH*4],200H MOV WORD PTR ES:[7CH*4+2],0 MOV AH,4CH INT 21H SCREENSET: ;参数描述:将子程序的功能号放到AH中 ;0 号功能是清屏 ;1 号功能:设置前景色 ;2 号功能:设置背景色 ;3 号功能:向上滚动一行 ;这边我们设置一个功能号查询地址表 ;这边应该说明一下一个挺大的问题的 ;因为这边我们把程序安装下去的时候 ;我们的TABLE表示的表示的内存地址就根本是无效的吗 ;在中端例程当中,我们需要的TABLE的位移应该是此中断例程 ;中的入口偏移地址+JMP SHORT SET指令的长度才是啊!所以这边我们试着 ;用一下ORG功能,但是使用起来真的有问题,现在还不是懂得使用的时候了 ;其实现在有一个很大的问题是,现在 JMP SHORT SET ;DW SUB1,SUB2,SUB3,SUB4 ;这个的问题真的是很大了, ;因为我们安装程序的时候,它对应的偏移地址是向队员原来的DATAS的,但是 ;我们调用中断例程的时候,他已经是相对于CS了,这个有点乱了,我们现在能 ;解决这个问题的看来是只有用相对位移了,不然问题真的是会很大的 ;这边的用call调用就可以是问题得到解决,这难道是说明CALL调用的时候也是根据偏移量吗 ;其实我们现在也有一个办法使用直接定址表,既是我们要直接的存放原来TABLE标记的段地址 ;和便宜地址到中断内存地址的前面,然后是在中端例程中找出TABLE的偏移地址和段地址 ;设置此段地址为数据段,TABLE为其中的数据段,然后就可以使用数据定位向量表了 ; SET: CMP AH,0 JE DO0 CMP AH,1 JE DO1 CMP AH,2 JE DO2 CMP AH,3 JE DO3 DO0: CALL SUB1 IRET DO1: CALL SUB2 IRET DO2: CALL SUB3 IRET DO3: CALL SUB4 IRET ;PUSH BX ; ;CMP AH,3 ;JA SRET ;MOV BL,AH ;MOV BH,0 ;ADD BX,BX ; ;CALL WORD PTR CS:[BX+202H] ; ;SRET: ;POP BX ;IRET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUB1: ;0号中断功能 PUSH AX PUSH CX PUSH ES PUSH DI MOV CX,2000 MOV AX,0B800H MOV ES,AX MOV DI,0 SUB1S: MOV BYTE PTR ES:[DI],' ' ADD DI,2 LOOP SUB1S POP DI POP ES POP CX POP AX RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUB2: ;1号中断功能 ;参数说明,AL设置前景色颜色属性范围是0-7 PUSH AX PUSH ES PUSH DI MOV BX,0B800H MOV ES,BX MOV DI,1 MOV CX,2000 MOV BL,ES:[DI] ;保持原来的背景色不变并且改变前景色 AND BL,11111000B OR AL,BL SUB2S: MOV ES:[DI],AL ADD DI,2 LOOP SUB2S POP DI POP ES POP BX RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUB3: ;2号中断功能 ;参数说明 AL设置背景色属性范围是{0,10,20,30,40,50,60,70} PUSH AX PUSH ES PUSH DI MOV BX,0B800H MOV ES,BX MOV DI,1 MOV CX,2000 MOV BL,ES:[DI] ;保持原来的前景色不变并且改变背景色 AND BL,10001111B OR AL,BL SUB3S: MOV ES:[DI],AL ADD DI,2 LOOP SUB3S POP DI POP ES POP BX RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SUB4: ;3号中断功能 PUSH AX PUSH CX PUSH DI PUSH SI PUSH ES MOV DI,0 MOV SI,160 MOV AX,0B800H MOV ES,AX MOV DS,AX MOV CX,24 SUB4S: PUSH CX MOV CX,80 CLD REP MOVSW ;运行的时候,DI和SI都是会自动增加的 ;所以是没有必要担心的 POP CX LOOP SUB4S ;清空最有一行的内容 MOV CX,160 SUB4S0: MOV BYTE PTR ES:[DI],' ' ADD DI,2 LOOP SUB4S0 POP ES POP SI POP DI POP CX POP AX RET SCREENSETEND: NOP CODES ENDS END START 这边对功能好查询地址表的方法有待进一步看看